天天看點

sentinel + vip 實作redis主從模式高可用

第1章 環境說明:

1.1系統版本:

cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)      

1.2redis主從:

       10.3.7.22:7001-主
       10.3.7.25:7001-從
       10.3.7.28:7001-從      

1.3哨兵:

       10.3.7.22:6800
       10.3.7.25:6800
       10.3.7.28:6800      

1.4VIP

 10.3.11.11      

第2章 搭建redis主從模式

yum安裝redis後修改下配置檔案即可,這裡redis主從的搭建就不粘貼了

第3章 配置redis-sentinel模式

三個節點的配置,隻要保證sentinel myid不同即可,按照這個配置檔案應該是可以的,哨兵的配置檔案比較坑,網上看了好多資料,結果啟動都是報錯,我貼的這個可以試試,應該不會,如果報錯logsfile不存在的話記得touch一下

cat /etc/redis-sentinel.conf
port 6800
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel myid 82aab24bc703376697a7893302d6096e60766483
sentinel monitor mymaster 10.3.7.22 7001 2
sentinel down-after-milliseconds mymaster 5000
 
sentinel failover-timeout mymaster 15000
sentinel client-reconfig-script mymaster /opt/notify_master6800.sh
sentinel auth-pass mymaster kkQZ4_JkjcZN      

第4章 配置vip自動漂移的執行腳本:

4.1下面的LOCAL_IP改成每個節點自己的ip

cat /opt/notify_master6800.sh
#!/bin/bash
 
MASTER_IP=$6
LOCAL_IP='10.3.7.22'
NETMASK='24'
INTERFACE='eth0'
VIP='10.3.11.11'
 
if [ ${MASTER_IP} = ${LOCAL_IP} ];then
    ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
    arping -c 1 -I ${INTERFACE} -U ${VIP}
    exit 0
else
    ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
    exit 0
fi
exit 1      

4.2遇到問題

腳本配置好以後應該檢查下是否可以正常執行,因為我在第一次模拟故障的時候發現vip沒有飄逸,手動執行腳本後發現以下報錯:

-bash: $'\302\240ip': command not found      

由于之前的腳本是我在網上複制下來的,懷疑字元集有問題,于是删除腳本,幹脆手敲了一遍,再次模拟故障,vip切換成功

4.3腳本參數說明:

client-reconfig-script:這個參數配置執行腳本,sentinel在做故障轉移的時候會執行這個腳本,并且傳遞6個參數<master-name>、<role>、<state>、<from-ip>、<from-port>、<to-ip> 、<to-port>,其中<to-ip>是新主redis的IP位址,可以在這個腳本裡做VIP漂移操作,腳本編寫好以後,可以自己加上以上六個參數執行腳本,檢查是否有問題

第5章 檢視所有節點哨兵狀态

每個節點均看到以下輸出即可

# redis-cli -h 10.3.7.22 -p 6800  info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:8
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.3.7.22:7001,slaves=2,sentinels=3      

第6章 綁定vip到redis主伺服器

6.1我的vip是騰訊上買的,因為伺服器是騰訊雲的伺服器

手動将vip綁定到主伺服器上,因為是第一次綁定,後面故障的話回自動進行切換

ip addr add 10.3.11.11/24 dev eth0      

arp抑制

/usr/sbin/arping -c 1 -I eth0 -U 10.3.11.11      

配置好vip以後,需要檢視redis服務綁定的端口是否為0.0.0.0,即redis配置檔案中bind是否為全部綁定

第7章 通過vip連接配接進行測試

redis-cli -h 10.3.11.11 -p 7001 -a kkQZ4_JkjcZN info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.3.7.25,port=7001,state=online,offset=84533,lag=0
slave1:ip=10.3.7.28,port=7001,state=online,offset=84533,lag=0
master_repl_offset:84533
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84532      
redis-cli -h 10.3.11.11 -p 6800  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.3.7.22:7001,slaves=2,sentinels=3      

第8章 故障測試:

8.1kill掉主機點的redis模拟故障

[root@test-ops-redis-mha-1 opt]# ps -ef |grep redis
redis    9758     1  0 17:21 ?        00:00:00 /bin/redis-server 0.0.0.0:7001
root     9925 24205  0 17:23 pts/0    00:00:00 grep --color=auto redis
root    28539     1  0 14:47 ?        00:00:11 redis-sentinel 0.0.0.0:6800 [sentinel]
[root@test-ops-redis-mha-1 opt]# kill -9 9758      

8.2vip已經漂移過去了

[root@test-ops-redis-mha-2 opt]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
   link/ether 52:54:00:bb:87:ec brd ff:ff:ff:ff:ff:ff
    inet 10.3.7.25/24 brd 10.3.7.255 scope global eth0
      valid_lft forever preferred_lft forever
    inet 10.3.11.11/24 scope global eth0
      valid_lft forever preferred_lft forever      

8.3連接配接vip測試

[root@test-ops-redis-mha-1 opt]# redis-cli -h 10.3.11.11 -p 7001 -a kkQZ4_JkjcZN info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.3.7.28,port=7001,state=online,offset=5628,lag=0
master_repl_offset:5764
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5763      

繼續閱讀