面试题答案
一键面试选举机制
- 主观下线(SDOWN):
- Sentinel节点会定期向主从服务器发送PING命令来检测其健康状态。如果在一定时间(由
down - after - milliseconds
配置项指定)内,Sentinel没有收到主服务器的有效回复,该Sentinel会将主服务器标记为SDOWN(主观下线),认为主服务器出现故障。
- Sentinel节点会定期向主从服务器发送PING命令来检测其健康状态。如果在一定时间(由
- 客观下线(ODOWN):
- 当一个Sentinel节点将主服务器标记为SDOWN后,它会向其他Sentinel节点发送
SENTINEL is - master - down - by - addr
命令,询问其他Sentinel节点是否也认为主服务器下线。 - 如果超过一定数量(由
quorum
配置项指定)的Sentinel节点都认为主服务器下线,那么该主服务器会被标记为ODOWN(客观下线)。这一步确保了不是单个Sentinel节点的误判导致主服务器被认为下线。
- 当一个Sentinel节点将主服务器标记为SDOWN后,它会向其他Sentinel节点发送
- 领导者选举:
- 当主服务器被标记为ODOWN后,Sentinel节点需要选举出一个领导者Sentinel来执行故障转移操作。
- 每个发现主服务器客观下线的Sentinel节点都可以成为领导者选举的候选人。候选人向其他Sentinel节点发送
SENTINEL leader - election
命令来请求选票。 - 收到请求的Sentinel节点,如果还没有给其他候选人投过票,就会给第一个请求的候选人投票。如果一个候选人获得了超过半数(并且大于
quorum
)的选票,它就会成为领导者。 - 如果在选举过程中出现选票分散等情况导致没有候选人获得足够选票,那么会在一段时间后重新进行选举。
数据同步流程
- 选择新主服务器:
- 领导者Sentinel从已下线主服务器的从服务器列表中选择一个从服务器晋升为主服务器。选择规则如下:
- 首先过滤掉处于下线状态、连接断开、或者最近5秒内没有回复过INFO命令的从服务器。
- 优先选择优先级最高的从服务器(通过
slave - priority
配置项设置,值越低优先级越高)。 - 如果优先级相同,优先选择复制偏移量最大(即数据最完整)的从服务器。
- 如果以上都相同,优先选择运行ID最小的从服务器。
- 领导者Sentinel从已下线主服务器的从服务器列表中选择一个从服务器晋升为主服务器。选择规则如下:
- 故障转移:
- 领导者Sentinel向选中的从服务器发送
SLAVEOF no one
命令,将其转换为主服务器。 - 领导者Sentinel向其他从服务器发送
SLAVEOF <新主服务器IP> <新主服务器端口>
命令,让它们成为新主服务器的从服务器,开始复制新主服务器的数据。
- 领导者Sentinel向选中的从服务器发送
- 通知客户端:
- Sentinel会通过发布订阅机制,向客户端发送新主服务器的地址和端口等信息,让客户端能够连接到新的主服务器,继续进行读写操作。
- 数据同步:
- 新的从服务器会使用Redis的复制机制与新主服务器进行数据同步。从服务器会向主服务器发送
PSYNC
命令(Redis 2.8及以后版本),主服务器根据情况回复FULLRESYNC
(全量同步)或CONTINUE
(增量同步)。 - 在全量同步时,主服务器会生成RDB文件并发送给从服务器,同时将此后的写命令缓存起来。从服务器接收到RDB文件后加载数据,然后接收并执行主服务器缓存的写命令,从而完成数据同步。
- 在增量同步时,主服务器只需要将从服务器断线期间的写命令发送给从服务器,从服务器执行这些命令即可完成数据同步。这样在故障转移后,新的主从架构能够快速恢复数据一致性,保证系统的高可用性。
- 新的从服务器会使用Redis的复制机制与新主服务器进行数据同步。从服务器会向主服务器发送