哨兵是什么
哨兵(Sentinel)是Redis高可用性的一种解决方案,哨兵负责监控后台master主机是否正常工作,如果master主机发生故障就会从slave从机中投票出新的主机,让从机代替成为新的主机继续对外服务
哨兵实现了无人值守的运维服务,全程不需要人工干预
为什么会出现哨兵
而至于为什么会出现哨兵就是为了解决当主机宕机时从机原地等待而导致无法继续对外服务的问题,目的是保障redis的高可用性
配置哨兵监控
配置哨兵监控需要修改我们的配置文件sentinel.conf,该文件一般在redis的安装包中
- 修改服务监听地址为0.0.0.0或者其他ip地址
- 开启daemonize
- 关闭保护模式
- 设置要使用的端口号
- 文件路径由用户自己确定
流程和配置主从复制差不多,可以去看看我之前的文章
重点:
第一条配置哨兵要监控的主机名称,主机ip,端口号,quorum法定票数
因为单个哨兵也许会因为主机网络波动而出现误判的的现象,因此需要有多个哨兵并且设置合理的quorum
举个例子,假如有三个哨兵监控同一台主机,如果我们想要实现有两个哨兵觉得该主机已经下线要进行故障迁移,那么quorum就设置为2
故障迁移:选出新主机代替旧主机
第二条配置哨兵要监控的主机的名称和密码
要修改的内容大概就是下面这些,修改好后保存文件
使用命令 redis-sentinel 你的配置文件.conf --sentinel 来启动哨兵
配置就完成了(主从复制需要另外配置,且主机需要配置从机的访问密码)
哨兵的内部实现
通过日志文件我们可以看出哨兵是如何工作的
上图是26379的哨兵的工作日志,我们的三个哨兵工作在同一个主机的不同端口上,用端口号进行区分
- 26379的哨兵先行启动,监控到有新增两个哨兵26380和26381,他们都监控同一台主机6379
- +sdown当前哨兵认为当前主机已经下线,于此同时其他两个哨兵也会做出判断
- 因为哨兵同意故障迁移的票数超过了quorum,因此显示开始故障迁移+new-epoch 1
- 再选出主机之前先要票选出领导哨兵,每个哨兵都会进行投票选出领导哨兵,这里投给了26380
- +odown表示主机已经客观下线了,我们可以看到3个哨兵都认为其已下线,超过了quorum2
- 配置更新,26380选择了6381作为新的主机
- 6380和6379都变成了6381的slave从机
- 最后一行,是另一组操作请忽略
总结:
主机挂掉后,从机数据依旧可用(需要等待选出新的主机)
主机宕机后会自动选出新主机来代替原有主机
旧主机重启后成为新主机的从机
故障迁移会自动重写配置文件(redis.conf,sentinel.conf)
运行流程及原理
一个哨兵可以同时监控多个主机
raft算法
选出领导哨兵用的就是raft算法,一句话说就是先到先得
新主机选取规则
先看优先级,再看偏移量offset(从机复制的数据的多少,数据越完整偏移量越大),最后看id
优先级可以在redis.conf中设置,数值越小优先级越高
offset在系统内部会自动记录,id是系统自动分配的
使用建议
- 哨兵数量应该多个,保证高可用
- 数量应该是奇数,方便投票
- 哨兵的配置需一致,硬件不要差别特别大
- 主从复制+哨兵监控不能保证数据不丢失,因为故障迁移需要时间,会丢失该时间段的数据