Redis应用-2.哨兵模式

2.哨兵模式

2.1 哨兵简介

哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的
master,并将所有slave连接到新的master。 

哨兵的作用

监控 
    不断的检查master和slave是否正常运行。 
    master存活检测、master与slave运行情况检测 
    
通知(提醒) 
	当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。 
	
自动故障转移 
	断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址 

注意: 
    哨兵也是一台redis服务器,只是不提供数据服务 
    通常哨兵配置数量为单数  3 5 7 9  最少3

2.2 启用哨兵模式

配置哨兵

配置一拖二的主从结构 
配置三个哨兵(配置相同,端口不同) 
(先启主机,再启从机,最后启动哨兵)

参看sentinel.conf

启动哨兵

redis-sentinel sentinel-端口号.conf

2.3 哨兵工作原理

主从切换

哨兵在进行主从切换过程中经历三个阶段 
    监控 
    通知 
    故障转移 

阶段一:监控阶段

用于同步各个节点的状态信息 
	1.获取各个sentinel的状态(是否在线)
    
	2.获取master的状态 
        master属性 
            runid 
            role:master 
		各个slave的详细信息 
		
	3.获取所有slave的状态(根据master中的slave信息) 
		slave属性 
            runid 
            role:slave 
            master_host、master_port 
            offset 
            …… 

工作顺序(重点)

① sentinel先连接master获取信息,发一个info指令,拿到信息,知道master和slave的状况。 /ˈsentɪnl/
② sentinel与master建立cmd连接用于命令交换。sentinel保存所有哨兵信息记录,master记录redis实例对应的的信息
③ sentinel根据从master获取的slaves的信息接着去连每一个slave,发送info指令又把信息拿到了

下一个sentinel进来了,也会发送info给master获取信息建立cmd连接,并根据master发现已经有sentinel连过,sentinel也保存信息,并且保存的sentinels是两个sentinel信息,为了保证与前一个sentinel保存的信息同步,两个sentinel之间建立沟通桥梁->发布、订阅。为了保证两个sentinel信息能够长期对称,它们两个会互发ping命令查看对方是否存在。

当第三个sentinel进来再连接master等操作,除此之外三个sentinel之间互连,三者之间形成一个内部网络,谁拿到信息快速扩散给其他sentinel,它们之间是信任的,发现新的信息与自己的不一样就会把自身的信息更新掉,这样信息同步速度非常快。

简单来说,sentinel会向master、slave、其他sentinel要状态,sentinel之间会组建一个对应的频道,大家在里面发布信息,订阅信息,收信息,同步信息。

阶段二:通知阶段

sentinel通过与master建立的命令连接获取master与slave的工作状态,无论哪个sentinel获取到,都会把信息回传,各个sentinel进行信息同步

阶段三:故障转移阶段

sentinel1给master发送命令,master没回应,sentinel1不停的给master发送命令,达到一定阶段(默认30s)未回应就给master标记一个SDOWN状态,把master状态信息传播到sentinel之间的内网中,说master宕机了。(如果是sentinel自己断了,也会标记SDOWN状态,但是这个指令不能发布到内网中),当内网中其他的sentinel接收到指令,都会去给master发送命令,master都未回应,也把它们接收到的结果信息发布到内网里确认sentinel1说的对,master真宕机了。当sentinel数量一半加一的sentinel说master宕机了,说明master真宕机了标记为ODOWN。
一台sentinel认为master挂了标记SDOWN叫主观下线
半数以上的sentinel认为master挂了标记ODOWN叫客观下线

所有sentinel同时向它们的频道发一个指令:内容是宕机的ip、端口、竞选次数、自己的run id。
内部有投票机制,各个sentinel既是参选者也是投票者,例如有5个sentinel,sentinel1和sentinel4同时给sentinel2发送消息,sentinel2先收到谁的消息就把票投给谁。若没有选出,就再重新投票一次,每增加一次,竞选次数增加1,投票完毕会推选出一个sentinel进行处置工作。

推选出的sentinel在服务器列表中挑选备选master 
筛选条件:
    1.不在线的 
    2.响应慢的 
    3.与原master断开时间久的 
    4.优先原则 
        优先级 
        offset 
        runid小
        
发送指令( sentinel ) 
    向新的master发送slaveof no one   让它与之前的master断开连接
    向其他slave发送slaveof 新master IP 端口 
监控 
	同步信息 
通知 
	保持联通 
故障转移 
    发现问题 
    竞选负责人 
    优选新master 
    新master上任,其他slave切换新master,原master故障恢复后作为slave连接 
posted @ 2021-09-19 21:14  Lz_蚂蚱  阅读(131)  评论(0)    收藏  举报