keepalived是一個是集羣管理中保證集羣高可用的一個服務軟件,它具備心跳檢測的功能。運用在redis上,則是具備主備切換的控制功能。
keepalived的主備切換方案的設計思想如下:
當 Master 與 Slave 均運作正常時, Master負責服務,Slave負責Standby;
當 Master 掛掉,Slave 正常時, Slave接管服務,同時關閉主從複製功能;
當 Master 恢復正常,則從Slave同步數據,同步數據之後關閉主從複製功能,恢復Master身份,於此同時Slave等待Master同步數據完成之後,恢復Slave身份。
然後依次循環。
下面就來大概講下實現過程:
環境準備
主:10.15.34.21
備:10.15.34.22
VIP(虛擬IP):10.15.34.23,10.15.34.24
0.在主機和備機上分別創建用戶部署redis和keepalived,如用戶路徑:/home/cachedb
1.在主機和備機上安裝redis(過程略);
2.在主機和備機上安裝keepalived(過程略);
3.修改主機和備機上的keepalived的配置文件keepalived.conf(可將原有的配置文件備份成keepalived.conf.bak)
1)主機的keepalived配置:
! Configuration File for keepalived global_defs { router_id LVS_REDIS_TEST_21 } vrrp_script chk_redis_1 { script "/home/cachedb/redis/scripts/redis_check.sh 10.15.34.21 38001" interval 10 timeout 2 fall 3 } vrrp_script chk_redis_2 { script "/home/cachedb/redis/scripts/redis_check.sh 10.15.34.21 38002" interval 10 timeout 2 fall 3 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 40 priority 150 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_redis_1 } virtual_ipaddress { 10.15.34.23 } notify_master "/home/cachedb/redis/scripts/redis_master.sh 10.15.34.21" notify_backup "/home/cachedb/redis/scripts/redis_backup.sh 10.15.34.21 38001 10.15.34.22 38001" notify_fault "/home/cachedb/redis/scripts/redis_fault.sh" notify_stop "/home/cachedb/redis/scripts/redis_stop.sh" } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 41 priority 150 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_redis_2 } virtual_ipaddress { 10.15.34.54 } notify_master "/home/cachedb/redis/scripts/redis_master.sh 10.15.34.21 38002" notify_backup "/home/cachedb/redis/scripts/redis_backup.sh 10.15.34.21 38002 10.15.34.22 38002" notify_fault "/home/cachedb/redis/scripts/redis_fault.sh" notify_stop "/home/cachedb/redis/scripts/redis_stop.sh" }
2)備機的keepalived配置:
! Configuration File for keepalived global_defs { router_id LVS_REDIS_TEST } vrrp_script chk_redis_1 { script "/home/cachedb/redis/scripts/redis_check.sh 10.15.34.22 38001" interval 10 timeout 2 fall 3 } vrrp_script chk_redis_2 { script "/home/cachedb/redis/scripts/redis_check.sh 10.15.34.22 38002" interval 10 timeout 2 fall 3 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 40 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_redis_1 } virtual_ipaddress { 10.15.34.33 } notify_master "/home/cachedb/redis/scripts/redis_master.sh 10.15.34.22 38001" notify_backup "/home/cachedb/redis/scripts/redis_backup.sh 10.15.34.22 38001 10.15.34.21 38001" notify_fault "/home/cachedb/redis/scripts/redis_fault.sh" notify_stop "/home/cachedb/redis/scripts/redis_stop.sh" } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 41 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_redis_2 } virtual_ipaddress { 10.15.34.34 } notify_master "/home/cachedb/redis/scripts/redis_master.sh 10.15.34.22 38002" notify_backup "/home/cachedb/redis/scripts/redis_backup.sh 10.15.34.22 38002 10.15.34.21 38002" notify_fault "/home/cachedb/redis/scripts/redis_fault.sh" notify_stop "/home/cachedb/redis/scripts/redis_stop.sh" }
注意:
a. 備機的keepalived配置的priority要比主機的低;
b. 備機不能有nopreempt屬性;
c. virtual_router_id 這個主備配置的要對應一致,並且在局域網要唯一,注意使用默認的ID如51時要check改ID有木有被佔用,若有就換一個。
d. interface eth0這個表名虛擬ip漂移的網卡爲eth0,注意應該確保主備都有網卡eth0(沒有的話也可以是eth1,eth2等)。可以用ifconfig來查看,並且主備都應該是相同的網卡eth~
配置完以後:
1)啓動主機的redis服務,再在root下啓動keepalived服務;
2)啓動備機的redis服務,再在root下啓動keepalived服務;
3)查看主機的角色:
./redis-cli -h 10.15.34.21 -p 38001
查看備機的角色:
./redis-cli -h 10.15.34.22 -p 38001
查看主機的redis-state的log日誌:(Log日誌的位置由redis_*.sh腳本文件裏指定)
再查看備機的redis-state的log日誌:
4)嘗試kill掉主機的redis服務,再在備機上查看role角色,得到:
可以看出它變成master了,而與此同時,它的redis-state.log日誌如下:
1)我們不妨在備機上用root用戶查看VIP的漂移情況:(虛擬IP的漂移需要一小段時間,不是立刻~)
ip a
在備機上可以發現虛擬IP的漂移情況。
1)而如果再重啓之前master上的redis服務,會發現它的角色是slave了,這說明,master和salve發生了角色互換。
2)可以再嘗試把備機上的redis服務kill掉,會發現主機上的角色會恢復成master;可以在主機上使用root用戶來運行 ip a命令,會發現虛擬IP被漂移到主機上了。
系統日誌位置:/var/log/messages