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  從  sentinelredis

安裝:
    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.servicevim

驗證:
    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:125451centos

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
    #全部節點配置都同樣bash

啓動:
    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別名不能釋義ui

    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=3spa

查看配置有變更:
    [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.ship

    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

相關文章
相關標籤/搜索