redis 单主节点 + redis-sentinel + vip漂移

centos 7.3
三台机器:
    192-168-1-103  10.36.8.223  主  sentinel
    192-168-1-102  10.36.8.109  从  sentinel
    192-168-1-104  10.36.8.108  从  sentinel

安装:
    yum -y install redis
    cp /etc/redis.conf{,.bak}
    cp /etc/redis-sentinel.conf{,.bak}
    
redis配置:    
    主:
    bind 0.0.0.0    #绑定地址
    protected-mode no 
    port 6379       #端口
    daemonize yes   #以守护进程的方式在后台启动
    pidfile "/var/run/redis_6379.pid"   #进程文件
    loglevel notice   #日志等级
    logfile "/var/log/redis/redis.log"   #日志输出位置
    dbfilename "dump.rdb"     #持久化方式
    dir "/var/lib/redis"      #保存位置
    masterauth "123456"       #主从做切换时认证需要用到,当此节点成为主节点是有用,所以所有节点都配置
    requirepass "123456"      #本地认证密码
    
    从:多加一个这个配置
    slaveof 10.36.8.222 6379
    
启动:
    systemctl start redis.service

验证:
    netstat -tnlp 
    redis-cli -a 123456 info replication   #查看主从状态信息
    [root@host-192-168-1-103 ~]# redis-cli  -p 6379 -a 123456 info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=10.36.8.109,port=6379,state=online,offset=125452,lag=0
    slave1:ip=10.36.8.108,port=6379,state=online,offset=125313,lag=1

    master_repl_offset:125452
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:125451

redis-sentinel配置:
    protected-mode no
    daemonize yes  
    bind 0.0.0.0
    port 26379
    dir "/tmp"
    sentinel monitor mymaster 10.36.8.222 6379 2    #mymaster作为master的别名,后面绑定master的ip和端口,2根据节点数来设置,这里表示当超过两个节点都同意master断了才通过
    sentinel auth-pass mymaster 123456              #需要监听master的状态,所以放在上面的后面,不然不知道mymaster是谁,同时监听master需要认证
    logfile "/var/log/redis/sentinel.log"
    sentinel down-after-milliseconds mymaster 10000     如果10秒内master8000没有响应,就认为SDOWN
    sentinel failover-timeout mymaster 15000
    #所有节点配置都一样

启动:
    systemctl start redis-sentinel.service 
    
验证:
    如果日志报
    7634:X 17 Apr 11:37:46.176 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    7634:X 17 Apr 11:37:46.176 # Sentinel ID is 36585ad02dec7a6cf5abeb499758abab3e330b98
    7634:X 17 Apr 11:37:46.176 # +monitor master mymaster 10.36.8.222 6379 quorum 2
    7634:X 17 Apr 11:38:16.232 # +sdown master mymaster 10.36.8.222 6379

    一般是是认证失败
    sentinel auth-pass mymaster 123456 必须写在 sentinel monitor mymaster 10.36.8.222 6379 2 之后
    不然 主机mymaster别名不能释义

    7634:X 17 Apr 11:56:50.150 # User requested shutdown...
    7634:X 17 Apr 11:56:50.150 # Sentinel is now ready to exit, bye bye...
    这个可以通过sentinel是否启动以及两种日志来来排查
    netstat -tnlp 
    tail -300f /var/log/messages
    redis-sentinel /etc/redis-sentinel
        
    若成功:
    [root@host-192-168-1-103 ~]# redis-cli  -p 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=10.36.8.222:6379,slaves=2,sentinels=3

查看配置有变动:
    [root@host-192-168-1-103 ~]# grep -v -E "^#|^$" /etc/redis-sentinel.conf 
    protected-mode no
    daemonize yes  
    bind 0.0.0.0
    port 26379
    dir "/tmp"
    sentinel myid 36585ad02dec7a6cf5abeb499758abab3e330b98   #生产的节点id
    sentinel monitor mymaster 10.36.8.222 6379 2
    sentinel notification-script mymaster /tmp/ceshi.sh
    sentinel auth-pass mymaster 123456
    sentinel config-epoch mymaster 0
    logfile "/var/log/redis/sentinel.log"
    sentinel leader-epoch mymaster 0
    #redis节点的信息
    sentinel known-slave mymaster 10.36.8.109 6379
    sentinel known-slave mymaster 10.36.8.108 6379

    #redis-sentinel节点信息
    sentinel known-sentinel mymaster 192.168.1.102 26379 a9498fa128582873584d985b92ec4fe2fa9e1196
    sentinel known-sentinel mymaster 192.168.1.104 26379 3cb4035f5564cbb8274914f1db5c0ca0bee2f940

    sentinel current-epoch 0

