Redis双机热备方案--转
http://luyx30.blog.51cto.com/1029851/1350832
參考資料:
?
http://patrick-tang.blogspot.com/2012/06/redis-keepalived-failover-system.html
http://deidara.blog.51cto.com/400447/302402
http://my.oschina.net/guol/blog/182491
http://shiguanghui.iteye.com/blog/2001499
?
背景
?
目前,Redis集群的官方方案還處在開發(fā)測(cè)試中,未集成到穩(wěn)定版中。且目前官方開發(fā)中的Redis Cluster提供的功能尚不完善(可參考官方網(wǎng)站或http://www.redisdoc.com/en/latest/topic/cluster-spec.html),在生產(chǎn)環(huán)境中不推薦使用。通過調(diào)研發(fā)現(xiàn)市面上要實(shí)現(xiàn)采用單一的IP來訪問,大多采用keepalived實(shí)現(xiàn)redis的雙機(jī)熱備作為過渡方案。
?
環(huán)境部署
?
環(huán)境介紹: ? ?
Master: 192.168.1.218 ? ? redis,keepalived ? ??
Slave: 192.168.1.219 ? ? ? ?redis,keepalived ? ??
Virtural IP Address (VIP): ?192.168.1.220
?
設(shè)計(jì)思路:
兩個(gè)redis server主從備份。提供redis 服務(wù)高可用;兩個(gè)keepalived 服務(wù)主從備份,提供VIP 服務(wù)的高可用。
1)每臺(tái)redis server分別有主,從兩個(gè)配置文件(redis_master.conf, redis_slave.conf),通過啟動(dòng)腳本啟動(dòng)服務(wù),啟動(dòng)腳本會(huì)檢測(cè)這個(gè)redis集群中的其他服務(wù)器的角色,如果有master 服務(wù)存在,則以slave角色啟動(dòng),否則將自己以master服務(wù)器啟動(dòng);
2) keepalived 監(jiān)控腳本,定時(shí)(頻率:每秒一次)檢測(cè)當(dāng)前服務(wù)器是否獲取集群VIP,如果獲取集群VIP,則將本服務(wù)器上的redis服務(wù)器設(shè)置為master。同時(shí)將遠(yuǎn)端的其他redis服務(wù)器設(shè)置為slave;保證獲取集群VIP的redis 服務(wù)器角色為master,其他的設(shè)置為slave。
3) keepalived 監(jiān)控腳本,還會(huì)自動(dòng)檢測(cè)當(dāng)前redis服務(wù)器是否正常,如果連續(xù)兩次檢測(cè)異常,則停掉本本機(jī)的keepalived服務(wù),釋放集群VIP,讓去漂移到其他可以提供redis 服務(wù)的服務(wù)器上;
4)當(dāng) Master 與 Slave 均運(yùn)作正常時(shí), Master負(fù)責(zé)服務(wù),Slave負(fù)責(zé)同步數(shù)據(jù);當(dāng) Master 掛掉,Slave 正常時(shí), Slave接管服務(wù),同時(shí)關(guān)閉主從復(fù)制功能;當(dāng) Master 恢復(fù)正常,則從Slave同步數(shù)據(jù),同步數(shù)據(jù)之后關(guān)閉主從復(fù)制功能,恢復(fù)Master身份,于此同時(shí)Slave等待Master同步數(shù)據(jù)完成之后,恢復(fù)Slave身份。然后依次循環(huán)。
?
實(shí)施步驟:
----創(chuàng)建專用用戶
useradd -g develop redisadmin ? ?
echo Hisun@1125|passwd --stdin redisadmin
說明:以下部署過程都是在root(或具備sudo權(quán)限的賬號(hào))賬戶下進(jìn)行。
----安裝配置redis
1.下載redis源碼
cd
wget?http://download.redis.io/releases/redis-2.8.3.tar.gz
2.安裝redis
tar -zxvf redis-2.8.3.tar.gz
cd redis-2.8.3
#reds的安裝可以不用執(zhí)行configure
make
#測(cè)試
make test
####在速度較慢的機(jī)器上執(zhí)行make test可能出現(xiàn)下列錯(cuò)誤,無影響
#*** [err]: Test replication partial resync: no backlog in tests/integration/replication-psync.tcl
3.配置redis
#創(chuàng)建redis主目錄
mkdir -p /usr/local/redis-2.8.3/{bin,conf,logs}
cp -a -R -p src/redis-server /usr/local/redis-2.8.3/bin/
cp -a -R -p src/redis-cli /usr/local/redis-2.8.3/bin/
cp -a -R -p src/redis-benchmark /usr/local/redis-2.8.3/bin/
cp -a -R -p src/redis-sentinel /usr/local/redis-2.8.3/bin/
cp -a -R -p src/redis-check-dump /usr/local/redis-2.8.3/bin/
cp -a -R -p src/redis-check-aof /usr/local/redis-2.8.3/bin/
#創(chuàng)建redis啟動(dòng)腳本
vi /usr/local/redis-2.8.3/redis-start.sh
####以下為master上的配置,slave上的配置只需要修改對(duì)應(yīng)的LOCALIP和REMOTEIP即可。
#!/bin/bash REDISPATH=/usr/local/redis-2.8.3 REDISCLI=$REDISPATH/bin/redis-cli LOGFILE=$REDISPATH/logs/redis-state.log LOCALIP=192.168.1.218 REMOTEIP=192.168.1.219REMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "role"` if grep "role:master" <<< $REMOTEREDISROLE ; then#start as slave$REDISPATH/bin/redis-server $REDISPATH/conf/redis_slave.confif [ "$?" == "0" ];thenecho "[INFO]`date +%F/%H:%M:%S` :$LOCALIP start as slave successful." >> $LOGFILEelseecho "[ERROR]`date +%F/%H:%M:%S` :$LOCALIP start as slave error." >> $LOGFILEfi else#start as master$REDISPATH/bin/redis-server $REDISPATH/conf/redis_master.confif [ "$?" == "0" ];thenecho "[INFO]`date +%F/%H:%M:%S` :$LOCALIP start as master successful." >> $LOGFILEelseecho "[ERROR]`date +%F/%H:%M:%S` :$LOCALIP start as master error." >> $LOGFILEfi fi #創(chuàng)建redis關(guān)閉腳本 vi /usr/local/redis-2.8.3/redis-stop.sh ####以下為master上的配置,slave上的配置相同。 #!/bin/bash REDISPATH=/usr/local/redis-2.8.3 LOGFILE=$REDISPATH/logs/redis-state.log kill -9 `ps -ef|grep '/bin/redis-server'|grep -v grep|awk '{print $2}'` if [ "$?" == "0" ];thenecho "[INFO]`date +%F/%H:%M:%S` :redis shutdown completed!" >> $LOGFILE elseecho "[ERROR]`date +%F/%H:%M:%S` :redis is not started." >> $LOGFILE fi#創(chuàng)建redis配置文件 cp -a -R -p redis.conf /usr/local/redis-2.8.3/conf/redis_master.conf cp -a -R -p redis.conf /usr/local/redis-2.8.3/conf/redis_slave.conf #修改redis_master.conf對(duì)應(yīng)配置項(xiàng): ####192.168.1.218主服務(wù)器redis_master.conf對(duì)應(yīng)配置項(xiàng)###### #daemonize no daemonize yes #bind 127.0.0.1 bind 192.168.1.218 logfile "/usr/local/redis-2.8.3/logs/redis.log" #其他配置依據(jù)實(shí)際生產(chǎn)環(huán)境修改 ######################################################## ####192.168.1.219從服務(wù)器redis_master.conf對(duì)應(yīng)配置項(xiàng)###### #daemonize no daemonize yes #bind 127.0.0.1 bind 192.168.1.219 logfile "/usr/local/redis-2.8.3/logs/redis.log" #其他配置依據(jù)實(shí)際生產(chǎn)環(huán)境修改 ######################################################## #修改redis_slave.conf對(duì)應(yīng)配置項(xiàng): ####192.168.1.218主服務(wù)器redis_slave.conf對(duì)應(yīng)配置項(xiàng)####### #daemonize no daemonize yes #bind 127.0.0.1 bind 192.168.1.218 logfile "/usr/local/redis-2.8.3/logs/redis.log" # slaveof <masterip> <masterport> slaveof 192.168.1.219 6379 #其他配置依據(jù)實(shí)際生產(chǎn)環(huán)境修改 ######################################################## ####192.168.1.219從服務(wù)器redis_slave.conf對(duì)應(yīng)配置項(xiàng)####### #daemonize no daemonize yes #bind 127.0.0.1 bind 192.168.1.219 logfile "/usr/local/redis-2.8.3/logs/redis.log" # slaveof <masterip> <masterport> slaveof 192.168.1.218 6379 #其他配置依據(jù)實(shí)際生產(chǎn)環(huán)境修改 ########################################################
#修改redis的屬主和權(quán)限
chmod –R 750 /usr/local/redis-2.8.3/chown –R redisadmin:develop /usr/local/redis-2.8.3/
----安裝配置keepalived ??
1.下載keepalived源碼Release 1.2.9
注意:最新版為1.2.10測(cè)試過程中出錯(cuò). ??
wget?http://www.keepalived.org/software/keepalived-1.2.9.tar.gz
2.安裝keepalived
需要安裝以下依賴包: make gcc libpopt-dev libnl-dev libcurl4-openssl-dev popt openssl ??
cd
tar –zxvf keepalived-1.2.9.tar.gz
cd keepalived-1.2.9
./configure --prefix=/usr/local/keepalived
make && make install
3.配置keepalived
#在Master和Slave上創(chuàng)建如下配置文件(可根據(jù)實(shí)際情況調(diào)整):
mv ?/usr/local/keepalived/etc/keepalived/keepalived.conf /usr/local/keepalived/etc/keepalived/keepalived.conf-bak ??
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
在Master和Slave上創(chuàng)建監(jiān)控Redis的腳本 ??
mkdir /usr/local/keepalived/etc/keepalived/scripts ??
vi /usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh
####以下為master上的配置,slave上的配置只需要修改對(duì)應(yīng)的LOCALIP和REMOTEIP即可。
#!/bin/bash REDISPATH=/usr/local/redis-2.8.3 REDISCLI=$REDISPATH/bin/redis-cli LOGFILE=$REDISPATH/logs/redis-state.log LOCALIP=192.168.1.218 REMOTEIP=192.168.1.219 VIP=192.168.1.220VIPALIVE=`ip a | grep "$VIP"` if [ "$VIPALIVE" == "" ]; thenecho "[info]:"`date`" keepalived server is pengding or stop" >> $LOGFILE elseecho "bbb" >> $LOGFILE#check local service is runningif [ "`$REDISCLI –h $LOCALIP –p 6379 PING`" == "PONG" ]; then# check local redis server role.REDISROLE=`$REDISCLI info | grep "role"`if grep "role:slave" <<< $REDISROLE ; then#change local redis server as master echo "[info1]:"`date`" Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1#change remoting redis server as slaveREMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "role"`if grep "role:master" <<< $REMOTEREDISROLE ; thenecho "[info2]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE$REDISCLI -h $REMOTEIP SLAVEOF $LOCALIP 6379 >> $LOGFILE 2>&1fielseREMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "role"`if grep "role:master" <<< $REMOTEREDISROLE ; thenecho "[info3]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE$REDISCLI -h $REMOTEIP SLAVEOF $LOCALIP 6379 >> $LOGFILE 2>&1fifi elseecho "[warn]:"`date`" ?redis server($LOCALIP) is not health..." >> $LOGFILEsleep 1if [ "`$REDISCLI –h $LOCALIP –p 6379 PING`" != "PONG" ]; thenecho "[error]:"`date`" ?redis server($LOCALIP) will be stop..." >> $LOGFILEservice keepalived stopfifi fi 重要:將相應(yīng)的配置文件放到相應(yīng)的地方.#首先在2臺(tái)服務(wù)器上設(shè)置keepalived的啟動(dòng)文件:
cp -a -R -p /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
chmod 750 /etc/rc.d/init.d/keepalived
chown root /etc/rc.d/init.d/keepalived?
#然后在2臺(tái)服務(wù)器上創(chuàng)建配置文件的鏈接:
mkdir /etc/keepalived/
ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
?
系統(tǒng)測(cè)試
?
?
?
注意:一定要先啟動(dòng)redis,再啟動(dòng)keealived,否則redis_check.sh會(huì)將keepalived自動(dòng)關(guān)閉。
腳本創(chuàng)建完成以后,我們開始按照如下流程進(jìn)行測(cè)試: ??
1.啟動(dòng)Master上的Redis ??
/usr/local/redis-2.8.3/redis-start.sh
#關(guān)閉時(shí),直接殺死進(jìn)程或執(zhí)行以下腳本
/usr/local/redis-2.8.3/redis-stop.sh
2.啟動(dòng)Slave上的Redis ??
/usr/local/redis-2.8.3/redis-start.sh
#關(guān)閉時(shí),直接殺死進(jìn)程或執(zhí)行以下腳本
#/usr/local/redis-2.8.3/redis-stop.sh
3.啟動(dòng)Master上的Keepalived ??
/etc/rc.d/init.d/keepalived start
#關(guān)閉方法
#/etc/rc.d/init.d/keepalived stop
4.啟動(dòng)Slave上的Keepalived ??
/etc/rc.d/init.d/keepalived start
#關(guān)閉方法
#/etc/rc.d/init.d/keepalived stop
?
繼續(xù)優(yōu)化中,未完結(jié)。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3525090.html
總結(jié)
以上是生活随笔為你收集整理的Redis双机热备方案--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从websphere6.1迁移到webl
- 下一篇: MySQL索引背后的数据结构及算法原理-