redis的sentinel可以监控redis一个和多个redis的主从复制架构。

主要实现的功能有:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

  1. redis一主双从的IP信息

    master:127.0.0.1:7000

    slave1  :  127.0.0.1:7001

    slvae2  :  127.0.0.1:7002

  2. 环境

    CentOS 7.2

    redis 3.2.3

  3. redis配置信息:

    daemonize yes 

    port 7000

    pidfile "/var/run/redis/redis-7000.pid"

    logfile "/var/log/redis/redis-7000.log"

    dbfilename "dump-7000.rdb"

    上述配置是主要更改的配置信息,其余的使用默认的配置就好了

  4. 搭建redis的一主双从

    启动redis

    /usr/bin/redis-server /etc/redis/7000.conf

    /usr/bin/redis-server /etc/redis/7001.conf

    /usr/bin/redis-server /etc/redis/7002.conf

    查看redis是否启动成功

    netstat -tunlp | egrep '7000|7001|7002'



    tcp        0      0 0.0.0.0:27000           0.0.0.0:*               LISTEN      13010/redis-sentine 

    tcp        0      0 127.0.0.1:7001          0.0.0.0:*               LISTEN      12952/redis-server  

    tcp        0      0 127.0.0.1:7002          0.0.0.0:*               LISTEN      12958/redis-server 

    搭建主从

    slave1:redis-cli -h 127.0.0.1 -p 7001 slaveof 127.0.0.1 7000

    slave2:redis-cli -h 127.0.0.1 -p 7002 slaveof 127.0.0.1 7000

    查看主从是否搭建成功

    master : redis-cli -h 127.0.0.1 -p 7000 info replication



    # Replication

    role:master

    connected_slaves:2

    slave0:ip=127.0.0.1,port=7001,state=online,offset=937723,lag=0

    slave0:ip=127.0.0.1,port=7002,state=online,offset=937723,lag=0

    测试主从是否搭建成功

    master : redis-cli -h 127.0.0.1 -p 7000 set mykey 'hello'

    slave1 : redis-cli -h 127.0.0.1 -p 7001 get mykey

    slave2 : redis-cli -h 127.0.0.1 -p 7002 get mykey

  5. 配置sentinel

    daemonize yes #后台运行

    port 27000  

    pidfile "/var/run/redis/redis-sentinel27000.pid"

    logfile "/var/log/redis/redis-sentinel27000.log" 

    sentinel monitor mymaster 127.0.0.1 7000 1

    #监控master的名字mymaster,IP地址127.0.0.1,端口7000.

    #1 表示只需要一个sentinel认为master属于下线状态就可以进行failover(故障转移),实验的时候

这个值我一直设置为2,但是我只开启了一个sentinel,所以导致我人为的下线master的时候,无论如何都不能自动的故障转移,等我更改配置为1了之后,故障转移成功了。 

      sentinel down-after-milliseconds mymaster 60000

      #表示master在多久返回sentinel发送个master的ping命令的回复,则认为master已经下线。单位是毫秒。60000就是60秒。

      sentinel failover-timeout mymaster 180000

      #表示故障自动转移的超时时间。

      sentinel parallel-syncs mymaster 1

      #表示故障转移成功之后,多少个从服务器向新的master服务器同步数据。这个值越小,则完成故障转移所需要的时间就越长。

  1. 启动sentinel

    在2.8.0以后redis包含了sentinel的文件。

    /usr/bin/redis-server /etc/redis/redis-sentinel27000.conf --sentinel

    /usr/bin/resis-sentinel /etc/redis/redis-sentinel27000.conf

    上述的俩个命令都可以启动sentinel,并且命令效果是相同的

  2. 检测sentinel启动成功


    命令行

    netstat -tunlp | grep '27000'

    redis-cli -h 127.0.0.1 -p 27000 info sentine


    # 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=127.0.0.1:7000,slaves=2,sentinels=1

    日志

    tailf /var/log/redis/redis-sentinel27000.log

    wKiom1kAXIGQXEVzAAAsePRIN3Y985.png

  3. 自动故障转移实验

    任务下线master

    redis-cli -h 127.0.0.1 -p 7000 shutdown


    查看master的redis日志信息

    tailf /var/log/redis/redis-7000.log

    redis高可用之redis sentinel(哨兵)的搭建以及应用_第1张图片

    在redis日志中可以看得到下线之前redis会做一个快照,将redis的数据保存到本地的磁盘中

    查看sentinel的日志信息

    tailf /var/log/redis/redis-sentinel27000.log

    redis高可用之redis sentinel(哨兵)的搭建以及应用_第2张图片

      在日志中我们可以看到

+sdown master mymaster 127.0.0.1 7000

#sentinel将master标记为主观下线

+odown master mymaster 127.0.0.1 7000 #quorum 1/1

#sentinel将master标记为客观下线

+new-epoch 1

+try-failover master mymaster 127.0.0.1 7000

+try-failover master mymaster 127.0.0.1 7000

+vote-for-leader cd4713bb67522a3cc34ed44d761c972f63978b97 1

#开始投票

+elected-leader master mymaster 127.0.0.1 7000

+failover-state-select-slave master mymaster 127.0.0.1 7000

+selected-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000

+failover-state-send-slaveof-noone slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000

+failover-state-wait-promotion slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000

+promoted-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000

+failover-state-reconf-slaves master mymaster 127.0.0.1 7000

+slave-reconf-sent slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000

+slave-reconf-inprog slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000

+slave-reconf-done slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000

+failover-end master mymaster 127.0.0.1 7000

+switch-master mymaster 127.0.0.1 7000 127.0.0.1 7002

#设置新master服务器127.0.0.1 7002

+slave slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7002

+slave slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002

+sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002

加入日志中出现上述红色字体信息则表明failover转移成功


    4.验证新的主从

      原slave2新master : redis-cli -h 127.0.0.1 -p 7002 info replication

# Replication

role:master

connected_slaves:1

slave0:ip=127.0.0.1,port=7001,state=online,offset=1118302,lag=1

      新master : redis-cli -h 127.0.0.1 -p 7002 set testkey "test"

      slave1 : redus-cli -h 127.0.0.1 -p 7001 get testkey

      #查看value是否存在

    5.重新拉起旧的master

      /usr/bin/redis-server /etc/redis/7000.conf

      查看sentinel日志

      tailf /var/log/redis/redis-sentinel27000.log

-sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002

+fix-slave-config slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002

      查看集群信息

      redis-cli -h 127.0.0.1 -p 7002 info replication      

# Replication

role:master

connected_slaves:2

slave0:ip=127.0.0.1,port=7001,state=online,offset=1130960,lag=0

slave1:ip=127.0.0.1,port=7000,state=online,offset=1130827,lag=1