Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。可喜的是Redis从2.8开始正式提供了Redis Sentinel (哨兵)架构来解决这个问题,本章会对Redis Sentinel进行详细分析
-
基本概念:
- 由一套或多套哨兵监控一套或多套主从结构。监控master节点,当master故障时,自动调整master所属主从结构的slave转移到一个新主上,实现数据的完整和业务的可持续性。
-
传统主从复制的问题
- 主节点的存储能力受到单机的限制
- 主节点的写能力受到单机的限制。
- 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。
-
高可用过程:
- 待原来的主节点恢复后,让它去复制新的主节点(就是原主节点修复后自动成为新主节点的从)
- 哨兵命令其他从节点去复制新的主节点(new-master)
- 原来的从节点(slave-1)成为新的主节点后,哨兵更新其他slave的主节点信息,重新启动其他的slave
- 如果主节点无法正常启动,需要选出一个从节点(slave-1),对其执行slaveof no one命令使其成为新的主节点。
- 主节点发生故障后,从节点连接主节点失败,两个从节点与主节点连接失败造成复制中断
-
安装和部署:
- 实验环境:
(1)一台master,两台slave组成一主多从结构
(2)在每台服务器上安装开启哨兵
2. 在软件解压目录复制sentinel.conf文件到安装目录的conf 目录下(三台哨兵相同)
(1)cp sentinel.conf /usr/local/redis/conf/
3. Cat sentinel.conf (三台哨兵相同)
(1)daemonize yes
(2)sentinel failover-timeout mymaster 180000
(3)sentinel parallel-syncs mymaster 1
(4)sentinel down-after-milliseconds mymaster 30000
(5)sentinel monitor mymaster 192.168.146.25 6379 2 ##监控主节点的ip及端口 ,还有如果当 主出现故障后,后面的2指的是slave节点需要多少台哨兵的投票才可以当选为new-master来继续支 持主从架构的执行。
(6)pidfile “/data/redis/redis-sentinel-26379.pid”
(7)logfile “/data/redis/redis-sentinel-26379.log”
(8)dir “/data/redis”
(9)port 26379
4.启动哨兵节点(安装目录的bin目录下会有redis-sentinel启动文件):
(1)redis-sentinel /usr/local/redis/conf/sentinel.conf
5.配置文件详细说明:
(1) sentinel monitor mymaster 192.168.146.25 6379 2
本配置说明Sentinel节点要监控的是一个名字叫做mymaster, ip地址192.168.146.25和端口为6379 的主节点,参数2用于故障发现和判定,例如将quorum配置为2、代表至少有2个Sentinel节点认为主节点不可达,那么这个不可达的判定才是客观的, 同时还与Sentinel节点的领导者选举有关,new-master 至少需要有(哨兵节点数/2+1)个哨兵节点的投票才可以成为new-master。
(2) Sentinel down-after-milliseconds mymaster 30000
每个哨兵节点都会定期的向其他的哨兵节点,和redis节点放松ping包以确认其是否可达,如果超过 Sentinel down-after-milliseconds配置项的时间,则判定为不可达,指定数量的哨兵节点都判断为不可达的情况下,会重新选举新的master
(3) Sentinel parallel-syncs mymaster 1
当哨兵节点集合对master节点故障判定一致时,哨兵会对master做出故障转移操作来选取新的主 节点,其他的从节点会向新的主节点发起复制操作,Sentinel parallel-syncs就是用来限制在一次故障转移过程中,每次向新主节点发起复制操作的从节点的数量。如果设置过大,同一时间多台slave节点向主复制数据会对新主节点所在的机器造成过大的 络和磁盘IO开销。设置参数Sentinel parallel-syncs mymaster 1为1可以让slave节点轮询发起复制而不是同时,可以减小 络开销等。
(4) Sentinel failover-timeout mymaster 180000
Sentinel failover-timeoutt通常被解释成故障转移超时时间,但实际上它作用于故障转移的各个阶段的超时时间:
a) 选出合适从节点。
b) 晋升选出的从节点为主节点。
c)命令其余从节点复制新的主节点。
d)等待原主节点恢复后命令它去复制新的主节点。
-
failover-timeout的作用具体体现在四个方面:
- 如果redis对一个主节点故障转移失败,那么下次再对改主节点做故障转移的起始时间是failover-timeout的二倍。
- 如果再对哨兵选出来的new-master执行redis-no-one命令一直失败而超过了failover-timeout的时间时,故障转移也会失败
- 如果故障转移成功到new-master,哨兵还会执行info命令来确认new-master确实晋升为了主节点,如果此过程超过failover-timeout的时间则故障转移失败。
- 如果从节点复制new-master上的数据超过failover-timeout的时间,故障转移也会失败,但是哨兵还是会配置从节点去同步主节点的数据。
(5) sentinel auth-pass :如果被监控master设置了密码,就需要此项添加master的密码来监控主节点。
(6) sentinel notification-script:此参数的作用是,在故障转移期间发生的一些警告级别的时间 (-sdown 客观下线,-odown主观下线)时,会触发此参数对应路径下的脚本,并向脚本发送相应的 事件参数。
(7) sentinel client-reconfig-script :作用是在故障转移结束后,向指定路径下的脚本发送故障转移结果 及有关参数
6. 部署技巧:
两种哨兵部署方案:
(1)方案一:一套哨兵管理master节点,这种方案降低了维护成本,但是当管理多台节点时,会对 络连接产生影 响,而且当有一台哨兵故障时,可能也会对所有管理的redis主节点的故障转移产生影响。
(2)方案二:多套哨兵管理master节点,这种方案好处是当有哨兵节点故障时,只会对所管理的redis-master节点 产生影响,不会对其他redis节点的正常的故障转移等事务产生影响,但这种方案的缺点是会造成资源 浪费。
注意事项:
- 至少部署三个且奇数的哨兵节点
- 哨兵节点不应该部署在一台物理机器上
- 哨兵选取新领导者的票数(哨兵节点数/2+1) 比如3个哨兵节点 那就设置为(3/2+1=2)2
- 哨兵只需配置监控master的host,port即可,哨兵会自动从master的info信息中加载出slave的信息
- 哨兵的节点会定时的ping 所有的其他哨兵节点,以及redis节点,是否可达
-
API
- Sentinel节点是一个特殊的Redis节点,它有自己专属的API
- sentinel masters 展示所有被监控的主节点状态以及相关的统计信息
- sentinel master mymaster 展示指定的主节点状态以及相关的统计信息
- sentinel slaves mymaster 展示指定的从节点状态以及相关的统计信息
- Sentinel sentinels mymaster 查看指定 上面哨兵相关的信息
- Sentinel get-master-addr-by-name mymaster 返回指定 主节点的IP地址和端口
- Sentinel reset mymaster 当前sentinel节点对符合(通配符风格)主节点的配 置进行重置,包括清除主节点的相关状态(例如故障 转移),重新发现从节点和sentinel节点。
- Sentinel failover mymaster 对指定进行强制故障转移(没有和其他sentinel节点 协商),当故障转移完成之后,其他的sentinel节点 按照故障转移的结果更新自身配置。
- Sentinel ckquorum mymaster 检测当前主节点的哨兵是否到达quorum的个数, Ckquorum 填写个数和quorum对比
- Sentinel flushconfig mymaster 将sentinel节点的配置信息强制写道磁盘上
- Sentinel remove mymaster 取消当前sentinel节点对于指定主节点的监控
文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8808 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!