所谓主从同步是指:将 master 节点数据同步到 slave 节点。这样做的好处有以下三点:
- 减轻 master 节点的压力,每次读操作在 slave 节点执行,写操作在 master 节点执行
- 可以将排序等耗费资源更大的操作放在 slave 节点去做,减轻 master 节点的压力
- master 节点可以不用配置持久化 ,减轻压力,持久化配置到某一个 slave 节点就可以
当使用主从同步,并且 master 节点没有配置持久化时,一定要注意关闭 master 节点自动重启,否则一旦 master 节点挂掉并迅速重启,此时 master 节点数据为空,slave 节点主从同步后数据也为空,导致客户端所有读请求都无法正常处理
根据同步的程度不同,主从同步可分为以下两种:
- 全量同步:master 节点同步所有数据到 slave 节点
- 增量同步:master 节点同步增量数据到 slave 节点
一般 slave 节点第一次连接到 master 节点时进行全量同步,之后断后并重连后每次进行增量同步。具体执行策略是:每次先尝试执行增量同步,增量同步不行时进行全量同步
全量同步过程如下:
- slave 连接 master 节点,发送 SYNC 命令
- master 节点收到 SYNC 命令后,执行 BGSAVE 命令生成 rdb 文件
- BGSAVE 命令执行完毕后,master 节点给对应 slave 节点发送 rdb 快照
- slave 收到 rdb 文件后丢弃所有旧数据,重新加载新数据
- master 节点 rdb 发送完毕后,继续发送写缓冲池中的写命令(生成 rdb 文件期间的写命令)
- slave 节点 rdb 文件加载完毕后,开始接受客户端请求并执行 master 发送的写命令
增量同步类似上述步骤 6:master 节点收到命令后发送相同的命令至 slave 节点。此时 master 节点对每个 slave 节点维护同步标识,slave 每次同步会携带标识和上次同步的位置,之后从这个位置向后同步并更新标识即可
这里需要区分增量同步不步骤 6 的状态:步骤 6 是说 master 节点同步收到的新写命令至 slave 节点,而增量同步是说 slave 节点之前已经同步过,连接断开又重连后,无须全量同步,只需同步增量即可
Redis 主从同步的特点如下:
- 一个 master 节点可以有多个 slave 节点,一个 slave 节点也可以有多个 slave 节点
- 主从同步过程中 master 节点完全异步,同步期间可正常处理客户端命令
- 主从同步过程中 slave 节点完全异步,同步期间通过旧数据响应客户端请求,可以通过配置 redis.conf 使 slave 节点同步期间不处理客户端请求,此时返回错误。同步完成后加载数据到内存是同步操作,此时客户端请求被阻塞
- slave 节点默认不允许写数据,可以通过配置打开,这部分数据重启就会消失,一般用来记录临时数据
- 多个 slave 节点同时连接同一个 master 节点并执行全量同步时,master 节点只维护一份写入缓冲区
- redis 2.8 之后支持无磁盘同步,适合磁盘 IO 性能差,但网络环境好的场景
- redis 2.8 之后可配置最小 slave 节点数,否则不执行写命令
主从同步的配置:
// slave 节点配置
slaveof IP PORT
// redis 5.0 之后 slaveof 替换为 replicaof
replicaof IP PORT
// 是否开启无磁盘同步
repl-diskless-sync
// 主从同步的延迟时间,方便更多 slave 节点连接,公用同一个写入缓冲池
repl-diskless-sync-delay
// 控制是否只读
slave-read-only
完整同步全过程:
- slave 节点和 master 节点建立 tcp 连接
- slave 节点发送 ping 命令判断 socket 状态是否正常,能否正常处理请求
- slave 节点发送 AUTH password 命令验证身份
- 验证无误后,slave 节点发送自身监听的端口号,master 将该端口号记录在对应 slave 连接的 slave_listening_port 属性中
- slave 节点发送 slave_announce_ip(如果配置),master 将该 IP 记录在对应 slave 连接的 slave_ip 属性中
- slave 节点发送 CAPA(capabilities)命令告诉 master 自己具备主从同步能力,master 将它记录在对应 slave 连接的 slave_capa 属性中
- slave 节点发送 PSYNC 命令, master 判断执行全量还是增量同步
- 完成同步后进入命令传播阶段,master 一直将自己执行的写命令发送给 slave,slave 自身执行保存数据一致
上述步骤 5 发送公网 ip,防止 master 节点返回时内网 ip,找不到对应的 slave 节点