Redis 高可用--主從複製

 

第1章        Redis-HA簡介

設計原理:

當Master與Slave均運作正常時, Master負責服務,Slave負責Standby;

當Master掛掉,Slave正常時, Slave接管服務,同時關閉主從複製功能;

當Master恢復正常,則從Slave同步數據,同步數據之後關閉主從複製功能,恢復Master身份,於此同時Slave等待Master同步數據完成之後,恢復Slave身份。

然後依次循環。

需要注意的是,這樣做需要在Master與Slave上都開啓本地化策略,否則在互相自動切換的過程中,未開啓本地化的一方會將另一方的數據清空,造成數據完全丟失


 

第2章        搭建Redis-HA

Redis-HA環境拓撲如下:

Redis-VIP:192.168.xxx.200

Redis-master:192.168.xxx.11

Redis-slave:192.168.xxx.12

2.1 Redis master-slave配置

redis支持master-slave的主從配置,配置方法是在從機的配置文件中指定slaveof參數爲主機的ip和port既可以。

 

從機修改內容

 

slaveof 192.168.3.67 6379 (是主機的ip地址)

masterauth 888888 如何有密碼新增

修改如下內容(主從都要修改):

daemonize no 改爲 yes   # 是否後臺運行

 

分別啓動兩個Redis服務

sh startredis.sh

 

啓動之後使用命令查看redis的啓動情況

ps -ef|grep redis

 

測試主從複製:

分別登錄Redis-master和slave進行讀寫,查看數據同步情況

 

2.2 keepalived安裝配置

2.2.1 keepalived安裝

在兩臺機器安裝:

方法一:yum安裝<本地源>:yum install -y keepalived

方法二:編譯安裝

#tar zxvf keepalived-1.1.20.tar.gz 

#cd keepalived-1.1.20 

#./configure --prefix=/usr/local/keepalived--with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686 

#make && make install

 

此處使用的yum安裝


 

 

2.2.2配置虛擬vip

在兩臺機器配置,外網訪問mysql的vip

ifconfig lo:1 192.168.xxx.200 netmask255.255.255.255 broadcast 192.168.223.100

 

查看


 


 

2.2.3 keepalived配置

在192.168.xxx.11機器,新建一個配置文件,默認情況下keepalived啓動時會去/etc/keepalived目錄下找配置文件

#mkdir /etc/keepalived 

#vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs { 

      notification_email{ 

      [email protected] 

      } 

      [email protected] 

      smtp_server127.0.0.1 

      smtp_connect_timeout30 

      router_id Redis-ha 

vrrp_script chk_redis {

        script"/etc/keepalived/scripts/redis_check.sh"

        weight -20

        interval 2                                    

}

 

 vrrp_instance VI_1 { 

      state BACKUP   #兩臺配置此處均是BACKUP 

      interface eth0 

      virtual_router_id51 

      priority 100   #優先級,另一臺改爲90 

      advert_int 1 

      nopreempt  #不搶佔,只在優先級高的機器上設置即可,優先級低的機器不設置 

      track_script {

          chk_redis                    

      }   

      virtual_ipaddress { 

      192.168.xxx.200 

      }

              notify_master/etc/keepalived/scripts/redis_master.sh

              notify_backup/etc/keepalived/scripts/redis_backup.sh

              notify_fault  /etc/keepalived/scripts/redis_fault.sh

              notify_stop   /etc/keepalived/scripts/redis_stop.sh 

編寫檢測服務down後所要執行的腳本

 #vi/usr/local/mysql/mysql.sh 

 #!/bin/sh 

 pkill keepalived 

 #chmod +x/usr/local/mysql/mysql.sh

注:此腳本是上面配置文件notify_down選項所用到的,keepalived使用notify_down選項來檢查real_server的服務狀態,當發現real_server服務故障時,便觸發此腳本;我們可以看到,腳本就一個命令,通過pkillkeepalived強制殺死keepalived進程,從而實現了MySQL故障自動轉移。另外,我們不用擔心兩個MySQL會同時提供數據更新操作,因爲每臺MySQL上的keepalived的配置裏面只有本機MySQL的IP+VIP,而不是兩臺MySQL的IP+VIP

 

192.168.xxx.12上keepalived配置

這臺配置和上面基本一樣,但有三個地方不同:優先級爲90、無搶佔設置、real_server爲本機IP

#mkdir /etc/keepalived 

#vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs { 

      notification_email{ 

      [email protected] 

      } 

      [email protected] 

      smtp_server127.0.0.1 

      smtp_connect_timeout30 

      router_id MySQL-ha 

      } 

 

