redis主從復制及keepalived方式實現高可用測試
redis高可用有Sentinel、Cluster等多種方式,本文主要介紹keepalived方式。
架構:
配置:
hostname | ip | os | redis版本 | keepalived版本 | 備註 |
redis-master | 172.27.9.30 | Centos7.3.1611 | 4.0.10 | 1.3.5 | 關閉防火墻和selinux |
redis-slave | 172.27.9.31 | Centos7.3.1611 | 4.0.10 | 1.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方式實現高可用測試