1. 程式人生 > >redis主從復制及keepalived方式實現高可用測試

redis主從復制及keepalived方式實現高可用測試

kcon .gz 接口 replica 健康檢查 密碼 write weight 高可用

前言:

redis高可用有Sentinel、Cluster等多種方式,本文主要介紹keepalived方式。


架構:

技術分享圖片



配置:

hostname
ip
os
redis版本
keepalived版本
備註
redis-master172.27.9.30
Centos7.3.1611
4.0.10
1.3.5關閉防火墻和selinux
redis-slave172.27.9.31
Centos7.3.16114.0.101.3.5關閉防火墻和selinux


一、redis安裝

redis安裝有yum和編譯兩種方式,本文以編譯方式安裝,參考文檔為官網安裝文檔

1.gcc安裝

[root@redis-master ~]# yum -y install gcc


2.下載安裝包

[root@redis-master ~]# wget http://download.redis.io/redis-stable.tar.gz


3.解壓編譯

[root@redis-master ~]# tar xvzf redis-stable.tar.gz
[root@redis-master ~]# cd redis-stable
[root@redis-master redis-stable]# make
[root@redis-master redis-stable]# make install


4.修改配置文件

[root@redis-master redis-stable]# mkdir /etc/redis[root@redis-master redis-stable]# mkdir -p /var/redis/6379
[root@redis-master redis-stable]# cp redis.conf /etc/redis/6379.conf
[root@redis-master redis-stable]# cd /etc/redis/
[root@redis-master redis]# cp 6379.conf 6379.conf.bak
[root@redis-master redis]# grep -Ev '^$|#' 6379.conf.bak > 6379.conf

主要配置修改如下:

#bind 127.0.0.1
protected-mode no
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log
dir /var/redis/6379


5.制作啟動服務

[root@redis-master redis-stable]# cp utils/redis_init_script /etc/init.d/redis_6379


6.啟動服務並加入開機啟動

[root@redis-master redis]# service redis_6379 start
[root@redis-master redis]# chkconfig redis_6379 on


7.RedisDesktopManager管理工具

該工具為redis圖形化管理工具

軟件下載:https://pan.baidu.com/s/1no0IWcIEBapfehNi8dfCfw 密碼:7dvc

連接設置:

技術分享圖片

連接後效果

技術分享圖片


二、redis主從復制及持久化

1.從服務器設置

redis主從復制很簡單,只需要在從服務器配置文件新增一條配置即可

[root@redis-slave redis]# sed -i '$a slaveof 172.27.9.30 6379' /etc/redis/6379.conf


2.主從測試

2.1主機上寫入值

[root@redis-master ~]# redis-cli set test-key abc
OK

查看從機redis鍵值:

技術分享圖片

2.2從機寫入值

[root@redis-slave redis]# redis-cli set test-key 123
(error) READONLY You can't write against a read only slave.

發現報錯,處於slave狀態redis無法寫入。


3.持久化

redis持久化有RDB和AOF兩種方式,默認持久化為RDB方式,關閉默認持久化只需要把默認配置註釋就行:

#save 900 1
#save 300 10
#save 60 10000


三、keepalived安裝配置

1.keepalived安裝

[root@redis-master ~]# yum -y install keepalived


2.keepalived配置

[root@redis-master ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id master      #router_id 機器標識,通常為hostname,但不一定非得是hostname。故障發生時,郵件通知會用到。
}
  
vrrp_script chk_redis {
  script "/etc/keepalived/redis-check.sh"
  interval 2    #健康檢查周期
  weight 30     #優先級變化幅度
  fall 2        #嘗試兩次都成功才成功
  rise 2        #嘗試兩次都失敗才失敗
}
 
vrrp_instance VI_1 {            #vrrp實例定義部分
    state MASTER               #設置lvs的狀態,MASTER和BACKUP兩種,必須大寫 
    interface ens33               #設置對外服務的接口
    virtual_router_id 100        #設置虛擬路由標示,這個標示是一個數字,同一個vrrp實例使用唯一標示 
    priority 100               #定義優先級,數字越大優先級越高,在一個vrrp——instance下,master的優先級必須大於backup
    advert_int 1              #設定master與backup負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {           #設置驗證類型和密碼
        auth_type PASS         #主要有PASS和AH兩種
        auth_pass 1111         #驗證密碼,同一個vrrp_instance下MASTER和BACKUP密碼必須相同
    }
    virtual_ipaddress {         #設置虛擬ip地址,可以設置多個,每行一個
        172.27.9.100 
    }
    track_script {              #執行腳本chk_redis
        chk_redis
    }
    
