標籤:
redis+Keepalived實現Redis主從複製:
環境:CentOs6.5
Master: 10.10.10.203
Slave: 10.10.10.204
Virtural IP Address (VIP): 10.10.10.205
所需軟體:
keepalived-1.2.12.tar.gz
redis-2.8.7.tar.gz
實現功能:
當 Master 與 Slave 均運作正常時, Master負責服務,Slave負責Standby;
當 Master 掛掉,Slave 正常時, Slave接管服務,同時關閉主從複製功能;
一、安裝配置前準備工作:
yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel
Redis屬於記憶體資料庫,所以調優都集中到了記憶體上,需要將 vm.overcommit 設定為1
echo "vm.overcommit_memory=1" >> /etc/sysctl
sysctl -p
1.在主伺服器10.10.10.203上面做下面操作
echo " 10.10.10.203 gc-dabairedis1" >> /etc/hosts
echo " 10.10.10.204 gc-dabairedis2" >> /etc/hosts
2.在從伺服器10.10.10.204上面做下面操作
echo " 10.10.10.203 gc-dabairedis1" >> /etc/hosts
echo " 10.10.10.204 gc-dabairedis2" >> /etc/hosts
二、在Master和Slave上安裝redis:
tar -zxvf redis-2.8.7.tar.gz
cd redis-2.8.7
make && make install
cd src
mkdir -p /usr/local/redis/bin
cp redis-server redis-cli redis-benchmark redis-check-aof redis-check-dump /usr/local/redis/bin/
mkdir -p /usr/local/redis/etc
將源碼中的 redis.conf 複製到 /usr/local/redis/etc/
redis-2.8.7]# cp redis.conf /usr/local/redis/etc/
修改 /usr/local/redis/etc/redis.conf裡面可以把 daemonize no 修改為daemonize yes
製作一個 init.d 的啟動指令碼:
vim /etc/init.d/redis-server
chmod o+x /etc/init.d/redis-server
chkconfig --add redis-server
/etc/init.d/redis-server start
###########################################################################################
三、在Master和Slave上安裝keepalived:
tar -zxvf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
./configure
make && make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
chmod +x /etc/init.d/keepalived
chkconfig --add keepalived
mkdir /etc/keepalived
ln -s /usr/local/sbin/keepalived /usr/sbin
Keepalived在轉換狀態時會依照狀態來呼叫:
當進入Master狀態時會呼叫notify_master
當進入Backup狀態時會呼叫notify_backup
當發現異常情況時進入Fault狀態呼叫notify_fault
當Keepalived程式終止時則呼叫notify_stop
Master上建立配置:
在Master上建立設定檔 keepalived.conf 如下
vim /etc/keepalived/keepalived.conf
1 vrrp_script chk_redis { 2 script "/etc/keepalived/scripts/redis_check.sh" 3 interval 1 4 } 5 6 vrrp_instance mes_Redis { 7 state MASTER 8 interface eth0 9 garp_master_delay 1010 smtp_alert11 virtual_router_id 312 priority 10113 nopreempt14 advert_int 115 authentication {16 auth_type PASS17 auth_pass 111118 }19 virtual_ipaddress {20 10.10.10.205 21 }22 track_script {23 chk_redis24 }25 notify_master /etc/keepalived/scripts/redis_master.sh 26 notify_backup /etc/keepalived/scripts/redis_slave.sh27 notify_fault /etc/keepalived/scripts/redis_fault.sh28 notify_stop /etc/keepalived/scripts/redis_stop.sh29 }
在Redis Master上建立notity_master與notify_backup指令碼:
vim /etc/keepalived/scripts/redis_master.sh #!/bin/bashREDISCLI="/usr/local/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE 2>&1echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.10.10.204 6379 >> $LOGFILE 2>&1sleep 5 #延遲10秒以後待資料同步完成後再取消同步狀態echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1vim /etc/keepalived/scripts/redis_backup.sh #!/bin/bashREDISCLI="/usr/local/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1sleep 15 #延遲15秒待資料被對方同步完成之後再切換主從角色echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.10.10.204 6379 >> $LOGFILE 2>&1
在slave上建立配置:
keepalived.conf 如下:
vim /etc/keepalived/keepalived.conf
1 vrrp_script chk_redis { 2 script "/etc/keepalived/scripts/redis_check.sh" ###監控指令碼 3 interval 1 ###監控時間 4 } 5 6 vrrp_instance mes_Redis { 7 state BACKUP ###設定為BACKUP 8 interface eth0 ###監控網卡 9 garp_master_delay 1010 smtp_alert11 virtual_router_id 312 priority 100 ###比MASTRE權重值低 13 nopreempt14 advert_int 115 authentication {16 auth_type PASS17 auth_pass 1111 ###密碼與MASTRE相同18 }19 virtual_ipaddress {20 10.10.10.205 ###VIP地址 21 }22 track_script {23 chk_redis ###執行上面定義的chk_redis24 }25 notify_master /etc/keepalived/scripts/redis_master.sh26 notify_backup /etc/keepalived/scripts/redis_backup.sh27 notify_fault /etc/keepalived/scripts/redis_fault.sh28 notify_stop /etc/keepalived/scripts/redis_stop.sh29 }
在Redis Slave上建立notity_master與notify_backup指令碼:
vim /etc/keepalived/scripts/redis_master.sh#!/bin/bashREDISCLI="/usr/local/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE 2>&1echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.10.10.203 6379 >> $LOGFILE 2>&1sleep 5 #延遲10秒以後待資料同步完成後再取消同步狀態echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
vim /etc/keepalived/scripts/redis_backup.sh#!/bin/bashREDISCLI="/usr/local/redis/bin/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1sleep 15 #延遲15秒待資料被對方同步完成之後再切換主從角色echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.10.10.203 6379 >> $LOGFILE 2>&1
在Master和Slave上建立相同監控Redis的指令碼:
vim /etc/keepalived/scripts/redis_check.sh#!/bin/bashALIVE=`/opt/redis/bin/redis-cli PING`if [ "$ALIVE" == "PONG" ]; then echo $ALIVE exit 0else echo $ALIVE exit 1fi
Master與Slave建立如下相同的指令碼:
vim /etc/keepalived/scripts/redis_fault.sh#!/bin/bashLOGFILE=/var/log/keepalived-redis-state.logecho "[fault]" >> $LOGFILEdate >> $LOGFILEvim /etc/keepalived/scripts/redis_stop.sh#!/bin/bashLOGFILE=/var/log/keepalived-redis-state.log echo "[stop]" >> $LOGFILEdate >> $LOGFILE
給指令碼都加上可執行許可權:
chmod +x /etc/keepalived/scripts/*.sh
指令碼建立完成以後,我們開始按照如下流程進行測試:
1 啟動Master上的Redis 2 /etc/init.d/redis start 3 啟動Slave上的Redis 4 /etc/init.d/redis start 5 啟動Master上的Keepalived 6 /etc/init.d/keepalived start 7 啟動Slave上的Keepalived 8 /etc/init.d/keepalived start
redis+Keepalived實現Redis主從複製