利用redis主從+keepalived實現高可用
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
keepalived簡介:
??Keepalived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗余協議)的縮寫,VRRP出現的目的就是為了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行。
基本步驟:
1.keepalived+redis 高可用redis主從解決方案
2.兩臺測試主機安裝redis服務
3.在Master redis和Slave redis上安裝Keepalived
4.在Master redis和Slave redis上創建配置文件
5.在Master redis和Slave redis上創建各自所需的監控腳本
6.測試redis配置文件和監控腳本是否正常
一:keepalived+redis 高可用redis主從解決方案
環境介紹:
Master: 192.168.1.10
Slave: 192.168.1.17
Virtural IP Address (VIP): 192.168.1.13
設計思路:
當 Master 與 Slave 均運作正常時, Master負責服務,Slave負責Standby;
當 Master 掛掉,Slave 正常時, Slave接管服務,同時關閉主從復制功能;
當 Master 恢復正常,則從Slave同步數據,同步數據之後關閉主從復制功能,恢復Master身份,於此同時Slave等待Master同步數據完成之後,恢復Slave身份。
需要註意的是,這樣做需要在Master與Slave上都開啟本地化策略,否則在互相自動切換的過程中,未開啟本地化的一方會將另一方的數據清空,造成數據完全丟失。
二:兩臺測試主機安裝redis服務
1.下載redis安裝包及安裝
mkdir -p /home/ywxi/tools/ cd /home/ywxi/tools/ wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar -xf redis-3.2.0.tar.gz cd redis-3.2.0 make echo $?
2.添加相關文件及服務命令
mkdir /usr/local/redis/bin/ -p cd src/ cp redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis/bin/ cd ../ cp redis.conf /etc/
3.添加啟動腳本
以下是個完整的腳本,拷貝即可用(註:也可以自己用shell寫,判斷方法很多)
echo '#chkconfig: 2345 10 90 #description: Start and Stop redis REDISPORT=6379 EXEC=/usr/local/redis/bin/redis-server REDIS_CLI=/usr/local/redis/bin/redis-cli PIDFILE=/var/run/redis.pid CONF="/etc/redis.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $REDIS_CLI -p $REDISPORT SHUTDOWN while [ -x ${PIDFILE} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac ' > /etc/init.d/redis
4.服務開機自啟以及創建redis狀態日誌
chmod +x /etc/init.d/redis chkconfig --add redis chkconfig redis on chkconfig --list| grep redis mkdir /var/log/redis/ -p touch /var/log/redis/redis.log
三:在Master redis和Slave redis上安裝Keepalived
1.獲取安裝包並安裝
cd /home/ywxi/tools wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz tar zxf keepalived-1.2.20.tar.gz cd keepalived-1.2.20 yum -y install openssl openssl-devel ./configure && make && make install echo $?
2.配置文件添加及配置 (很重要,服務啟動需要這些文件)
mkdir /etc/keepalived mkdir /usr/local/keepalived/scripts/ -p cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/sbin/keepalived /usr/sbin cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
3.添加開機啟動
chmod +x /etc/init.d/keepalived chkconfig --add keepalived chkconfig keepalived on
四:在Master redis和Slave redis上創建配置文件
1)Master redis上創建配置文件
cd /etc/keepalived/ cp keepalived.conf keepalived.conf.bnk echo '! Configuration File for keepalived global_defs { notification_email{ [email protected] } router_id redis140 } vrrp_script chk_redis { script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379" interval 2 timeout 2 fall 3 } vrrp_instance redis { state MASTER # master set to SLAVE also interface eth0 lvs_sync_daemon_interface eth0 virtual_router_id 202 priority 150 nopreempt # no seize,must add advert_int 1 authentication { #all node must same auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.186.143 } track_script { chk_redis } notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.186.141 6379" notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.186.141 6379" notify_fault /usr/local/keepalived/scripts/redis_fault.sh notify_stop /usr/local/keepalived/scripts/redis_stop.sh }' > /etc/keepalived/keepalived.conf
2)Slave redis上創建配置文件
cd /etc/keepalived/ cp keepalived.conf keepalived.conf.bnk echo'! Configuration File for keepalived global_defs { notification_email{ [email protected] } router_id redis141 } vrrp_script chk_redis { script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379" #監控腳本 interval 2 timeout 2 fall 3 } vrrp_instance redis { state BACKUP interface eth0 lvs_sync_daemon_interface eth0 virtual_router_id 202 priority 100 nopreempt # no seize,must add advert_int 1 authentication { #all node must same auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.186.143 } track_script { chk_redis } notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.186.140 6379" notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.1.140 6379" notify_fault /usr/local/keepalived/scripts/redis_fault.sh notify_stop /usr/local/keepalived/scripts/redis_stop.sh }' >/etc/keepalived/keepalived.conf
五:在Master redis和Slave redis上創建各自所需的監控腳本
1).配置master腳本文件(可從線上拷貝再做修改)
腳本目錄 /usr/local/keepalived/scripts
以下用於監控Redis的腳本:
mkdir -p /usr/local/keepalived/scripts cd /usr/local/keepalived/scripts echo '#!/bin/bash ALIVE=`/usr/local/redis/bin/redis-cli -h $1 -p $2 PING` LOGFILE="/var/log/keepalived-redis-check.log" echo "[CHECK]" >> $LOGFILE date >> $LOGFILE if [ $ALIVE == "PONG" ]; then : echo "Success: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1 exit 0 else echo "Failed:redis-cli -h $1 -p $2 PING $ALIVE " >> $LOGFILE 2>&1 exit 1 fi' >/usr/local/keepalived/scripts/redis_check.sh
以下負責運作的關鍵腳本:
notify_master /usr/local/keepalived/scripts/redis_master.sh
notify_backup /usr/local/keepalived/scripts/redis_backup.sh
notify_fault /usr/local/keepalived/scripts/redis_fault.sh
notify_stop /usr/local/keepalived/scripts/redis_stop.sh
工作原理:
因為Keepalived在轉換狀態時會依照狀態來呼叫:
當進入Master狀態時會呼叫notify_master
當進入Backup狀態時會呼叫notify_backup
當發現異常情況時進入Fault狀態呼叫notify_fault
當Keepalived程序終止時則呼叫notify_stop
2)首先,在Redis Master上創建notity_master與notify_backup腳本:
註:Redis Slave上創建notity_master與notify_backup腳本,與master一致
[root@www scripts]# vim redis_master.sh
#!/bin/bash REDISCLI="/usr/local/redis/bin/redis-cli -h $1 -p $3" LOGFILE="/var/log/keepalived-redis-state.log" echo "[master]" >> $LOGFILE date >> $LOGFILE echo "Being master...." >> $LOGFILE 2>&1 echo "Run SLAVEOF cmd ... " >> $LOGFILE $REDISCLI SLAVEOF $2 $3 >> $LOGFILE 2>&1 #echo "SLAVEOF $2 cmd can't excute ... " >> $LOGFILE sleep 10 #延遲10秒以後待數據同步完成後再取消同步狀態 echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
notify_backup腳本:
[root@www scripts]# vim redis_backup.sh
#!/bin/bash REDISCLI="/usr/local/redis/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log" echo "[BACKUP]" >> $LOGFILE date >> $LOGFILE echo "Being slave...." >> $LOGFILE 2>&1 echo "Run SLAVEOF cmd ..." >> $LOGFILE 2>&1 $REDISCLI SLAVEOF $2 $3 >> $LOGFILE sleep 100 #延遲100秒以後待數據同步完成後再取消同步狀態 exit(0)
3)Master額外還要創建兩個腳本redis_fault.sh和redis_stop.sh
[root@www scripts]# vim redis_fault.sh
#!/bin/bash LOGFILE="/var/log/keepalived-redis-state.log" echo "[fault]" >> $LOGFILE date >> $LOGFILE
[root@www scripts]# vim redis_stop.sh
#!/bin/bash LOGFILE="/var/log/keepalived-redis-state.log" echo "[stop]" >> $LOGFILE date >> $LOGFILE
主從記得加上腳本權限:
chmod +x /usr/local/keepalived/scripts/*.sh
設置環境變量:
echo 'export PATH=$PATH:/usr/local/redis/bin' >> /root/.bash_profile
source /root/.bash_profile
啟動服務:
/etc/init.d/keepalived restart
/etc/init.d/redis restart
六:測試redis配置文件和監控腳本是否正常
1.啟動主從的keepalived和redis服務
檢查
/etc/init.d/keepalived restart
redis-server & redis啟動方式特殊,加&放在後臺運行
netstat -tnlp | grep redis
ps -ef | grep keepalived
ps -ef | grep redis | awk '{print $2}' |xargs kill -9 殺redis進程
redis-server /etc/redis.conf &
2.嘗試通過VIP連接Redis:
redis-cli -h 192.168.1.10
redis-cli -h 192.168.1.17
redis-cli -h 192.168.1.13
192.168.1.13:6379> 這是進入正確提示
3.嘗試插入一些數據:
redis-cli -h 192.168.1.13 SET Hello Redis
OK
從VIP讀取數據
redis-cli -h 192.168.1.13 GET Hello
"Redis"
從Master讀取數據
redis-cli -h 192.168.1.10 GET Hello
"Redis"
從Slave讀取數據
redis-cli -h 192.168.1.17 GET Hello
"Redis"
4.模擬故障發生:看keepalived是否正常切換
將Master上的Redis進程殺死:
killall -9 redis-server
查看Master上的Keepalived日誌
tailf /var/log/keepalived-redis-state.log
同時Slave上的日誌顯示:
tailf /var/log/keepalived-redis-state.log
然後我們可以發現,Slave已經接管服務,並且擔任Master的角色了。
redis-cli -h 192.168.1.13 INFO
redis-cli -h 192.168.1.17 INFO
role:master
然後我們恢復Master的Redis進程
/etc/init.d/redis start
查看Master上的Keepalived日誌
tailf /var/log/keepalived-redis-state.log
同時Slave上的日誌顯示:
tailf /var/log/keepalived-redis-state.log
利用redis主從+keepalived實現高可用