哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave接连到新的master上。
注意:哨兵也是一台服务器,只不过不提供数据服务,通常哨兵配置数量为单数。
一、哨兵结构构建
哨兵服务器配置
sentinel monitor mymaster 127.0.0.1 6379 2
mymaster 是自己起的名字,127.0.0.1 6379当前master的地址和端口,2表示如果有2个及以上的哨兵认为此master挂了,那就判定此master挂了。
sentinel down-after-milliseconds mymaster 30000
哨兵连接主机30000毫秒没响应就认为master挂了
sentinel parallel-syncs mymaster 1
新上任的master开始数据同步的个数,越小压力就越小,速度也越慢
sentinel failover-timeout mymaster 180000
在数据同步的时候180000毫秒算超时
哨兵服务器完整的配置sentinel-26379.conf :
port 26379
daemonize yes
logfile "redis-26379.log"
dir /an-dev/redis-4.0.14/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
另外两个哨兵服务器的端口设为26380和26381,里面内容logfile名字做相应修改其他地方就不用修改了。
master配置
和前几节的配置一样,这里可以把持久化的配置去掉了,我这里没有去掉,不影响实验。
port 6379
daemonize yes
logfile "redis-6379.log"
dir /an-dev/redis-4.0.14/data
dbfilename dump-6379.rdb
rdbcompression yes
rdbchecksum yes
appendonly yes
appendfsync always
appendfilename appendonly-6379.aof
auto-aof-rewrite-min-size 200b
auto-aof-rewrite-percentage 200
slave配置
这里有两台slave服务器,分别为6380和6381,这里只列出6380的配置,
port 6380
daemonize yes
logfile "redis-6380.log"
dir /an-dev/redis-4.0.14/data
slaveof 127.0.0.1 6379
启动服务器
先启动master,再启动slave,最后启动哨兵。注意启动哨兵的命令是redis-sentinel
现在都启动起来了,查看一下日志信息,
哨兵26379的日志信息:
可以看到1个master,2个slave,和另外两个哨兵。
master宕机后重新选举master
我现在杀掉master的进行代表master宕机,30秒后哨兵会重新选出一个新的master,
等待一会,查看哨兵26379的日志信息,可以看到选举出了新的master
二、哨兵的工作原理
哨兵做的主要的一件事就是主从切换,再进行主从切换的过程中经历三个阶段
- 监控
- 通知
- 故障转移
监控阶段
同步各个节点的状态信息,哨兵模式启动之后,
- 会先使用ping指令获取各个sentinel的状态(是否在线)
- 使用info指令获取master的状态、属性
- 根据master中slave信息,使用info获取所有slave信息
通知阶段
通知阶段可以说是一个信息长期维护阶段,比如sentinel1通过命令获取了master和slave的信息了,然后sentinel1会把信息在哨兵组成的网络中发布,其他哨兵会收到这个信息,就像哨兵有一个朋友圈。
故障转移阶段
- 如果有哨兵发现master挂了,会把master状态标记为S_DOWN(主观下线),此时其他哨兵得知此时,纷纷去拜访master,当有半数以上的哨兵发现master挂了,那么这个master就被认为真的挂了,状态标记为O_DOWN(客观下线)。
- 经过竞选,会从哨兵中选出一个来进行选取一个slave作为新的master,首先要是在线的,然后把响应慢的pass掉,与原master断开久的pass掉,这样选取出来的在根据优先原则选出唯一的一个来。