当前位置:首页 > 问答 > 正文

Redis主从复制怎么弄,主从配置那些事儿简单聊聊

说白了,Redis的主从复制,就像是一个老师带着一群学生,老师(主节点)写什么,学生(从节点)就跟着抄什么,目的是为了备份数据,万一老师生病了(主节点宕机),能有个学生立刻顶上去,保证课堂(服务)不中断,这事儿弄起来其实不复杂,咱们一步步说。

你得有个Redis

你得先安装好Redis,这个就不多说了,假设你已经在两台或多台服务器上装好了Redis,我们管其中一台叫主库(Master),其他的叫从库(Slave)。

最省事的配置方法:运行时动态改

Redis配置起来很灵活,最简单的方式是不用动配置文件,直接在从库的Redis命令行里操作,你用redis-cli连上准备当从库的那个Redis服务,然后执行这么一句命令:

SLAVEOF <主库的IP地址> <主库的端口号>

你的主库IP是192.168.1.100,端口是默认的6379,那你就在从库上执行 SLAVEOF 192.168.1.100 6379

执行完这一句,神奇的事情就发生了,这个从库会立刻清空自己原来的所有数据(如果有的话),然后屁颠屁颠地去找主库,开始同步数据,你可以在主从库上分别用 info replication 命令查看状态,如果看到从库的状态显示为“online”,主库下面挂了这个从库的地址,那就说明同步成功了,以后主库有任何数据写入,都会自动同步到这个从库来。

这种方法的好处是快,不用重启服务,但有个缺点:一旦你这个从库重启了,刚才的配置就没了,又变回一个独立的Redis了,这通常用于临时调试,生产环境我们一般用下面这种更稳当的方法。

一劳永逸的方法:改配置文件

想让从库的身份永久生效,就得修改它的配置文件,通常是 redis.conf

  1. 找到并编辑从库的配置文件:用编辑器打开从库服务器上的 redis.conf 文件。
  2. 配置主库信息:在文件里找到 # replicaof <masterip> <masterport> 这一行,这行开头有个,表示是注释,不起作用,你把它改成:
    replicaof 192.168.1.100 6379

    (注意:在旧版本的Redis中,这个指令可能叫 slaveof,新版本都统一叫 replicaof 了,意思一样。)

  3. 设置主库密码(如果需要):如果你的主库设置了密码(通过 requirepass 配置项),你必须在从库的配置文件中告诉从库密码是多少,否则它连不上主库,找到 # masterauth <master-password> 这一行,改成:
    masterauth 你的主库密码
  4. 保存并重启从库:保存配置文件,然后重启从库的Redis服务。

这样,从库每次启动都会自动去连接主库并同步数据,这就非常稳妥了。

配置完了,会发生啥?

当你配置好之后,整个同步过程分为两步走,根据从库的数据新旧程度,主库会采取不同的策略(根据Redis官方文档的说明)。

  1. 全量同步(第一次握手或者数据差太远时):如果从库是全新的,或者落后主库太多数据了,主库就会启动一个“全量同步”,简单说,就是主库会对自己的当前数据状态拍一个快照(生成一个RDB文件),然后把整个快照文件发给从库,从库收到后,会清空自己的旧数据,再把这个快照文件加载进来,这个过程如果数据量大,会比较耗时,而且会消耗主库的CPU和网络带宽。

  2. 增量同步(正常运行时):全量同步完成后,主从之间就进入“增量同步”模式了,主库每执行一个会让数据变化的命令(比如set、del等),都会把这个命令同时存到一个叫做“复制积压缓冲区”(replication backlog)的队列里,主库会实时地把这个队列里的新命令发送给从库,从库再执行一遍,这样双方的数据就始终保持一致了,这个方式非常轻量且快速。

需要注意的几个坑

  • 网络要通畅:主从之间网络不好是万恶之源,如果网络断的时间太长,从库落后主库的数据量超过了那个“复制积压缓冲区”的大小,那么从库就连不上了,只能再次进行耗时的全量同步,保证主从网络稳定和适当调大 repl-backlog-size 参数很重要。
  • 从库是只读的:默认情况下,从库是只读的(slave-read-only 配置为yes),你不能直接在从库上写数据,否则会导致主从数据不一致,这个设置一般不要改。
  • 主库挂了怎么办? 这就是我们做主从的目的之一,主库挂掉后,你需要手动(或者用哨兵Sentinel工具自动)选择一个从库,把它“晋升”为新的主库,晋升的方法就是在这个从库上执行 SLAVEOF NO ONE 命令,让它脱离从属关系,变成主库,然后再把其他从库重新指向这个新的主库。
  • 密码别忘啦:就像前面说的,主库有密码的话,从库配置里一定要写对 masterauth,这是个常见的踩坑点。

配置Redis主从复制,核心就是两步:1. 在从库指明老大(主库)是谁;2. 确保从库能连上老大,用命令行方式是临时玩玩,改配置文件才是正道,配置好后,理解它背后全量和增量同步的原理,能帮你更好地排查可能遇到的问题,这事儿不难,动手试一次就全明白了。

Redis主从复制怎么弄,主从配置那些事儿简单聊聊