Linux-sentinel实现redis主从高可用

sentinel的工作过程:

              sentinel安装在另外的主机上,sentinel主机既能监控又能提供配置功能,向sentinel指明主redis服务器即可(仅监控主服务器),sentinel可以从主服务中获取主从架信息,并分辨从节点,sentinel可以监控当前整个主从服务器架构的工作状态,一旦发现master离线的情况,sentinel会从多个从服务器中选择并提升一个从节点成为主节点,当主节点被从节点取代以后,那么IP地址则发生了,客户所连接之前的主节点IP则不无法连接,此时可以向sentinel发起查询请求,sentinel会告知客户端新的主节点的IP,所以sentinel是redis在主从架构中实现高可用的解决方,sentinel为了误判和单点故障,sentinel也应该组织为集群,sentinel多个节点同时监控redis主从架构,一旦有一个sentinel节点发现redis的主节点不在线时,sentinel会与其他的sentinel节点协商其他的sentinel节点是否也为同样发现redis的主节点不在线的情况,如果sentinel的多个点节点都发现redis的主节点都为离线的情况,那么则判定redis主节点为离线状态,以此方式避免误判,同样也避免了单点故障

 

 sentinel特点:

       用于管理多个redis服务实现HA;

       监控多个redis服务节点

自动故障转移

sentinel也是一个分布式系统,可以在一个架构中运行多个sentinel进程,多个进程之间使用“流言协议”接收redis主节点是否离线,并使用“投票协议”是否实现故障转移,选择哪一个redis的从服务器成为主服务器

 

启用sentinel:

       redis-sentinel可以理解为运行有着特殊代码的redis,redis自身也可以运行为sentinel,sentinel也依赖配置文件,用于保存sentinel不断收集的状态信息

       程序:

              redis-sentinel /path/to/file.conf

              redis-server  /path/to/file.conf --sentinel

 

运行sentinel的步骤:

                     (1) 服务器自身初始化(运行redis-server中专用于sentinel功能的代码);

                     (2) 初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表;

                     (3) 创建连向master的连接;

专用配置文件:/etc/redis-sentinel.conf

(1) # sentinel monitor <master-name> <ip> <redis-port> <quorum> //此项可以出现多次,可以监控多组redis主从架构,此项用于监控主节点 <master-name> 自定义的主节点名称,<ip> 主节点的IP地址,<redis-port>主节点的端口号,<quorum>主节点对应的quorum法定数量,用于定义sentinel的数量,是一个大于值尽量使用奇数,如果sentinel有3个,则指定为2即可,如果有4个,不能够指定为2,避免导致集群分裂,注意,<master-name>为集群名称,可以自定义,如果同时监控有多组redis集群时,<master-name>不能同样

 

(2) sentinel down-after-milliseconds <master-name> <milliseconds>  //sentinel连接其他节点超时时间,单位为毫秒(默认为30秒)

 

(3) sentinel parallel-syncs <master-name> <numslaves>      //提升主服务器时,允许多少个从服务向新的主服务器发起同步请求

 

 

(4) sentinel failover-timeout <master-name> <milliseconds>       //故障转移超时时间,在指定时间没能完成则判定为失败,单位为毫秒(默认为180秒)

 

专用命令:

SENTINEL masters              //列出所有监控的主服务器

SENTINEL slaves <master name>             //获取指定redis集群的从节点

SENTINEL get-master-addr-by-name <master name>           //根据指定master的名称获取其IP

      SENTINEL reset           //用于重置,包括名称,清除服务器所有运行状态,故障转移、等等

      SENTINEL failover <master name>                  //手动向某一组redis集群发起执行故障转移

启用sentinel:

       # vim /etc/redis-sentinel.conf

       修改:

       # bind 127.0.0.1 192.168.1.1

       改为:

       bind 0.0.0.0

 

       修改:

       sentinel monitor mymaster 127.0.0.1 6379 2

       改为:

       sentinel monitor mymaster 192.168.1.63 6379 1

 

       # systemctl start redis-sentinel.service

 

       登录redis-sentinel:

       # redis-cli -h 192.168.1.63 -p 26379

 

       192.168.1.63:26379> info sentinel

       # Sentinel

       sentinel_masters:1

       sentinel_tilt:0

       sentinel_running_scripts:0

       sentinel_scripts_queue_length:0

       sentinel_simulate_failure_flags:0

                     master0:name=mymaster,status=ok,address=192.168.1.63:6379,slaves=2,sentinels=1

 

       192.168.1.63:26379> sentinel masters            //获取主节点及从节点的信息

       1)  1) "name"

              2) "mymaster"

              3) "ip"

              4) "192.168.1.63"

              5) "port"

              6) "6379"

              7) "runid"

               8) "824e49626453b61077bf2cfa36c9bb464bbcd595"

              9) "flags"

              10) "master"

 

              192.168.1.63:26379> sentinel slaves mymaster              //获取mymaster集群的从节点信息

 

测试:

       # systemctl stop redis         //关闭主服务

 

       192.168.1.63:26379> info sentinel

       # Sentinel

       sentinel_masters:1

       sentinel_tilt:0

       sentinel_running_scripts:0

       sentinel_scripts_queue_length:0

       sentinel_simulate_failure_flags:0

                     master0:name=mymaster,status=ok,address=192.168.1.63:6381,slaves=2,sentinels=1  //由此可见6381的成为了主

 

启动主服务:

       # systemctl start redis

 

       192.168.1.63:26379> info sentinel

       # Sentinel

       sentinel_masters:1

       sentinel_tilt:0

       sentinel_running_scripts:0

       sentinel_scripts_queue_length:0

       sentinel_simulate_failure_flags:0

                     master0:name=mymaster,status=ok,address=192.168.1.63:6381,slaves=2,sentinels=1

 

       # redis-cli -h 192.168.1.63 -p 6381

       192.168.1.63:6381> info replication

       # Replication

       role:master

       connected_slaves:2

       slave0:ip=192.168.1.63,port=6380,state=online,offset=224567,lag=0

       slave1:ip=192.168.1.63,port=6379,state=online,offset=224706,lag=0

              由以上测试可见,主的故障离线后,sentinel重新选了其 一个从的成为了新的主节点,在原来的主节点重新上线后,仍然不会恢复为主节点,无法实现抢占

       注意:

              将来客户端应连接sentinel,向sentinel发请求去寻址,并根据sentinel的反馈,进行连接新的redis主节点,这一点需要使用redis专用客户端来实现。redis客户端会根据sentinel返回的新节点IP进行连接

 

posted @ 2020-06-10 15:07  Vampire-Min  阅读(188)  评论(0编辑  收藏  举报