Redis高可用架構—Keepalive+VIP
最近整理一下Redis高可用架構的文檔,也準備分享出來,雖然這些架構也不是很復雜。Redis的高可用方案目前主要嘗試過5種方式,其中2種方式已經在線上使用。
1)Redis Master-Slave + Keepalive + VIP。
這是很經典的db架構,也可以用與mysql的主從切換。
基本原理是:Keepalive通過腳本檢測master的存活,然後通過漂移VIP(Virtual IP)完成主從切換。
2)Redis Master-Slave + DNS Service + Sentinel。
基本原理是Sentinel集群進行Redis的存活檢測和Redis M-S狀態切換。
完成切換之後,sentinel調用notification-script參數制定的配置文件,通知DNS Server更改DNS配置,master dns解析執行新的master。
3)Redis Master-Slave + Configure Center(Zookeeper) + Sentinel.
基本原理和第三種方案相似,只是notification-script通知的是配置中心完成redis連接配置的修改,比如Zookeeper實現的配置中心。
4)Redis Master-Slave + Sentinel + Twemproxy + Lvs.
這種方案層次比較多,sentinel通知twemproxy進行redis m-s的配置更改。
5)Redis Cluster,目前redis3.0接近發布stable版本了。
1、基本架構圖
2、基本構建與原理
1)Keepalive + VIP : 在redis master-slave上部署keepalived、redis instance存活檢測腳本、以及告警通知腳本。
2)當redis master失效的時候,VIP從master上漂移到slave上,完成m-s角色和配置更改。
3)客戶端連接redis的參數中host設置的是VIP,整個切換過程對客戶端透明。
3、優缺點與適用場景。
優點:實現簡單,成本低。
缺點:整個集群的最大吞吐量受限於redis單實例的處理能力,除非一個應用使用多套這種Keepalive+VIP方案。
因而擴展能力較差,而且不適合目前單機部署多個redis實例的部署場景,而我們的一個物理機上至少部署8個redis實例。
適合場景:並發請求不是很高的應用。
4、Keepalive配置和檢測腳本
下面keepalive的簡單配置、檢測和通知腳本。
1)keepalive.conf
master和slave使用相同的配置腳本,其中要註意的地方state的配置都是backup狀態,而且都是非搶占方式nopreempt。
vrrp_script chk_redis { script "/etc/keepalived/redis_check.sh" interval 2 } vrrp_instance VI_1 { state BACKUP interface bond0 virtual_router_id 51 priority 100 nopreempt authentication { auth_type PASS auth_pass redis } track_script { chk_redis } virtual_ipaddress { 10.203.31.216 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" }
2)redis_check.sh,redis實例存活檢測腳本。
當master檢測到redis處於failed狀態,將會釋放VIP,slave機器將會獲取VIP。
#!/bin/bash REDIS_BIN=‘/apps/svr/redis/bin‘ REDIS_MASTER_HOST=‘127.0.0.1‘ REDIS_MASTER_PORT=6379 ALIVE=`$REDIS_BIN/redis-cli -h $REDIS_MASTER_HOST -p $REDIS_MASTER_PORT PING` if [ "$ALIVE" == "PONG" ]; then echo $ALIVE exit 0 else echo $ALIVE exit 1 fi
3)master-slave狀態切換通知腳本,包括推送告警短信。
notify.sh
#!/bin/bash REDIS_BIN=‘/apps/svr/redis/bin‘ MASTER_IP=‘192.168.0.216‘ # virtual ip MASTER_PORT=6379 status=$1 echo $status if [ "$status" = "master" ] then # promoting slave to master echo " config set slave-read-only no " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo " slaveof no one " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo " config rewrite " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT # pushing simple message to mobile or email elif [ "$status" = "backup" ] then # degrading master to slave echo "config set slave-read-only yes " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo "slaveof $MASTER_IP $MASTER_PORT" | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT echo " config rewrite " | $REDIS_BIN/redis-cli -h 127.0.0.1 -p $MASTER_PORT # pushing simple message to mobile or email fi exit 0
轉自:http://mdba.cn/?p=745
Redis高可用架構—Keepalive+VIP