文章目录
- 哨兵机制
- 案例
- 认识异常
- 哨兵运行流程及选举原理
- 主观下线(Subjectively Down)
- ODown客观下线(Objectively Down)
- 选举出领导者哨兵
- 选出新master过程
- 哨兵使用建议
哨兵机制
吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务
https://redis.io/docs/manual/sentinel/
作用
- 主从监控:监控主从redis库运行是否正常
- 消息通知:哨兵可以将故障转移的结果发送给客户端
- 故障转移:如果Master异常,则会进行主从切换,将其中一个Slave作为新Master
- 配置中心:客户端通过连接哨兵来获得当前Redis服务的主节点地址
案例
sentinel.conf参数说明
- bind服务监听地址,用于客户端连接,默认本机地址
- daemonizee是否以后台daemon方式运行
- protected-mode安全保护模式
- port 端口
- logfile日志文件路径
- pidfile pid文件路径
- dir工作目录
新增
- sentinel monitor
设置要监控的master服务器,quorum表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数。 - sentinel auth-pass
master设置了密码,连接master服务的密码
# 指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
sentinel down-after-milliseconds <master-name> <milliseconds>:
# 表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据
sentinel parallel-syncs <master-name> <nums>:
# 故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败
sentinel failover-timeout <master-name> <milliseconds>:
# 配置当某一事件发生时所需要执行的脚本
sentinel notification-script <master-name> <script-path> :
# 客户端重新配置主节点参数脚本
sentinel client-reconfig-script <master-name> <script-path>:
sentinel文件通用配置
bind 0.0.0.0
daemonize yes
protected-mode no
port 26379
logfile "/var/log/sentinel26379.log"
pidfile /var/run/redis-sentinel26379.pid
dir /data/redis
# 下面这段命令是 Sentinel 监控 Redis 主从架构中的一个主节点,其中:
# sentinel:表示要连接到 Sentinel 服务器。
# monitor:表示监控 Redis 服务。
# mymaster:表示被监控的 Redis 服务的名称,可以自定义。
# 192.168.111.169:表示 Redis 主节点的 IP 地址。
# 6379:表示 Redis 主节点的端口号。
# 2:表示需要至少有 2 个 Sentinel 实例认为 Redis 主节点失效才会触发故障转移。
sentinel monitor mymaster 192.168.217.169 6379 2
sentinel auth-pass mymaster
启动
redis-sentinel ./sentinel129.conf --sentinel
注意
- 之前down机的master机器重启回来,会变成从机
- 6381被选为新master,上位成功
- 以前的6379从master降级变成了slave
关于配置文件小结
- 文件的内容,在运行期间会被sentinel动态进行更改
- Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变
即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换 - 可以同时监控多个master,一行一个
示例:https://redis.io/docs/management/sentinel/
认识异常
- broken pipe
pipe是管道的意思,管道里面是数据流,通常是从文件或网络套接字读取的数据。当该管道从另一端突然关闭时,会发生数据突然中断,即是broken,对于socket来说,可能是网络被拔出或另一端的进程崩溃
这个异常是客户端读取超时关闭了连接,这时候服务器端再向客户端已经断开的连接写数据时就发生了broken pipe异常!
哨兵运行流程及选举原理
当一个主从配置中的master失效之后,sentinel可以选举出一个新的master用于自动接替原master的工作,主从配置中的其他redis服务器自动指向新的master同步数据。般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换
主观下线(Subjectively Down)
- SDOWN(主观不可用)是单个sentinel自己主观上检测到的关于master的状态,从sentinel的角度来看如果发送了PING心跳后,在一定时间内没有收到合法的回复,就达到了SDOWN的条件。
- sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度
ODown客观下线(Objectively Down)
- ODOWN需要一定数量的sentinel,多个哨兵达成一致意见才能认为一个master客观上已经宕掉
选举出领导者哨兵
当主节点被判断客观下线以后,各个哨兵节点会进行协商先选举出一个领导者哨兵节点(兵王)并由该领导者节点也即被选举出的兵王进行failover(故障迁移)
Raft算法
监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:
即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者
选出新master过程
步骤1: 选举新master:
- redis.conf文件中,优先级slave-priority或者replica-priority最高的从节点(数字越小优先级越高
- 复制偏移位置offset最大的从节点
- 最小Run ID的从节点 字典顺序,ASCII码
步骤2:重新选择主节点
- 执行slaveof no one命令让选出来的从节点成为新的主节点,并通过slaveof命令让其他节点成为其从节点
- Sentinel leader会对选举出的新master执行slaveofno one操作,将其提升为master节点
- Sentinel leader向其它slave发送命令,让剩余的slave成为新的master节点的slave
步骤3:选举过后老master降级为子节点
- 将之前已下线的老master设置为新选出的新master的从节点,当老master重新上线后,它会成为新master的从节点
- Sentinel leader会让原来的master降级为slave并恢复正常工作。
哨兵使用建议
- 哨兵节点的数量应为多个,哨兵本身应该集群,保证高可用
- 哨兵节点的数量应该是奇数
- 各个哨兵节点的配置应一致
- 如果哨兵节点部署在Docker等容器里面,尤其要注意端口的正确映射
- 哨兵集群+主从复制,并不能保证数据零丢失