1、Redis如何进行主从同步(复制)
为了解决旧版本复制功能在处理断线重复复制的情况,redis从2.8版本开始使用PSYNC命令代替SYNC命令来执行复制时同步操作。具体流程如下:
①执行复制的双方——主服务器和从服务器会分别维护一个复制偏移量,每次主服务器发送数据时都会带上偏移量。
②同时主服务器维护一个固定长度的先出先进的复制积压缓冲区,主服务器在发送数据给从服务器时同步往缓冲区写入数据。
③当从服务器重联的时候判断偏移量之后的数据是否存在于缓冲区中,如果存在则采用部分同步操作,如果不存在则采用完整同步操作
2.哨兵(Sentinel)如何判断一台服务器已下线?
下线分为两种,主观下线与客观下线。
主观下线:Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例发送PING命令,Sentinel配置文件中的down-after-milliseconds规定了Sentinel判断实例下线所需要的时间;若一个实例在down-after-milliseconds毫秒内连续向Setinel返回无效回复,则Sentinel认定该实例主观下线,同一Setinel集群不同Sentiel的主观下线时长可能不同。
客观下线:当Sentinel将一个主服务器判断为主观下线之后,为了确认这台服务器真的下线了,会向同样监视这一服务器的其他Sentinel进行询问。当超过一定数量(在配置文件中规定)的Sentinel判读该服务器为主观下线后,Sentinel会将服务器判定为客观下线,并对主服务器执行故障转移操作。
3.故障转移
①选举头领Sentinel
1.所有的Sentinel都可以参与选举,每次选举之后,纪元(epoch)都会自增一次。
2.每个发现主服务器客观下线的Sentinel都会要求其他Sentinel将自己设置为头领,先到先得。
3.如果有某个Sentinel被半数以上的Sentinel(总数/2 + 1)选为头领,则该Sentinel成为集群的新头领。
4.如果在给定的时间内没有选出头领,则再次执行1-3,直到选出为止。