第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在做failover的時候會執行這個腳本,並且傳遞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集羣狀態
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
查看sentinel狀態
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