哨兵简介
哨兵定义
哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并将所有 slave 连接到新的 master。
疑问:投票规则是啥、
哨兵作用
- 监控
- 不断地检查 master 和 slave 是否正常运行
- master 存活检测、master 与 slave 运行情况检测
- 通知(提醒)
- 当被监控的服务器出现问题时,向其他(哨兵间、客户端)发送通知
- 自动故障转移
- 断开 master 与 slave 连接,选取一个 slave 作为 master,将其他 slave 连接到新的 master,并告知客户端新的服务器地址
注意:哨兵也是一台 redis 服务器,只是不提供数据服务;通常哨兵配置数量为单数(一般很少配1个,都是3个起步,配单数是为了投票的时候不会出现票数相同的情况)
启用哨兵模式
配置哨兵
-
配置一拖二的主从结构
-
配置三个哨兵(配置相同,端口不同)
- 参看 sentinel.conf
-
启动哨兵
redis-sentinel sentinel-端口号.conf
启用哨兵操作步骤:
-
查看 master 服务配置,之前都配好了,确认一下
-
查看 slave 服务配置,之前也配置好了
-
配置三个哨兵
哨兵配置文件(三个哨兵的配置相同,端口不同),sentinel-26379.conf 配置如下:
# 端口号 port 26379 # 日志等信息存放目录,可以自行改动 dir /tmp # mymaster 是自己起的名字,就是个称呼可以随便起 # 最后的数字 2 代表:如果有两个哨兵认为 mymaster 主服务器挂掉,则主服务器被判定为挂掉,这个值通常设定为哨兵数量的一半+1 sentinel monitor mymaster 127.0.0.1 6379 2 # 主服务器连接多长时间没响应会被判定为挂掉,默认为30s(下面的3000单位是毫秒) sentinel down-after-milliseconds mymaster 3000 # 当主机挂掉后,新换上来的主机数据同步并行线程数 parallel-syncs mymaster 1 # 新主机换上来后,数据同步时间超过 180s 就算超时 sentinel failover-timeout mymaster 180000
执行下面两条命令,生成 sentinel-26380.conf 和 sentinel-26381.conf
sed 's/26379/26380/g' sentinel-26379.conf > sentinel-26380.conf sed 's/26379/26381/g' sentinel-26379.conf > sentinel-26381.conf
-
启动 master 服务
redis-server /redis-4.0.0/conf/redis-6379.conf
-
启动 slave 服务
redis-server /redis-4.0.0/conf/redis-6380.conf redis-server /redis-4.0.0/conf/redis-6380.conf
-
启动哨兵服务
redis-sentinel /redis-4.0.0/conf/sentinel-26379.conf redis-sentinel /redis-4.0.0/conf/sentinel-26380.conf redis-sentinel /redis-4.0.0/conf/sentinel-26381.conf
启动完成之后,就可以用哨兵客户端连接服务端进行信息查看了,连接命令和正常 reids 客户端连接命令一样,比如我们要连接端口为26379的哨兵服务:
reids-cli -p 26379
,哨兵客户端不支持get
、set
相关的操作指令,只支持哨兵相关操作指令 -
测试 master slave 服务有没有问题
在 master 服务器新的命令窗口中,执行
redis-cli -p 6379
连接服务,紧接着执行set name zhangsan
;
在 slave 服务器新的命令行窗口中,执行redis-cli -p 6380
连接服务,紧接着执行get name
如果获取到 “zhangsan”,则测试通过。 -
测试哨兵服务是否有效
将原来的 master 服务停掉,等待30s(因为在哨兵配置文件中设定的时间是30s),后如果重新选出了新的 master 则测试通过。
哨兵工作原理
主从切换
哨兵在进行主从切换过程中主要经历三个阶段:监控、通知、故障转移
阶段一:监控
阶段二:通知阶段
哨兵之间维护一个长期信息对等的阶段
阶段三:故障转移
-
先确认故障
-
通过投票的方式从多个哨兵中选出真正处理故障的一个哨兵。假如有 5 个哨兵,此时大家都会同时向其余哨兵进行广播,广播的时候会带上自己之前被选举出来的次数等信息,假如我是 2 号哨兵,我先收到 1 号哨兵的消息后,我会投票给 1 号,就这样进行选举,如果一轮没有选出来,还会继续下一轮,直到选出票数最高的为止
-
上一步中被选出来的哨兵会在多个 slave 中选出一个作为 master
排除掉的:
-
不在线
-
响应慢
-
与原 master 断开时间久的
优先原则:
- 优先级
- offset: offset 小的更优先
- runid: runid 小的更优先
哨兵向 master(被选出来的 slave) 发送指令
slaveof no one
断开与原 master 的连接- 向其它 slave 发送
slaveof 新master_IP 新master_端口
-
从哨兵服务的日志中,我们可以看到哨兵是怎么一步步完成这些操作的,每一条日志都写得很好理解。