使用keepalived實現Redis雙機熱備、高可用

來源:互聯網
上載者:User
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.驗證\類比故障

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.