1. 作用
- 监控
- 不断检查master与slave是否正常运行
- master存活检测,master与slave运行情况检测
- 通知
- 当被监控的服务器出现问题,向其他(哨兵、客户端)发送通知
- 自动故障转移
- 断开master与slave连接,选取一个slave作为master,将其他slave连接到这个新的master上,并告知客户端新的服务器地址
2. 配置哨兵(docker下)
使用docker启动3个redis服务器,一个主,两个从,进行主从配置,三台redis服务器分别启动一个哨兵sentinel
1. 进入容器配置哨兵
# 进入到redis1这个容器里面
docker exec -it redis1 /bin/bash
# 可能需要更新依赖和安装vim
# apt-get update
# apt-get install -y vim
# 创建哨兵的配置文件
vim sentinel.conf
2. 编辑配置文件
# 指定哨兵监听端口号
port 29379
# 哨兵工作目录
dir "/data"
# 配置监听的master的ip与端口号,并且指定当有两个哨兵觉得master挂掉就认为master挂了
sentinel monitor mymaster 172.17.0.1 6379 2
# 配置当多少毫秒连接master没有响应就认为它挂掉了
sentinel down-after-milliseconds mymaster 30000
# 配置当master挂了,新上任的slave要花多少代价去同步,值越小,服务器性能消耗越小,效率越低
sentinel parallel-syncs mymaster 1
# 配置进行同步时,多长时间完场算有效,单位毫秒
sentinel failover-timeout mymaster 180000
3. 启动哨兵
redis-sentinel sentinel.conf
3. 工作原理
-
监控master状态,同时能获取所有的slave信息和哨兵信息
- 一个哨兵认为master挂了之后,所有的哨兵开始去检查这个master是否挂了,如果超过半数哨兵认为这个master挂了之后,就真的认为这个master挂了。
- 然后所有的哨兵投票选出一个决策者
- 然后这个决策者哨兵就在slave中选取一个作为master,选取策略
- 排除不在线的
- 排除响应慢的
- 排除于原来的master断开的时间久的
- 然后根据优先原则选取
- 优先选取优先级高的
- 判断slave-priority值,值越小优先级越高,如果为0表示永不参与选举
- 根据偏移量选择
- offset越大,说明数据越新,优先级越高
- 根据runid(选runid小的)
- 优先选取优先级高的
- 选择之后,让这个slave成为新的master(给其发送slaveof no one命令),并通知其他的slave连接这个新的master(给它们发送slaveof命令)
- 最后故障的master重新上线了,哨兵也会将他变为从节点,连接新的master节点
4. 哨兵总结
- Sentinel只是一个运行在特殊模式下的redis服务器,它使用了和普通模式下不同的命令表,所以Sentinel模式下能够使用的命令和普通Redis服务器能够使用的命令不同
- Sentinel会读入用户指定的配置文件,为每个要监视的主服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接,其中命令连接用于向主服务器发送命令请求,而订阅连接则用于接收指定频道的消息
- Sentinel通过向主服务器发送INFO命令来获取主服务器下的所有从服务器的地址信息,并为这些从服务器创建响相应的实例结构,以及连向这些从服务器的命令连接和订阅连接
- 在一般情况下,Sentinel以每十秒一次的评论向被连接的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者Sentinel正在对主服务器进行故障转移操作时,Sentinel向从服务器发送INFO命令的频率改为每秒一次
- 对于显示同一个主服务器和从服务器的多个Sentinel来说,他们会以每两秒一次的频率,通过向其他监视服务器的__sentinel__:hello频道发送消息来向其他Sentinel宣告自己的存在
- 每个Sentinel也会从__sentinel__:hello频道中接收其他Sentinel发来的消息,并根据这些信息为其他Sentinel创建实例结构,以及命令连接
- Sentinel只会与主服务器和从服务器创建命令连接和订阅连接,Sentinel之间则只会创建命令连接
- Sentinel以每秒一次的频率向实例(包括主服务器,从服务器,其他Sentinel)发送ping命令,并根据实例对ping的回复来判断实例是否在线,当一个实例在指定时长中连续向sentinel发送无效回复时,sentinel会将这个实例判断为主观下线
- 当sentinel将一个主服务器判断为主观下线是,它会向同样监视这个主服务器的其他sentinel进行询问,看他们是否同意这个主服务器已经进入主观下线
- 当Sentinel收集到足够多的主观下线投票之后,它会将主服务器判断为客户端下线,并发起一次针对主服务器的故障转移操作。