小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
主从复制
2.8以前的版本只有完整重同步(SYNC)的方式,效率十分低。从2.8开始,使用PSYNC代替SYNC来执行复制时的同步操作。
PSYNC部分重同步功能由一下三个部分构成:
- 主从服务器的复制偏移量,可以看作是已复制的字节数
- 主服务器的复制积压缓冲区
- 服务器的运行ID
如果offset偏移量之后的数据仍然存在于复制积压缓冲区里,那么主服务器对从服务器执行部分重同步操作;否则主服务器将对从服务器执行完整重同步操作。
第一次复制时,从发送psync ? -1;否则发送psync <runid> <offset>
主发送
+fullresync <runid> <offset>+continue-ERR
同步后,主从服务器进入命令传播阶段。
心跳检测
在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送REPLCONF ACK <replication_offset>,其中replication_offset是当前从服务器的复制偏移量。
作用:
- 检测主从服务器的网络连接状态
- 辅助实现min-slave配置选项。min-slaves-to-write, min-slaves-max-lag, 可以防止主服务器在不安全的情况下执行写命令。
- 检测命令丢失
Sentinel
检测主观下线状态
默认情况下,sentinel每秒会向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他sentinel)发送ping命令,并通过ping命令来判断实例是否在线。
当主服务器down-after-milliseconds毫秒内,连续向sentinel返回无效回复,那么sentinel会主观认为主服务器已经下线
检查客观下线状态
向同样监视主服务器的其他sentinel询问,看它们是否也认为主服务器已经下线。当认为主服务器下线的sentinel超过quorum时,那么该sentinel就会认为主服务器已经进入客观下线状态。
选举领头sentinel
先到先得(看谁发送的命令更快到达)
半数以上的支持。
sentinel会向其他sentinel发送带有自己runid的命令,sentinel在第一次接受到命令时会将runid的sentinel作用自己的局部领头sentinel。如果一个sentinel获得超过半数的sentinel的投票,那么它就成为领头sentinel。
领头sentinel的产生需要半数以上sentinel的支持
如果在给定时限内,没有选举出sentinel,那么将在一段时间后再次选举,直到选出领头sentinel。
故障转移
- 从从服务器中挑选出一个将其转换为主服务器
- 将其他从服务器变为新的主服务器的从服务器
- 将已下线的主服务器设置为新的主服务器的从服务器
挑选原则:
- 删除处于下线状态的从服务器
- 删除所有最近5秒没有回复过领头的从服务器
- 删除与主服务器过早断开的从服务器,从而保证新的主服务器的数据是比较新的
- 从剩下的从服务器中挑选优先级最高的从服务器。