建立主从连接
【命令】replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号>
形成主服务器节点和从服务器节点的关系,也可以让从节点成为二级主节点分摊压力。
【命令】psync
进行数据同步命令,会携带 runID 和 offset。
从节点建立主从关系或断开重连后自动发出,主节点会做出回应。
【命令】folk()
创建子进程。
【命令】bgsave
主节点节点异步持久化,生成RDB文件。
主节点通过folk()创建子进程来生成RGB文件发送给从节点,从节点利用RDB文件内的全量数据日志完成首次数据同步。
【参数】runID
主服务器的 runID。每个 Redis 服务器在启动时都会自动生产一个随机的 ID 来唯一标识自己。
【参数】offset
表示复制的进度,第一次同步时,其值为 -1。从节点断线重连增量同步时值不为-1。
在从节点向主节点发送的psync命令中带有runID和offset两个参数。
主从数据复制
Buffer 缓冲区
【结构】replication buffer
第一次同步期间的新数据,命令传播即连接中的新数据,重连后增量数据都会存在 buffer 中,每个节点都分配一个,从节点收到 buffer 中的数据后就执行来实现主从一致。
当 replication buffer 满了,会导致连接断开,删除缓存,从节点重新连接,重新开始全量复制。
【结构】repl backlog buffer
增量同步,环形缓冲区,主节点记录近期的数据,(从节点重连后差距会放入replication buffer增量同步),一个主节点一个
当 repl backlog buffer 满了,因为是环形结构,会直接覆盖起始位置数据。
【参数】repl-backlog-size
repl backlog buffer大小。
【参数】master_repl_offset
主节点接收写命令的进度信息。
【参数】slave_repl_offset
从节点复制写命令的进度信息。
replication offset = master_repl_offset - slave_repl_offset,能得到从节点和主节点间的复制进度差值。
主从数据安全
防止主节点失联的数据丢失
主节点失联被哨兵发现后,会推举新的主节点,但这过程中如果客户端还在给原主节点写入数据,原主节点会被降级为从节点并删除数据。
【参数】min-slaves-to-write x
主节点必须要有至少 x 个从节点连接,如果小于这个数,主节点会禁止写数据。
防止异步复制数据丢失
【参数】min-slaves-max-lag x
主从数据复制和同步的延迟不能超过 x 秒,如果主从同步的延迟超过 x 秒,主节点会禁止写数据。
哨兵机制
建立哨兵集群
【命令】redis-sentinel <.conf>
启动Sentinel哨兵
【配置】sentinel monitor <master-name> <ip> <redis-port> <quorum>
conf配置文件中设置哨兵所在集群的主节点、主节点IP、主节点端口、阈值quorum。哨兵通过主节点接入集群后通过主节点自带的__sentinel__:hello发布订阅频道发现其他哨兵并相互通信。
【命令】INFO
哨兵接入集群后向主节点发送INFO命令,主节点将从节点信息发送给哨兵,这样哨兵可以获取集群中所有主从节点的信息。
正常情况哨兵每隔10s发送一次INFO命令来检测集群的情况,当选举新的主节点后关键时期会每隔1s秒监控集群的情况。
节点下线
【命令】PING
哨兵会每隔1s给节点发送PING命令,主节点收到后会发生PONG,若主从节点超过规定时限未返回消息,哨兵判定节点主观下线。
所谓主观,是指节点下线可能只是单个哨兵节点观测到的偶然现象,并不能确定节点是否故障。
【参数】down-after-milliseconds
规定时限,conf中设置
【参数】quorum
判定节点客观下线的阈值。
所谓客观,当哨兵集群中多个哨兵(达到quorum阈值)认为节点确实下线,称为客观下线。
哨兵leader
如果是主节点下线,就必须进行主从切换,选出新的主节点。负责主持主从切换的哨兵,称为leader,相当于国家元首与政府首脑的关系。
【命令】is-master-down-by-addr
发现主节点主观下线的哨兵会发送该命令通知其他哨兵,让他们判断主节点是否的确下线,如果其他节点赞成下线的票数超过quorum阈值,该哨兵成为leader,负责主持主从切换相关事宜。
可能同时有多个哨兵发现主节点下线,此时就看谁手速快,其他节点只会投一次票,收到一次投票请求后就会拒绝再次投票。
每个leader候选哨兵都会先给自己一票,在哨兵实例也可能故障时,设置哨兵数量和quorum阈值就比较关键了。
主从故障转移
【参数】slave-priority
配置项,设置从节点的优先级。主节点下线,哨兵leader会在剩下的活从节点中选出新的主节点。依次考虑从节点的优先级slave-priority(越高)、复制进度slave_repl_offset(越接近master_repl_offset)、runID(越小)。
【命令】SLAVEOF no one
哨兵leader向选中的从节点发生该命令,提请他成为新的主节点,并每隔1s发送一次INFO命令检测集群的情况,确保该节点已顺利成为新的主节点。
【命令】SLAVEOF
哨兵leader勒令原属已下线的主节点的从节点重新成为新主节点的从节点。
哨兵会继续监视原主节点,待其重新上线后发送该命令使其成为新主节点的从节点。
主从切换过程中的重要事件信息会以发布订阅的模型同步给客户端,客户端可以时刻关注这些动态并及时变更读写节点的IP和端口