1. 程式人生 > >Redis高可用架構—Keepalive+VIP

Redis高可用架構—Keepalive+VIP

master ace tin 圖片 not per 經典 ron ast

最近整理一下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實例。

目前我們DBA已經否定了這種架構,不再支持部署這種集群。
適合場景:並發請求不是很高的應用。

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