down掉主10.36.8.222:
    systemctl stop redis.service
    [root@host-192-168-1-103 ~]# redis-cli -a 123456 info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=10.36.8.108,port=6379,state=online,offset=546968,lag=1
    slave1:ip=10.36.8.109,port=6379,state=online,offset=546968,lag=0
    master_repl_offset:546968
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:546967
    [root@host-192-168-1-103 ~]# 
    [root@host-192-168-1-103 ~]# systemctl stop redis.service
    [root@host-192-168-1-103 ~]# redis-cli -a 123456 info replication        
    Could not connect to Redis at 127.0.0.1:6379: Connection refused
    
    redis-sentinel在配置的时间内有指定的节点数同意时会重新选举
    797:X 17 Apr 16:29:29.065 # +sdown master mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.145 # +odown master mymaster 10.36.8.222 6379 #quorum 2/2
    797:X 17 Apr 16:29:29.145 # +new-epoch 7
    797:X 17 Apr 16:29:29.145 # +try-failover master mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.157 # +vote-for-leader 3cb4035f5564cbb8274914f1db5c0ca0bee2f940 7
    797:X 17 Apr 16:29:29.291 # 36585ad02dec7a6cf5abeb499758abab3e330b98 voted for 3cb4035f5564cbb8274914f1db5c0ca0bee2f940 7
    797:X 17 Apr 16:29:29.298 # +elected-leader master mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.298 # +failover-state-select-slave master mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.384 # +selected-slave slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.384 * +failover-state-send-slaveof-noone slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.457 * +failover-state-wait-promotion slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.692 # +promoted-slave slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.692 # +failover-state-reconf-slaves master mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:29.745 * +slave-reconf-sent slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:30.403 # -odown master mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:30.506 * +slave-reconf-inprog slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:31.543 * +slave-reconf-done slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:31.595 # +failover-end master mymaster 10.36.8.222 6379
    797:X 17 Apr 16:29:31.595 # +switch-master mymaster 10.36.8.222 6379 10.36.8.109 6379
    797:X 17 Apr 16:29:31.595 * +slave slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.109 6379
    797:X 17 Apr 16:29:31.595 * +slave slave 10.36.8.222:6379 10.36.8.222 6379 @ mymaster 10.36.8.109 6379
    
    由上日志可以指定新的master是10.36.8.109
    注意点,所有Redis.conf 当中masterauth以及requirepass得提前设置好,sentinel切换的时候只会修改slaveof、sentinel monitor mymaster以及添加从节点和sentinel节点
    如果认证没有提前设置,主节点down掉之后,重新选举的新主节点,其它从节点会因为无法认证通过而失败

 
从10.36.8.108 查看的信息:
    [root@host-192-168-1-104 ~]#  redis-cli -a 123456 info replication
    # Replication
    role:slave
    master_host:10.36.8.222

    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:551027
    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
    [root@host-192-168-1-104 ~]#  redis-cli -a 123456 info replication
    # Replication
    role:slave
    master_host:10.36.8.109

    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:23113
    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

    当down掉的节点挂掉重新启动时,会重新以slave的加入
        
vip 漂移
    开启配置
    vim /etc/redis-sentinel.conf 
    sentinel client-reconfig-script mymaster /var/redis/notify_mymaster.sh

    chmod +x  /var/redis/notify_mymaster.sh

    #!/usr/bin/env bash

    Master_Ip=$6   #master地址
    Local_Ip="10.36.8.108"
    Vip="10.36.8.223"
    NetMask="24"
    Interface="eth0"

    if [[ $Master_Ip == $Local_Ip ]];
    then
        /usr/sbin/ip  addr  add ${Vip}/${NetMask}  dev ${Interface}  #将VIP绑定到该服务器上
        /usr/sbin/arping -q -c 3 -A ${Vip} -I ${Interface}   #arp抑制
    else
        /usr/sbin/ip  addr del  ${Vip}/${NetMask}  dev ${Interface}   #将VIP从该服务器上删除
        exit 0
    fi
    exit 1


    第一次配置得手动指定VIP地址
    ip addr add 10.36.8.223/24 dev eth0
    arping -q -c 3 -A 10.36.8.223 -I eth0

猜你喜欢

转载自my.oschina.net/u/2343310/blog/1796915