Redis高可用
需求
(1)Redis運行在docker容器中;(2)實現雙機熱備,當redis-master異常時,redis-slave快速切換成master提供服務。
(3)當redis-master資料更新時,redis-slave資料能同步更新。 解決方案
利用keepalived實現redis的高可用。keepalived利用shell指令碼,定期檢測redis服務是否正常。當redis服務異常時,利用虛擬IP的漂移實現故障切換。 部署實現
1.環境說明
| 對象 |
版本 |
備忘 |
| redis-master主機 |
centos 7 |
IP:XX.XX.93.179 |
| redis-slave主機 |
centos 7 |
IP:XX.XX.93.182 |
keepalived軟體版本:1.2.13
天擎6的skylar-redis鏡像包版本:1600
虛擬IP地址:XX.XX.93.180。注意:要選擇沒有被佔用的虛擬IP地址
2.安裝
(1)在master、slave主機上,都需安裝keepalived、ipvsadm
$ yum -y install ipvsadm keepalived
查看keepalived是否安裝成功:
$ keepalived -vKeepalived v1.2.13 (03/06,2015)
(2)在master、slave主機上,都需啟動skylar-redis容器
$ docker run --name=redis --restart=always -d --net=host --privileged=true -v /data/redis:/var/lib/redis/ skylar_redis
(3)配置keepalived,添加shell指令碼。
master、slave主機的/etc/keepavlied/keepavlied.conf都需要修改,內容略微不同。
實際安裝時,需要將此設定檔中的interface、virtual_ipaddress、master_ip、slave_ip進行修改
在master主機上,keepalived.conf內容如下:
$ cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id redis100}vrrp_script chk_redis{ script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 6379" interval 2 timeout 2 fall 3}vrrp_instance redis { state MASTER # master set to SLAVE also interface eno16777984 ## 修改為實際網卡名稱 virtual_router_id 50 priority 150 nopreempt # no seize,must add advert_int 1authentication { #all node must same# auth_type PASS# auth_pass 1111 } virtual_ipaddress { XX.XX.93.180 ## 修改為實際分配的虛擬IP地址 } track_script { chk_redis } notify_master "/etc/keepalived/scripts/redis_master.sh 127.0.0.1 10.16.93.182 6379" ## 10.16.93.182應修改為實際的slave IP地址 notify_backup "/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 10.16.93.182 6379" ## 10.16.93.182應修改為實際的slave IP地址 notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh}
在slave主機上,keepalived.conf內容如下:
$ cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id redis101}vrrp_script chk_redis{ script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 6379" interval 2 timeout 2 fall 3}vrrp_instance redis { state BACKUP interface eno16777984 ##需要修改為實際網卡名稱 virtual_router_id 50 priority 100 advert_int 1authentication { #all node must same auth_type PASS auth_pass 1111 } virtual_ipaddress { XX.XX.93.180 ##需要修改為實際分配的虛擬IP } track_script { chk_redis } notify_master "/etc/keepalived/scripts/redis_master.sh 127.0.0.1 XX.XX.93.179 6379" ## XX.XX.93.179需要修改為實際的master主機IP notify_backup "/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 XX.XX.93.179 6379" ## XX.XX.93.179需要修改為實際的master主機IP notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh}
在master和slave主機上,添加/etc/keepalived/scripts目錄和redis_master.sh、redis_backup.sh、redis_fault.sh、redis_stop.sh檔案。最終目錄結構如下:
$ pwd/etc/keepalived$ tree.├── keepalived.conf└── scripts ├── redis_backup.sh ├── redis_check.sh ├── redis_fault.sh ├── redis_master.sh └── redis_stop.sh1 directory, 6 files
redis_master.sh、redis_backup.sh、redis_fault.sh、redis_stop.sh檔案在github中可以下載,下載連結:
https://github.com/qinguanri/Redis_HA
下面簡單列出幾個shell檔案的內容:
$ cat redis_master.sh #!/bin/bashREDISCLI="docker exec redis /usr/bin/redis-cli -h $1 -p $3" LOGFILE="/var/log/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILEecho "Run MASTER cmd ..." >> $LOGFILE$REDISCLI SLAVEOF $2 $3 >> $LOGFILEsleep 10 #delay 10 s wait data async cancel syncecho "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE$ cat redis_backup.sh #!/bin/bashREDISCLI="docker exec redis /usr/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF $2 $3 >> $LOGFILE 2>&1sleep 15 #delay 15 s wait data sync exchange role$ cat redis_check.sh #!/bin/bashALIVE=`docker exec redis /usr/bin/redis-cli -h $1 -p $2 PING`LOGFILE="/var/log/keepalived-redis-check.log"echo "[CHECK]" >> $LOGFILEdate >> $LOGFILEif [ "$ALIVE" == "PONG" ]; then : echo "Success: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1 exit 0else echo "Failed: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1 exit 1fi
3.啟動keepalived
在master主機、slave主機上執行以下命令啟動keepalived
$ systemctl start keepalived.service
4.驗證\類比故障