vrrp_instance VI_1 { 

      state BACKUP   #兩臺配置此處均是BACKUP 

      interface eth0 

      virtual_router_id51 

      priority 90   #優先級,另一臺改爲90 

      advert_int 1 

      track_script {

          chk_redis                    

      }

      virtual_ipaddress { 

      192.168.xxx.200 

      } 

       notify_master/etc/keepalived/scripts/redis_master.sh

              notify_backup/etc/keepalived/scripts/redis_backup.sh

              notify_fault  /etc/keepalived/scripts/redis_fault.sh

              notify_stop   /etc/keepalived/scripts/redis_stop.sh 

 

配置中所涉及的shell腳本參照2.2.5

 

 

2.2.4啓動keepalived

由於設置了nopreempt,那麼在啓動keepalived的時候就有啓動的順序問題了,我們把redis的master和keepalived的master(雖然配置文件中都是backup,但是我們是想讓11這臺做master的)默認設置在同一臺機器上,由於在keepalived的master上面設置了nopreempt參數,所以在啓動keepalived服務的時候,一定要先啓動redis master的那臺,因爲在設置了nopreempt了,keepalived在啓動後都是先進入backup狀態,而腳本又設置了進入backup狀態後,會連接新的對方進行數據同步,所以,在啓動keepalived之前還有一個條件就是redis的master和slave中的數據必須一致。這樣先啓動redis的master那臺的keepalived,雖然redis master會連接到redis slave同步數據,但是兩邊數據在剛開始的時候是一致的,並不會產生什麼問題。

 

1 先啓動master和slave上的redis服務,配置slave從master上面同步數據,同步完畢後,取消slave的同步機制。

 

    這個就是在slave的redis上面執行slaveof192.168.xxx.11 6379,等待數據同步完畢後再執行slaveos on one,讓master和slave的redis都保持master狀態

 

2 接着啓動master的keepalived,不要啓動slave的keepalived,在master和slave上面各開啓三個終端,觀察自定義日誌和系統日誌狀態

#service keepalived start

 

待master的各項進程都ok後,我們開始啓動slave上面的keepalived服務

2.2.5 配置所需腳本

Master節點

新建/etc/keepalived/scripts/和/etc/keepalived/log/目錄

以下腳本在放/etc/keepalived/scripts/目錄,並賦予執行的權限

redis服務狀態檢測腳本redis_check.sh

#!/bin/bash

###/etc/keepalived/scripts/redis_check.sh

ALIVE=`/usr/bin/redis-cli PING`

if [ "$ALIVE" == "PONG"]; then

 echo $ALIVE

 exit 0

else

 echo $ALIVE

 exit 1

fi

 

keepalived進入master狀態時的檢測腳本redis_master.sh

#!/bin/bash

###/etc/keepalived/scripts/redis_master.sh

REDISCLI="redis-cli"

LOGFILE="/etc/keepalived/log/redis-state.log"

pid=$$

 

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]" >> $LOGFILE

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF 192.168.223.xxx.126379" >> $LOGFILE

$REDISCLI SLAVEOF 192.168.223.xxx.126379 >> $LOGFILE 2>&1

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] wait 10 sec for data sync from oldmaster" >> $LOGFILE

sleep 10

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] data rsync from old mater ok...">> $LOGFILE

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Run slaveof no one,closemaster/slave" >> $LOGFILE

$REDISCLI SLAVEOF NO ONE >> $LOGFILE2>&1

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait other slave connect....">> $LOGFILE

 

 

keepalived進入backup/stop/fault時的檢測腳本,由於內容都一致,所以只寫出redis_backup.sh

#!/bin/bash

###/etc/keepalived/scripts/redis_backup.sh

REDISCLI="redis-cli"

LOGFILE="/etc/keepalived/log/redis-state.log"

pid=$$

 

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]" >> $LOGFILE

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] Being slave state..." >>$LOGFILE 2>&1

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master] wait 10 sec for data sync from oldmaster" >> $LOGFILE

sleep 10

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[master]data rsync from old mater ok..." >> $LOGFILE

echo "`date+'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver] Run 'SLAVEOF 192.168.223.xxx.126379'" >> $LOGFILE

$REDISCLI SLAVEOF 10.20.112.27 6379>> $LOGFILE  2>&1

echo "`date +'%Y-%m-%d:%H:%M:%S'`|$pid|state:[slaver]slave connect to 192.168.223.xxx.12 ok...">> $LOGFILE

 

slave節點

將配置文件中的ip地址改爲master節點ip即可

 

 

 

 

2.3 Redis-HA測試

1. kill掉26的redis進程,保持keepalived進程。

2. kill掉26的keepalived進程,保持redis進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章