第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{
}
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{
}
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進程。