zoukankan      html  css  js  c++  java
  • [redis] linux下哨兵篇(3)

    一.前言
    1.为何部署sentinel哨兵
    前文redis主从架构中,当主服务故障时,需要手动将从服务切换为主服务,sentinel服务就是将这个过程自动化。
    主要功能有:
    1)不时监控主从服务正常运行
    2)可以通过脚本、API接口发出报警
    3)自动故障迁移
    当然sentinel不止以上这些,更多的功能参考https://redis.io/topics/sentinel

    二.redis部署sentinel

      1.环境说明

    系统基于CentOS-6.7-x86_64-minimal.iso
    源码安装包redis-3.2.4版本,sentinel功能2.8版本开始支持

    192.168.56.101 host101
    192.168.56.102 host102
    192.168.56.103 host103
    
    master    192.168.56.101:6379
    slave1    192.168.56.102:6379
    slave2    192.168.56.103:6379
    sentinel1 192.168.56.101:26379
    sentinel2 192.168.56.102:26379
    sentinel3 192.168.56.103:26379
    

      2.redis配置

    #master端配置
    #复制一份默认的配置文件再修改以下个地方
    [root@host101 ~]# cp /usr/local/src/redis-3.2.4/redis.conf /etc/redis/6379.conf
    [root@host101 ~]# vim /etc/redis/6379.conf
    bind 0.0.0.0                      #监控地址
    daemonize yes                     #dameon形式运行
    pidfile /var/run/redis_6379.pid   #pid文件
    logfile "/var/log/redis_6379.log" #启动日志
    dbfilename dump.rdb               #数据文件
    dir /var/lib/redis                #数据目录
    requirepass mima                  #配置连接密码
    
    #slave1端配置
    [root@host102 ~]# vim /etc/redis/6379.conf
    bind 0.0.0.0                      #监控地址
    daemonize yes                     #dameon形式运行
    pidfile /var/run/redis_6379.pid   #pid文件
    logfile "/var/log/redis_6379.log" #启动日志
    dbfilename dump.rdb               #数据文件
    dir /var/lib/redis                #数据目录
    requirepass mima                  #配置连接密码
    slaveof 192.168.56.101 6379       #指定master
    masterauth mima                   #slave认证master密码
    slave-read-only yes               #设置slave为只读模式
    
    #slave2端配置
    [root@host103 ~]# vim /etc/redis/6379.conf
    bind 0.0.0.0                      #监控地址
    daemonize yes                     #dameon形式运行
    pidfile /var/run/redis_6379.pid   #pid文件
    logfile "/var/log/redis_6379.log" #启动日志
    dbfilename dump.rdb               #数据文件
    dir /var/lib/redis                #数据目录
    requirepass mima                  #配置连接密码
    slaveof 192.168.56.101 6379       #指定master
    masterauth mima                   #slave认证master密码
    slave-read-only yes               #设置slave为只读模式
    

      3.启动redis并查看主从状态

    #启动redis服务,三台都操作
    [root@host101 redis]# /usr/local/redis/bin/redis-server /etc/redis/6379.conf 
    
    #查看主从状态
    [root@host101 redis]# /usr/local/redis/bin/redis-cli -a mima
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.56.102,port=6379,state=online,offset=15,lag=0
    slave1:ip=192.168.56.103,port=6379,state=online,offset=15,lag=1
    master_repl_offset:15
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:14
    
    #测试读写
    [root@host101 redis]# /usr/local/redis/bin/redis-cli -a mima
    127.0.0.1:6379> set name marry
    OK
    127.0.0.1:6379> get name
    "marry"
    127.0.0.1:6379> exit
    [root@host101 redis]# /usr/local/redis/bin/redis-cli -h 192.168.56.103 -a mima
    192.168.56.103:6379> get name
    "marry"
    192.168.56.103:6379> set name marry3
    (error) READONLY You can't write against a read only slave.
    192.168.56.103:6379> exit
    [root@host101 redis]# /usr/local/redis/bin/redis-cli -h 192.168.56.102 -a mima
    192.168.56.102:6379> info replication
    # Replication
    role:slave
    master_host:192.168.56.101
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:2
    master_sync_in_progress:0
    slave_repl_offset:537
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    

      4.配置sentinel并启动

    #三台都修改为以下同样配置
    [root@host101 ~]# grep -Ev "^$|#" /usr/local/src/redis-3.2.4/sentinel.conf  > /etc/redis/sentinel.conf
    [root@host101 ~]# vim /etc/redis/sentinel.conf
    port 26379                                      #sentinel监听端口
    daemonize yes                                   #以daemon形式运行在后台
    logfile /var/log/sentinel.log                   #日志文件
    dir /tmp
    sentinel monitor mymaster 192.168.56.101 6379 2 #监控mymaster组,master地址,端口,quorum次数
    sentinel down-after-milliseconds mymaster 5000  #5000毫秒即5秒连续不能连通master,认为master挂掉
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 60000        #故障切换超时时间
    sentinel auth-pass mymaster mima                #密码认证
    protected-mode no                               #默认情况下sentinel只监听环回地址,这样就导致sentinel之间不能通信,可以改为监听网卡或者关闭protected-mode
    
    #三台都启动
    [root@host101 ~]# /usr/local/redis/bin/redis-sentinel /etc/redis/sentinel.conf 
    
    #查看sentinel启动日志
    #正常情况下可以看到+sentinel-address-switch字样
    [root@host101 ~]# more /var/log/sentinel.log 
    24470:X 08 Dec 10:53:12.205 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                    _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 3.2.4 (00000000/0) 64 bit
      .-`` .-```.  ```\/    _.,_ ''-._                                   
     (    '      ,       .-`  | `,    )     Running in sentinel mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
     |    `-._   `._    /     _.-'    |     PID: 24470
      `-._    `-._  `-./  _.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |           http://redis.io        
      `-._    `-._`-.__.-'_.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |                                  
      `-._    `-._`-.__.-'_.-'    _.-'                                   
          `-._    `-.__.-'    _.-'                                       
              `-._        _.-'                                           
                  `-.__.-'                                               
    
    24470:X 08 Dec 10:53:12.206 # Sentinel ID is 106e22fad7ad280b2c38542c164f7060b6587d68
    24470:X 08 Dec 10:53:12.206 # +monitor master mymaster 192.168.56.101 6379 quorum 2
    24470:X 08 Dec 10:53:14.321 * +sentinel-address-switch master mymaster 192.168.56.101 6379 ip 192.168.56.102 port 26379 for fae94df5596af315af0f5f97fe7ade3fad0b8a98
    24470:X 08 Dec 10:53:14.336 * +sentinel-address-switch master mymaster 192.168.56.101 6379 ip 192.168.56.103 port 26379 for 8ea722390cabf3ad304b20f8cc42157603d21d84
    
    #需要注意的地方,一旦启动sentinel服务后,服务会自动修改sentinel配置文件/etc/redis/sentinel.conf
    [root@host101 ~]# cat /etc/redis/sentinel.conf 
    port 26379
    daemonize yes
    dir "/tmp"
    logfile "/var/log/sentinel.log"
    sentinel myid 106e22fad7ad280b2c38542c164f7060b6587d68
    sentinel monitor mymaster 192.168.56.101 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 60000
    sentinel auth-pass mymaster mima
    protected-mode no
    # Generated by CONFIG REWRITE
    sentinel config-epoch mymaster 0
    sentinel leader-epoch mymaster 0
    sentinel known-slave mymaster 192.168.56.102 6379
    sentinel known-slave mymaster 192.168.56.103 6379
    sentinel known-sentinel mymaster 192.168.56.103 26379 8ea722390cabf3ad304b20f8cc42157603d21d84
    sentinel known-sentinel mymaster 192.168.56.102 26379 fae94df5596af315af0f5f97fe7ade3fad0b8a98
    sentinel current-epoch 0
    

      4.详细介绍以上几个参数的用途

    sentinel monitor mymaster 192.168.56.101 6379 2
    

      4.1这一行代表sentinel监控的master的名字叫做mymaster,地址为192.168.56.101:6379,行尾最后的一个2代表什么意思呢?我们知道,网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了,当sentinel集群式,解决这个问题的方法就变得很简单,只需要多个sentinel互相沟通来确认某个master是否真的死了,这个2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。(sentinel集群中各个sentinel也有互相通信,通过gossip协议)。

    sentinel down-after-milliseconds mymaster 5000
    

      4.2sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。

    不过需要注意的是,这个时候sentinel并不会马上进行failover主备切换,这个sentinel还需要参考sentinel集群中其他sentinel的意见,如果超过某个数量的sentinel也主观地认为该master死了,那么这个master就会被客观地(注意哦,这次不是主观,是客观,与刚才的subjectively down相对,这次是objectively down,简称为ODOWN)认为已经死了。需要一起做出决定的sentinel数量在上一条配置中进行配置。

    sentinel failover-timeout mymaster 60000
    

      4.3failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。 

      5.测试故障转移

    #任意sentinel节点,查看状态
    [root@host101 ~]# /usr/local/redis/bin/redis-cli -p 26379
    127.0.0.1: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.56.101:6379,slaves=2,sentinels=3
    
    #slave监听sentinel日志
    [root@host102 redis]# tail -f /var/log/sentinel.log
    
    #master杀掉redis-server进程
    [root@host101 ~]# killall redis-server
    
    #slave监听sentinel日志,大概5秒后刷出日志
    [root@host102 redis]# tail -f /var/log/sentinel.log
    6711:X 08 Dec 11:16:15.164 # +sdown master mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:15.223 # +odown master mymaster 192.168.56.101 6379 #quorum 2/2
    6711:X 08 Dec 11:16:15.224 # +new-epoch 1
    6711:X 08 Dec 11:16:15.224 # +try-failover master mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:15.226 # +vote-for-leader fae94df5596af315af0f5f97fe7ade3fad0b8a98 1
    6711:X 08 Dec 11:16:15.232 # 8ea722390cabf3ad304b20f8cc42157603d21d84 voted for fae94df5596af315af0f5f97fe7ade3fad0b8a98 1
    6711:X 08 Dec 11:16:15.232 # 106e22fad7ad280b2c38542c164f7060b6587d68 voted for fae94df5596af315af0f5f97fe7ade3fad0b8a98 1
    6711:X 08 Dec 11:16:15.293 # +elected-leader master mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:15.293 # +failover-state-select-slave master mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:15.346 # +selected-slave slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:15.346 * +failover-state-send-slaveof-noone slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:15.447 * +failover-state-wait-promotion slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:16.273 # +promoted-slave slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:16.273 # +failover-state-reconf-slaves master mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:16.333 * +slave-reconf-sent slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:17.283 * +slave-reconf-inprog slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:17.283 * +slave-reconf-done slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:17.358 # -odown master mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:17.358 # +failover-end master mymaster 192.168.56.101 6379
    6711:X 08 Dec 11:16:17.358 # +switch-master mymaster 192.168.56.101 6379 192.168.56.102 6379
    6711:X 08 Dec 11:16:17.358 * +slave slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.102 6379
    6711:X 08 Dec 11:16:17.358 * +slave slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.102 6379
    6711:X 08 Dec 11:16:22.402 # +sdown slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.102 6379
    
    #再次查看sentinel状态,可以看到master节点已变为原192.168.56.102:6379
    [root@host101 ~]# /usr/local/redis/bin/redis-cli -p 26379
    127.0.0.1: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.56.102:6379,slaves=2,sentinels=3
    

      6.恢复原master192.168.56.101:3679

    #添加redis-server认证密码,因为一开始原master并没有配置这个选项,启动服务
    [root@host101 ~]# echo "masterauth mima" >> /etc/redis/6379.conf
    [root@host101 ~]# /usr/local/redis/bin/redis-server /etc/redis/6379.conf
    
    #检查sentinel日志,检查replication状态,测试读写  

    总结:sentinel只是实现的redis的高可用,并没有实现前端服务的高可用。

    1,keepalived:通过keepalived的虚拟IP,提供主从的统一访问,在主出现问题时,通过keepalived运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟IP不变),坏处是引入keepalived增加部署复杂性, 而且keepalived的应用场景有限,比如它的核心协议VRRP只能工作在局域网内,不能工作在局域网外(网间、广域网),而且在网络不受自己控制时基本不能用,除非设定好的VIP是供局域网使用;
    2,zookeeper:通过zookeeper来监控主从实例,维护最新有效的IP,应用通过zookeeper取得IP,对Redis进行访问; 
    3,sentinel:通过Sentinel监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址(IP PORT)是不同的,当故障发生进行主从切换后,应用程序无法知道新地址,故在Jedis2.2.2中新增了对Sentinel的支持,应用通过redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis实例会及时更新到新的主实例地址。 

  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/hjfeng1988/p/6144352.html
Copyright © 2011-2022 走看看