1、配置
1、建立复制
建立复制前会删除全部数据。
配置复制的方式有三种;
- 配置文件中加入
slaveof {masterHost} {masterPort}
。 - redis 启动命令后加入
slaveof {masterHost} {masterPort}
。 - 直接执行命令
slaveof {masterHost} {masterPort}
。
2、断开复制
在从节点执行命令 slaveof no one
来断开复制。所谓切主操作,就是先断开复制,然后再建立复制。
3、安全性
为了安全性,一般都会在主节点上设置 requirepass 123456
,所有客户端访问必须使用 auth 123456
验证。因此从节点开启复制时,也要设置 masterauth 123456
。
4、只读
默认情况下,从节点使用 slave-read-only=yes
配置为只读模式。由于已经开启了复制,建议从节点保持只读模式。
5、传输延迟
主从节点之间复制数据,肯定会有延迟。
redis 提供了 repl-disable-tcp-nodelay
参数用于关闭 TCP_NODELAY,默认关闭。
- 当关闭时,主节点的数据无论大小都会发送到从节点,这样就降低了延迟,但增加了带宽。
- 当开启时,主节点会合并较小的 TCP 数据包,从而节省带宽。
2、拓扑
主要有三种;一主一从,一主多从,树状主从。
- 一主一从: 最简单的结构,一般只在 从节点上开启 AOF 操作。
- 一主多从: 用于读多写少、读写分离的场景
- 树状主从: 从节点不但可以复制主节点的数据,还可以作为其他的节点的主节点。
3、原理
1、复制过程
- 执行
slaveof {masterHost} {masterPort}
命令后,保存主节点信息。 - 从节点每秒运行定时任务维护复制逻辑,当发现新的主节点后,建立连接。
- 发送 ping 命令,主要是检查网络是否可用和是否可以处理命令(可能主节点阻塞了)。
- 权限验证,
requirepass
和masterauth
是否匹配。 - 同步数据集,分为全量同步和部分同步。
- 命令持续复制,新的命令持续发给从节点。
2、数据同步
同步过程分为全量复制和部分复制。
- 参与主从复制的节点都会维护自身复制偏移量。命令
info
中master_repl_offset
和slave_repl_offset
。 - 复制积压缓冲区,主节点把命令发送从节点,还会把命令写入复制积压缓冲区,这个用于部分复制和命令丢失的场景。命令
info
中repl_backlog_*
。 - 主节点运行 ID,用来唯一识别 Redis 节点,当运行 ID 变化了,从节点将做全量复制了。节点重启了,运行 ID 也会变化。可以执行命令
debug reload
来重新加载并保持运行 ID 不变,但是会阻塞当前 Redis。 命令info
中run_id
。