notify_master "/etc/keepalived/redis-master.sh" #指定當切換為master時,執行的腳本
}

相比master,slave配置有3點不同:

router_id slave
state BACKUP 
priority 90


3.啟動並設置開機啟動

[root@redis-master ~]# systemctl start keepalived
[root@redis-master ~]# systemctl enable keepalived


四、expect安裝

[root@redis-master ~]# yum -y install expect

expect是一個提供自動交互的工具,本文notify_master中的腳本會使用到。


五、高可用腳本

1.redis-check.sh腳本

[root@redis-master keepalived]# more redis-check.sh 
#!/bin/sh
rediscli="/usr/local/bin/redis-cli"
logfile="/var/log/redis_6379.log"
result=$($rediscli ping)
echo $result
echo "-------------------redis-check-------------------" >> $logfile
date >> $logfile
if [ $result == "PONG" ]; then : 
   echo "Success: the result is $result" >> $logfile 2>&1
   exit 0 
else 
   echo "Failed:the result is $result " >> $logfile 2>&1
   exit 1 
fi

該腳本為對redis狀態檢查


2.redis-master.sh腳本

[root@redis-master keepalived]# more redis-master.sh
#!/bin/bash
rediscli="/usr/local/bin/redis-cli"
logfile="/var/log/redis_6379.log"
sync=`$rediscli info replication|grep master_sync_in_progress|awk -F: '{print $2}'|sed 's/\r//'`
#sync=`/usr/local/bin/redis-cli info replication|grep master_sync_in_progress|awk -F: '{print $2}'`
echo $sync
echo "-------------------change to master-------------------" >> $logfile 2>&1
date >> $logfile
if [ $sync == 0 ]; then :
    echo "the master_sync_in_progress is 0 and excute slaveof no one" >>$logfile 2>&1
    $rediscli slaveof no one
elif [ $sync == 1 ]; then :
    sleep 10
    $rediscli slaveof no one
else
    echo "the host is master,do nothing" >>$logfile 2>&1
fi
/etc/keepalived/exp.sh 172.27.9.31 monitor >>$logfile 2>&1

該腳本為本文高可用切換的關鍵。

monitor為31的root密碼;slave腳本的ip應改為172.27.9.30;該腳本為服務器切換為master時執行的腳本,首先會檢查切換前與master的主從同步是否完成,然後利用expect工具跳到另一臺服務器將其redis狀態更改為slave。


3.exp.sh腳本

[root@redis-master keepalived]# more exp.sh
#!/usr/bin/expect -f
set ip [lindex $argv 0 ]
set password [lindex $argv 1 ]
set timeout 30
spawn ssh root@$ip
expect {
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "$password\r";exp_continue }
}
expect "#*"  
send "/usr/local/bin/redis-cli slaveof 172.27.9.30 6379\r"  
send  "exit\r"  
expect eof

slave腳本中的ip為172.27.9.31;該腳本作用是跳到另一臺服務執行slaveof命令。


六、測試

1.模擬redis服務異常

操作:停掉master的redis服務

預期:vip漂移,slave主機的redis狀態切換為master

測試過程:

1.1停止master的redis服務

[root@redis-master keepalived]# service redis_6379 stop

1.2查看虛ip

技術分享圖片

技術分享圖片

發現vip由30漂移至31

1.3查看redis狀態

[root@redis-slave keepalived]# redis-cli info replication

技術分享圖片

31的redis狀態切換為master

1.4回切

啟動30的redis服務

[root@redis-master keepalived]# service redis_6379 start

查看vip和redis狀態

30:

技術分享圖片

31:

技術分享圖片

結論:redis服務異常時會發生切換,從機會切換為master狀態對外提供服務。


2.模擬keepalived服務異常

操作:停掉master的keepalived服務

預期:vip漂移,master的redis狀態切換為slave,slave的redis狀態切換為master

測試過程:

2.1停止master的keepalived服務

[root@redis-master keepalived]# systemctl stop keepalived

2.2查看vip和redis狀態

30:

技術分享圖片

31:

技術分享圖片

vip由30漂移至31且主從發生反轉;開啟keepalived服務會觸發回切。

結論:keepalived服務異常時會發生切換,主從會反轉。


3.模擬master宕機

操作:master關機

預期:vip漂移,slave的redis狀態切換為master

測試過程:

3.1master服務器關機

[root@redis-master ~]# init 0

3.2查看vip和redis狀態

技術分享圖片

vip漂移至31且狀態切換為master;30開機會觸發回切。

結論:master宕機時會發生切換,從機切換為master狀態對外提供服務。


至此完成redis高可用測試。


redis主從復制及keepalived方式實現高可用測試