Redis基于keepalived的高可用實現
方案拓撲圖
測試方案
1. 手動關閉AppM keepalived進程確認keepalived主從變化,AppS1是否變更為主
2. 開啟keepalived,手動關閉 AppM redis進程確認ipvsadm ip池是否剔除AppM
3. 開啟AppM redis進程,確認AppM是否變更為主
環境準備
服務器信息
配置服務器host
在Manager機器上配置好hosts后通過ansible下發到所有應用服務器
# ansible app -m copy -a "src=/etc/hosts dest=/etc/hosts owner=root group=root mode=0644 backup=yes"
//抽查對應服務器確認host無誤后繼續
安裝配置keepalived
//安裝keepalived ipvsadm
# ansible app -m command -a 'yum install keepalived ipvsadm -y'
//分發配置文件
# ansible AppM -m copy -a 'src=/data/ansible/config/keepalived/keepalived.conf-redis-Mrds dest=/etc/keepalived/keepalived.conf backup=yes' # ansible apps -m copy -a 'src=/data/ansible/config/keepalived/keepalived.conf-redis-Srds dest=/etc/keepalived/keepalived.conf backup=yes'
//登錄AppS2
AppS3修改priority值
//運行keepalived
# ansible app -m command -a 'service keepalived restart' # ansible app -m command -a 'pidof keepalived'
//ip池
測試
1. 手動關閉AppM keepalived進程確認keepalived主從變化,AppS1是否變更為主
a> Vip資源已切換至AppS1,但同時我們也發現redis主從并沒有切換
2. 開啟keepalived,手動關閉 AppM redis進程確認ipvsadm ip池是否剔除AppM
3. 開啟AppM redis進程,確認AppM是否變更為主
Redis會立刻同步服務到ip池
小總
a> Keepalived相對heartbeat要輕量簡單,ipvsadm也由keepalived協助完成
b> Keepalived的redis應用場景需多master且mater互為同步,或
c> Keepalived的響應速度極快,異常進程或實例恢復后都能迅速發現并實施既定措施
d> 想通過redis自帶的sentinel和keepalived結果會有些難度,也不建議
附件
keepalived.conf-redis-Srds
global_defs { notification_email { lisongtao@ihuilian.com } notification_email_from sa@ihuilian.com smtp_server smtp.exmail.qq.com smtp_connect_timeout 30 router_id LVS_DEVEL ##自定義的字符串 } ###在哪里找到自定義配置規范 #vrrp_script chk_nginx_down { #定義可以手動控制狀態的腳本 # script "killall -0 nginx" # interval 1 #檢查時間間隔 # weight - 13 #如果檢測失敗,優先級-13 #} vrrp_script chk_redis_down { #定義可以手動控制狀態的腳本 script "killall -0 redis-server" interval 1 #檢查時間間隔 weight -2 #如果檢測失敗,優先級-13 } vrrp_instance VI_1 { state BACKUP ###MASTER/BACKUP必須大寫,且當MASTER恢復時,會自動恢復為MASTER狀態 interface eth0 virtual_router_id 51 ###同一個vrrp使用相同的vrrp,整個vrrp內唯一 priority 99 ###數字越大優先級越高,且要MASTER要高于SLAVE,和sentinel恰好相反...>O< advert_int 1 ###Timeout時長秒為單位 authentication { ###MASTER和SLAVE密碼相同方可正常通信 auth_type pass auth_pass huilian } virtual_ipaddress { ###每個地址占一行,不能指定子網掩碼,與lvs客戶端設定的VIP一致 192.168.1.200 #192.168.200.17 #192.168.200.18 } ###跟global_defs中定義的vrrp_script chk_nginx_down對應 #track_script { #引用定義的腳本 # chk_nginx_down #} track_script { #引用定義的腳本 chk_redis_down } #notify_master "/etc/keepalived/notify.sh master" #notify_backup "/etc/keepalived/notify.sh backup" #notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 192.168.1.200 6379{ ###IP和vrrp_instance中定義的vip需一致,IP PORT delay_loop 6 ###健康檢查時間/秒 #lb_algo wlc ###負載均衡調度算法,常用rr/wlc lb_algo rr ###負載均衡調度算法,常用rr/wlc lb_kind DR ###負載均衡轉發規則, DR,NAT,TUN3 nat_mask 255.255.255.0 #persistence_timeout 50 ###會話保持時長 protocol TCP ###協議類型轉發 real_server 192.168.1.36 6379{ ###real server IP PORT weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } real_server 192.168.1.37 6379{ weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } real_server 192.168.1.38 6379{ weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } real_server 192.168.1.39 6379{ weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } }
keepalived.conf-redis-Mrds
global_defs { notification_email { lisongtao@ihuilian.com } notification_email_from sa@ihuilian.com smtp_server smtp.exmail.qq.com smtp_connect_timeout 30 router_id LVS_DEVEL ##自定義的字符串 } ###在哪里找到自定義配置規范 #vrrp_script chk_nginx_down { #定義可以手動控制狀態的腳本 # script "killall -0 nginx" # interval 1 #檢查時間間隔 # weight - 13 #如果檢測失敗,優先級-13 #} vrrp_script chk_redis_down { #定義可以手動控制狀態的腳本 script "killall -0 redis-server" interval 1 #檢查時間間隔 weight -2 #如果檢測失敗,優先級-13 } vrrp_instance VI_1 { state MASTER ###MASTER/BACKUP必須大寫,且當MASTER恢復時,會自動恢復為MASTER狀態 interface eth0 virtual_router_id 51 ###同一個vrrp使用相同的vrrp,整個vrrp內唯一 priority 100 ###數字越大優先級越高,且要MASTER要高于SLAVE,和sentinel恰好相反...>O< advert_int 1 ###Timeout時長秒為單位 authentication { ###MASTER和SLAVE密碼相同方可正常通信 auth_type pass auth_pass huilian } virtual_ipaddress { ###每個地址占一行,不能指定子網掩碼,與lvs客戶端設定的VIP一致 192.168.1.200 #192.168.200.17 #192.168.200.18 } ###跟global_defs中定義的vrrp_script chk_nginx_down對應 #track_script { #引用定義的腳本 # chk_nginx_down #} track_script { #引用定義的腳本 chk_redis_down } #notify_master "/etc/keepalived/notify.sh master" #notify_backup "/etc/keepalived/notify.sh backup" #notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 192.168.1.200 6379{ ###IP和vrrp_instance中定義的vip需一致,IP PORT delay_loop 6 ###健康檢查時間/秒 #lb_algo wlc ###負載均衡調度算法,常用rr/wlc lb_algo rr ###負載均衡調度算法,常用rr/wlc lb_kind DR ###負載均衡轉發規則, DR,NAT,TUN3 nat_mask 255.255.255.0 #persistence_timeout 50 ###會話保持時長 protocol TCP ###協議類型轉發 real_server 192.168.1.36 6379{ ###real server IP PORT weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } real_server 192.168.1.37 6379{ weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } real_server 192.168.1.38 6379{ weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } real_server 192.168.1.39 6379{ weight 1 ###數值越大,權重越大 TCP_CHECK { connect_timeout 1 #表示3秒無響應,則超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 6379 #表示重試間隔 } } }
下章節預告:
twemproxy + keepalived 實現redis的分布式高可用
原創文章,作者:stanley,如若轉載,請注明出處:http://www.www58058.com/703