Redis以其高效的訪問速度著稱。但因爲官方還未發佈redis-cluster,而redis的replica又有諸多不便:好比一組master-slave的機器,若是之間有連接瞬段,或者對slave從新執行slaveof命令,會致使slave機器從頭開始同步一次master的數據,形成較大的開銷。
如下描述了使用keepalived+redis主從的一種高可用方法。安裝方法在這裏就不贅述了,google之則可。
1. redis服務配置
主機 端口 角色
redis0 6379 master
redis1 6379 slave
2. keepalived的配置
redis0和redis1使用一個虛擬ip
並使用以下腳本監控redis服務是否存活。監控腳本:
- #!/bin/bash
- /usr/local/bin/redis-cli -h 192.168.1.53 -p 6379 info > /dev/null
- if [ $? -eq 0 ]; then
- echo "redis OK"
- exit 0
- else
- echo "no redis service found!"
- /usr/local/bin/redis-server /path/to/redis.conf
-
- # try to start it again
- /usr/local/bin/redis-cli -h 192.168.11.53 -p 6380 info > /dev/null
- if [ $? -eq 0 ]; then
- exit 0
- else
-
- # restart failed
- killall keepalived
- echo "error"
- fi
- fi
要實現redis故障恢復,能夠使用keepalived配置的notify_master, notify_backup這兩個方法執行特有的腳本。實際上只要在slave(即redis1)上有2個腳本,第一個用於在redis1接管虛擬ip以後,執行slaveof no one把本身變成master。第二個用戶在redis1交出虛擬ip以後,在redis0執行slaveof no one確保redis0恢復爲主的狀態,並對本身執行slaveof redis0 6379開始從新從master同步數據,若是本身已是slave就不必同步了。
redis1上keepalived的配置方法以下,redis0只要去掉notify_master, notify_backup兩行便可。
- ! Configuration File for keepalived
- global_defs {
- router_id redis1
- }
- vrrp_script Monitor_Redis {
- script "/opt/redis_keepalive.sh"
- interval 10
- weight 2
- }
- vrrp_instance 360 {
- state BUCKUP #(主機爲MASTER,備用機爲BACKUP)
- interface eth0 #(HA監測網絡接口)
- virtual_router_id 110 #(主、備機的virtual_router_id必須相同)
- mcast_src_ip 192.168.11.53 #(多播的源IP,設置爲本機外網IP,與VIP同一網卡)此項可不設置
- priority 70 #(主、備機取不一樣的優先級,主機值較大,備份機值較小,值越大優先級越高)
- advert_int 1 #(VRRP Multicast廣播週期秒數)
- authentication {
- ......
- }
- notify_master /opt/redis_2master.sh
- notify_backup /opt/redis_2backup.sh
- track_script {
- Monitor_Redis #(調用nginx進程檢測腳本)
- }
- virtual_ipaddress {
- 192.168.11.4 #(VRRP HA虛擬地址)
- }
- }