Redis高可用sentinel哨兵详解

 

 

Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用场景这种故障处理的方式是无法接受的。可喜的是Redis从2.8开始正式提供了Redis Sentinel (哨兵)架构来解决这个问题,本章会对Redis Sentinel进行详细分析

 

  • 基本概念

    • 由一套或多套哨兵监控一套或多套主从结构。监控master节点,当master故障时,自动调整master所属主从结构的slave转移到一个新主上,实现数据的完整和业务的可持续性。

 

 

  1. 传统主从复制的问题
    1. 主节点的存储能力受到单机的限制
    2. 主节点的写能力受到单机的限制。
    3. 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。
  2. 高可用过程:
    1. 待原来的主节点恢复后,让它去复制新的主节点(就是原主节点修复后自动成为新主节点的从)
    2. 哨兵命令其他从节点去复制新的主节点(new-master)
    3. 原来的从节点(slave-1)成为新的主节点后,哨兵更新其他slave的主节点信息,重新启动其他的slave
    4. 如果主节点无法正常启动,需要选出一个从节点(slave-1),对其执行slaveof no one命令使其成为新的主节点。
    5. 主节点发生故障后,从节点连接主节点失败,两个从节点与主节点连接失败造成复制中断

 

  • 安装和部署

    1. 实验环境:

                                     (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的作用具体体现在四个方面:
    1. 如果redis对一个主节点故障转移失败,那么下次再对改主节点做故障转移的起始时间是failover-timeout的二倍。
    2. 如果再对哨兵选出来的new-master执行redis-no-one命令一直失败而超过了failover-timeout的时间时,故障转移也会失败
    3. 如果故障转移成功到new-master,哨兵还会执行info命令来确认new-master确实晋升为了主节点,如果此过程超过failover-timeout的时间则故障转移失败。
    4. 如果从节点复制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节点的正常的故障转移等事务产生影响,但这种方案的缺点是会造成资源                                             浪费。

 

注意事项:

  1. 至少部署三个且奇数的哨兵节点
  2. 哨兵节点不应该部署在一台物理机器上
  3. 哨兵选取新领导者的票数(哨兵节点数/2+1) 比如3个哨兵节点 那就设置为(3/2+1=2)2
  4. 哨兵只需配置监控master的host,port即可,哨兵会自动从master的info信息中加载出slave的信息
  5. 哨兵的节点会定时的ping 所有的其他哨兵节点,以及redis节点,是否可达

 

  • API

    • Sentinel节点是一个特殊的Redis节点,它有自己专属的API
  1. sentinel masters                                                                                   展示所有被监控的主节点状态以及相关的统计信息
  2. sentinel master  mymaster                                                                   展示指定的主节点状态以及相关的统计信息
  3. sentinel slaves    mymaster                                                                  展示指定的从节点状态以及相关的统计信息
  4. Sentinel sentinels  mymaster                                                                查看指定 上面哨兵相关的信息
  5. Sentinel get-master-addr-by-name   mymaster                                    返回指定 主节点的IP地址和端口
  6. Sentinel reset    mymaster                                                                    当前sentinel节点对符合(通配符风格)主节点的配                                                                                                                  置进行重置,包括清除主节点的相关状态(例如故障                                                                                                                转移),重新发现从节点和sentinel节点。
  7. Sentinel failover  mymaster                                                                   对指定进行强制故障转移(没有和其他sentinel节点                                                                                                                  协商),当故障转移完成之后,其他的sentinel节点                                                                                                                  按照故障转移的结果更新自身配置。
  8. Sentinel ckquorum   mymaster                                                             检测当前主节点的哨兵是否到达quorum的个数,                                                                                                                      Ckquorum 填写个数和quorum对比
  9. Sentinel flushconfig   mymaster                                                            将sentinel节点的配置信息强制写道磁盘上
  10. Sentinel remove    mymaster                                                                 取消当前sentinel节点对于指定主节点的监控

 

 

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8808 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年3月8日
下一篇 2020年3月8日

相关推荐