原文:https://www.jianshu.com/p/c2ab606b00b7
客戶端程序
SENTINEL get-master-addr-by-name <master name>
就能得到當前主redis的ip和port。

客戶端每次連接redis前,先向sentinel發送請求,獲得主redis的ip和port,然后用返回的ip和port連接redis。
這種方法的缺點是顯而易見的,每次操作redis至少需要發送兩次連接請求,第一次請求sentinel,第二次請求redis。
php請求sentinel程序代碼可參見:https://github.com/huyanping/redis-sentinel
更好的辦法是使用VIP,當然這對配置的環境有一定的要求,比如redis搭建在阿里雲服務器上,可能不支持VIP。
VIP方案是,redis系統對外始終是同一ip地址,當redis進行故障轉移時,需要做的是將VIP從之前的redis服務器漂移到現在新的主redis服務器上。
比如:當前redis系統中主redis的ip地址是192.168.56.101,那么VIP(192.168.56.250)指向192.168.56.101,客戶端程序用VIP(192.168.56.250)地址連接redis,實際上連接的就是當前主redis,這樣就避免了向sentinel發送請求。
當主redis宕機,進行故障轉移時,192.168.56.102這台服務器上的redis提升為主,這時VIP(192.168.56.250)指向192.168.56.102,這樣客戶端程序不需要修改任何代碼,連接的是192.168.56.102這台主redis。
VIP指向192.168.56.101:


漂移VIP
那么現在的問題是,如何在進行redis故障轉移時,將VIP漂移到新的主redis服務器上。
這里可以使用redis sentinel的一個參數client-reconfig-script,這個參數配置執行腳本,sentinel在做failover的時候會執行這個腳本,並且傳遞6個參數<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中<to-ip>是新主redis的IP地址,可以在這個腳本里做VIP漂移操作。
sentinel client-reconfig-script master8000 /opt/notify_master6800.sh
修改三個服務器的redis-sentinel配置文件/etc/sentinel.conf,增加上面一行。然后在/opt/目錄下創建notify_master6800.sh腳本文件,這個腳本做VIP漂移操作,內容如下:
#notify_master6800.sh腳本內容 #!/bin/bash MASTER_IP=$6 #第六個參數是新主redis的ip地址 LOCAL_IP='192.168.56.101' #其他兩個服務器上為192.168.56.102,192.168.56.103 VIP='192.168.56.250' NETMASK='24' INTERFACE='eth1' if [ ${MASTER_IP} = ${LOCAL_IP} ];then /sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE} #將VIP綁定到該服務器上 /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE} exit 0 else /sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE} #將VIP從該服務器上刪除 exit 0 fi exit 1 #如果返回1,sentinel會一直執行這個腳本
現在當前主redis是192.168.56.102,需要手動綁定VIP到該服務器上。
/sbin/ip addr add 192.168.56.250/24 dev eth1 /sbin/arping -q -c 3 -A 192.168.56.250 -I eth1
然后,去另一個服務器上通過VIP地址連接redis-server和redis-sentinel。
通過VIP連接redis:
從上面也可以看出當前主redis是192.168.56.102。
下面關閉這台redis服務,看看VIP是否漂移到另一台服務器上。
redis-cli -h 192.168.56.102 -p 8000 shutdown

通過查詢sentinel發現192.168.56.103提升為主。

通過訪問VIP連接redis,發現VIP確實指向了192.168.56.103。
總結
通過上面的操作,使用redis主從 + 哨兵(sentinel)+ 漂移VIP的方案搭建了一個redis高可用系統,但這個系統保證的是單個redis實例的高可用,所以適合業務比較小的應用。如果業務比較大,並發量比較高,建議搭建redis集群,比如官方redis cluster,還有開源的codings集群。
另外,漂移VIP可以使用keepalived軟件來實現,這里就不多介紹了。