1、哨兵简介
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
哨兵的作用
监控
不断的检查master和slave是否正常运行。
master存活检测、master与slave运行情况检测
通知(提醒)
当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
自动故障转移
断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址。
注意:
哨兵也是一台redis服务器,只是不提供数据服务
通常哨兵配置数量为单数
2、启用哨兵模式
redis-sentinel sentinel-端口号.conf
[root@localhost redis-4.0.6]# redis-sentinel sentinel.conf
2238:X 28 Apr 20:39:09.934 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2238:X 28 Apr 20:39:09.934 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=2238, just started
2238:X 28 Apr 20:39:09.934 # Configuration loaded
2238:X 28 Apr 20:39:09.935 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 2238
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
2238:X 28 Apr 20:39:09.937 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2238:X 28 Apr 20:39:09.938 # Sentinel ID is 0899fe69d4ddfc0456ac47fea0290072e8240894
2238:X 28 Apr 20:39:09.938 # +monitor master mymaster 127.0.0.1 6379 quorum 2
sentinel.conf文件中配置哨兵:
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
配置哨兵.jpg
3、哨兵工作原理
哨兵在进行主从切换过程中经历三个阶段:监控、通知、故障转移。
3.1、监控阶段
用于同步各个节点的状态信息
1、获取各个sentinel的状态(是否在线)
2、获取master的状态:master属性、runid、role:master、各个slave的详细信息
3、获取所有slave的状态(根据master中的slave信息):slave属性、runid、role:slave、master_host、master_port、offset……
1、sentinel1向master发送了一条info指令,拿到master的info信息,就可以获取master和slave的状态。
2、sentinel1建立和master的cmd连接,然后保存所有的哨兵状态。
3、sentinel1向slave发送info指令,获取slave的状态。
4、启动sentinel2,向master发送info指令。
5、建立cmd连接,获取哨兵状态,发现此master已经有一个哨兵在监控。
6、sentinel2和sentinel1建立发布订阅通道,相互连接,并发送ping命令
以此类推,直到sentinel3与sentinel1和sentinel2建立通道,并获取master、slave信息。
3.2、通知阶段
三个sentinel组成了一个小的群体,他们之间进行信息的互通。sentinel通过与master和slave建立的cmd连接,获取他们的工作状态。sentinel定时向各个服务器发送信息,拿到服务器响应的结果之后,会在sentinel小群体里面,共享信息。
通知阶段.jpg
3.3、故障转移阶段
故障转移.jpg1、sentinel向master发送指令(假设master宕机),得不到响应,于是标记master为S_DOWN(主观下线:一台sentinel认为他挂了)。
2、然后将这条信息传播到sentinel小群体内。
3、其他sentinel查看master的状态,将自己观察到的信息也传播到内网里。
4、当超过半数的sentinel都认为master挂了的时候,就将master的状态标记为O_DOWN(客观下线:一台sentinel认为他挂了)。
5、sentinel小群体投票选出一个领头sentinel。
6、领头sentinel从服务器列表中,挑选备选master:挑选在线的,过滤掉响应慢的,过滤掉与master断开时间久的,应用优先级原则(优先级、offset、runid)挑选出新的master。
7、向新的master发送slaveof no one,向其他slave发送slaveof 新masterIP端口
网友评论