Sentinel?
监测:会不断的监测主实例和从实例是否正常工作
通知:可以通过API通知开发者,redis某个实例有问题
自动故障转移:如果master出现问题,Sentinel可以启动自动故障转移,根据一些特定的要求将优先级高的副本提升为master
配置提供者:客户端连接上Sentinel,Sentinel可以拿到客户端的配置信息。
例如:Sentinel拿到master节点的数据,因为mster保存了从节点的配置信息 所以Sentinel也有了从节点的配置信息
Sentinel运行
Sentinel配置和redis使用配置是一样的只是默认配置文件使用一个自定义的sentinel.conf的配置文件,最小的配置文件如下:
监控实现
Sentinel如何检查客户端是否正常运行,一般大多数实现监控都是通过有一个health接口通过访问接口是否能返回正常数据来判断,Sentinel也很相似也是通过定时请求的方式实现。
Sentinel三个定时监控任务
定时任务1:每隔10s Sentinel节点会向redis数据节点发送info命令获取最新拓扑信息
定时任务2:每隔2s 对redis数据节点发送命令获取其他Sentinel对这个节点判断作为客观下线的判断
定时任务3:每隔1s Sentinel会向redis数据节点和其他Sentinel节点发送一条ping,由此来确定发送的节点是否正常运行
节点下线判断依据
主观下线:Sentinel节点每隔1s会向redis数据节点和其他Sentinel节点发送一条ping来检查如果检查节点没能在down-after-milliseconds设置的时间内回应则这个Sentinel主观上判断这个节点以下线
down-after-milliseconds:在配置Sentinel时Config文件中会有配置
客观下线:当Sentinel判断某个节点主观下线了,这时候他会问其他Sentinel节点对某个节点的判断当超过一半的节点判断此节点下线,则同意此节点下线
注:因为需要超过一半的节点来判断所以一一般Sentinel部署的台数一般是单数,而且是三台以上,这样就不会出现打平的现象
故障转移
当Sentinl 判断了某个节点为客观下线后,就会进行故障转移
故障转移步骤:
选择新的从节点
从节点选择逻辑:
1.过滤不健康的从节点
2.选择slave-priority (从节点优先级)最高的从节点列表如果存在则返回,没有则继续判断
3. 选择复制偏移量最大的从节点(复制最完整的 )如果存在则返回,没有则继续判断
4.选择runid最小的节点
相关概念:
不健康的节点包括:主观下线的节点,5s内回复Sentinel的节点,与主节点超过down-after-milliseconds*10s没有回应的节点
slave priority:是Redis 实例文件中的replica-priority
配置进行排序,replica-priority默认是没有设置因此默认所有实例拥有相同的默认值,当需要特定的故障转移首选项时,
则replica-priority
必须在所有实例(包括主服务器)上设置,slave priority越低,优先级就越高
runid:每个redis实例运行时都会生成一个40位字符组成,是一个随机的十六进制字符,master和从节点之间通信来判断是哪个实例的依据
测试故障转移
1.强制杀掉对应节点的进程号
2.使用redis的debug sleep命令 浪节点进入睡眠状态,这样可以模拟阻塞的效果
3.使用Redis的shutdown命令 模拟正常的停掉Redis
参考:《Redis开发与运营》