Keepalived+expect方式實現Redis主從高可用實際操作
前言:
redis高可用有Sentinel、Cluster等多種方式,本文主要介紹keepalived方式。
keepalived常用的實現高可用方式是當檢查到被監控程序或keepalived服務本身掛掉時觸發切換,這種方式對於redis主從高可用會有一個問題:當主的keepalived掛掉時,此時無法觸發keepalived裡的notify_backup指令碼,主的redis狀態還是master;此時從伺服器會接管vip並且redis狀態由slave切換為master,這時就會有兩個master,主從架構被破壞。為了解決該問題,在notify_master指令碼使用expect工具,本文在主從發生切換時,切換為master的主機會觸發notify_master指令碼,該指令碼中的expect工具會遠端到對方主機執行slaveof命令,重新確定主從關係。
架構:
配置:
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
7.RedisDesktopManager管理工具
該工具為redis圖形化管理工具
軟體下載:連結: https://pan.baidu.com/s/1Q9k-zyhfTWbvjbHaZvafbw 提取碼: 495t
連線設定:
連線後效果
二、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
檢視從機redis鍵值:
2.2從機寫入值
[root@redis-slave redis]# redis-cli set test-key 123
發現報錯,處於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
為了避免主從間的來回切換,也可以設定nopreemt引數,開啟非搶佔式模式;不過當redis或者keepalived發生異常時都會觸發各種告警,運維人員會及時介入處理。
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高可用測試。
本文所有指令碼和配置檔案已上傳, 可以到Linux公社資源站下載:
------------------------------------------分割線------------------------------------------
免費下載地址在 ofollow,noindex">http://linux.linuxidc.com/
使用者名稱與密碼都是 www.linuxidc.com
具體下載目錄在/2018年資料/8月/19日/Keepalived+expect方式實現Redis主從高可用實際操作/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
------------------------------------------分割線------------------------------------------
Linux公社的RSS地址: https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-09/154219.htm