双机热备技术

redis双机热备的流程:原理是将一个服务器作为主服务器,另一个服务器作为从服务器,做到在主服务器宕机后迅速切换到辅助缓存服务器。以主服务器为例子;
首先是安装redis,需要用到root用户的权限:
然后创建redis的主目录:
mkdir -p /usr/local/redis-master/{bin,conf,logs}

cp -a src/redis-server /usr/local/redis-master/bin/

cp -a src/redis-cli /usr/local/redis-master/bin/

cp -a src/redis-benchmark /usr/local/redis-master/bin/

cp -a src/redis-sentinel /usr/local/redis-master/bin/

cp -a src/redis-check-dump /usr/local/redis-master/bin/

cp -a src/redis-check-aof /usr/local/redis-master/bin/

然后创建redis的启动脚本vi /usr/local/redis-master/redis-start.sh:

!/bin/bash

REDISPATH=/usr/local/redis-2.8.3
REDISCLI=$REDISPATH/bin/redis-cli
LOGFILE=$REDISPATH/logs/redis-state.log
LOCALIP=x #自身IP
REMOTEIP=y #监控服务器的IP

REMOTEREDISROLE=$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" ];then
echo "[INFO]date +%F/%H:%M:%S :$LOCALIP start as slave successful." >> $LOGFILEelseecho "[ERROR]date +%F/%H:%M:%S :$LOCALIP start as slave error." >> $LOGFILE
fi
else#start as master
$REDISPATH/bin/redis-server $REDISPATH/conf/redis_master.confif [ "$?" == "0" ];then
echo "[INFO]date +%F/%H:%M:%S :$LOCALIP start as master successful." >> $LOGFILEelseecho "[ERROR]date +%F/%H:%M:%S :$LOCALIP start as master error." >> $LOGFILE
fi
fi

给脚本赋予权限 chmod 755 /usr/local/redis-master/bin/redis-start.sh;
然后创建redis的关闭脚本 vi /usr/local/redis-master/redis-stop.sh

!/bin/bash

REDISPATH=/usr/local/redis-master
LOGFILE=$REDISPATH/logs/redis-state.log
kill -9 ps -ef|grep '/bin/redis-server'|grep -v grep|awk '{print $2}'
if [ "$?" == "0" ];then
echo "[INFO]date +%F/%H:%M:%S :redis shutdown completed!" >> $LOGFILE
elseecho "[ERROR]date +%F/%H:%M:%S :redis is not started." >> $LOGFILE
fi

chmod 755 /usr/local/redis-master/bin/redis-stop.sh;

然后复制现在redis配置文件到用户目录:
cp -a -R -p redis.conf /usr/local/redis-master/conf/redis_master.conf
cp -a -R -p redis.conf /usr/local/redis-slave/conf/redis_slave.conf

然后修改相应的配置文件:

vi /usr/local/redis-master/conf/redis_master.conf

daemonize no

daemonize yes

bind 127.0.0.1

bind x #相应的IP地址
logfile "/usr/local/redis-master/logs/redis.log"

vi /usr/local/redis-master/conf/redis_slave.conf

daemonize no

daemonize yes

bind 127.0.0.1

bind y
logfile "/usr/local/redis-master/logs/redis.log"

slaveof <masterip> <masterport>

slaveof y #相应的IP地址和端口

然后修改这个redis-master的用户组别和权限:
chown -R cpay:cpay /usr/local/redis-master;
chmod -R 755 /usr/local/redis-master;

然后再安装keepalived:
1.下载keepalived源码Release 1.2.9

注意:最新版为1.2.10测试过程中出错.
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

然后复制指定文件到系统/etc文件夹:

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

chmod 755 /etc/rc.d/init.d/keepalived

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
chmod 755 /etc/sysconfig/keepalived

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

chmod 755 /usr/sbin/keepalived
mkdir /etc/keepalived

安装完成后进行配置:
mv /usr/local/keepalived/etc/keepalived/keepalived.conf /usr/local/keepalived/etc/keepalived/keepalived.conf-bak
vi /usr/local/keepalived/etc/keepalived/keepalived.conf

vrrp_script chk_redis {
script "/usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh" ###监控脚本
interval 2 ###监控时间
}
vrrp_instance VI_1 {
state MASTER ###设置为MASTER
interface eth3 ###监控网卡,依据实际情况来定
virtual_router_id 51
priority 101 ###权重值
advert_int 1
authentication {
auth_type PASS ###加密
auth_pass redis ###密码
}
track_script {
chk_redis ###执行上面定义的chk_redis
}
virtual_ipaddress {
z ###VIP
}
}
将配置文件复制到系统目录
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived;
chmod 755 /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived;

然后创建用于监视redis的脚本(主):
mkdir /usr/local/keepalived/etc/keepalived/scripts
vi /usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh

!/bin/bash

REDISPATH=/usr/local/redis_slave
REDISCLI=$REDISPATH/bin/redis-cli
LOGFILE=$REDISPATH/logs/redis-state.log
LOCALIP=1xx
REMOTEIP=xxx
VIP=xxx
REMOTEPASSWORD=art390
LOCALPASSWORD=art390
REMOTEPORT=6378
LOCALPORT=6378
REMOTECLI="$REDISCLI -h $REMOTEIP -p $REMOTEPORT -a $REMOTEPASSWORD"
LOCALCLI="$REDISCLI -h $LOCALIP -p $LOCALPORT -a $LOCALPASSWORD"
VIPALIVE=ip a | grep "$VIP"
if [ "$VIPALIVE" == "" ]; then
echo "[info]:"date" keepalived server is pengding or stop" >> $LOGFILE
else
echo "VIP IS HERE" >> $LOGFILE
#check local service is running
if [ $LOCALCLI ping = "PONG" ]; then
echo "now local is in use" >> $LOGFILE
# check local redis server role.
echo $LOCALCLI info | grep "role" >> $LOGFILE
if grep "role:slave" <<< $REDISROLE; then
#change local redis server as master
echo "[info1]:"date" Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$LOCALCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

                    #change remoting redis server as slave
                    if [ `$REMOTECLI ping` = "PONG" ];then
                            REMOTEREDISROLE=`$REMOTECLI info | grep "role"`
                            if grep "role:master" <<< $REMOTEREDISROLE; then
                                    echo "[info2]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE
                                    $REMOTECLI SLAVEOF $LOCALIP 6378 >> $LOGFILE  2>&1
                            fi
                    fi
            fi
    else
            echo "[warn]:"`date`"  redis server($LOCALIP) is not health..." >> $LOGFILE
            sleep 1
            if [ "`$LOCALCLI PING`" != "PONG" ]; then
                    echo "[error]:"`date`"  redis server($LOCALIP) will be stop..." >> $LOGFILE
                    service keepalived stop
            fi
    fi

fi

然后给脚本配置权限:chmod 755 /usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh

从服务器的脚本为:

!/bin/bash

REDISPATH=/usr/local/redis_slave
REDISCLI=$REDISPATH/bin/redis-cli
LOGFILE=$REDISPATH/logs/redis-state.log
LOCALIP=xxx
REMOTEIP=xxx
VIP=xxx
REMOTEPASSWORD=art390
LOCALPASSWORD=art390
REMOTEPORT=6378
LOCALPORT=6378
REMOTECLI="$REDISCLI -h $REMOTEIP -p $REMOTEPORT -a $REMOTEPASSWORD"
LOCALCLI="$REDISCLI -h $LOCALIP -p $LOCALPORT -a $LOCALPASSWORD"
VIPALIVE=ip a | grep "$VIP"
if [ "$VIPALIVE" == "" ]; then
echo "[info]:"date" keepalived server is pengding or stop" >> $LOGFILE
else
echo "VIP IS HERE" >> $LOGFILE
#check local service is running
if [ $LOCALCLI ping = "PONG" ]; then
echo "now local is in use" >> $LOGFILE
# check local redis server role.
echo $LOCALCLI info | grep "role" >> $LOGFILE
if grep "role:slave" <<< $REDISROLE; then
#change local redis server as master
echo "[info1]:"date" Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$LOCALCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

                    #change remoting redis server as slave
                    if [ `$REMOTECLI ping` = "PONG" ];then
                            REMOTEREDISROLE=`$REMOTECLI info | grep "role"`
                            if grep "role:master" <<< $REMOTEREDISROLE; then
                                    echo "[info2]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE
                                    $REMOTECLI SLAVEOF $LOCALIP 6378 >> $LOGFILE  2>&1
                            fi
                    fi
            fi
    else
            echo "[warn]:"`date`"  redis server($LOCALIP) is not health..." >> $LOGFILE
            sleep 1
            if [ "`$LOCALCLI PING`" != "PONG" ]; then
                    echo "[error]:"`date`"  redis server($LOCALIP) will be stop..." >> $LOGFILE
                    service keepalived stop
            fi
    fi

fi

注意:一定要先启动redis,再启动keealived,否则redis_check.sh会将keepalived自动关闭。

脚本创建完成以后,我们开始按照如下流程进行测试:
1.启动Master上的Redis
/usr/local/redis-2.8.3/redis-start.sh

关闭时,直接杀死进程或执行以下脚本

/usr/local/redis-2.8.3/redis-stop.sh

2.启动Slave上的Redis
/usr/local/redis-2.8.3/redis-start.sh

关闭时,直接杀死进程或执行以下脚本

/usr/local/redis-2.8.3/redis-stop.sh

3.启动Master上的Keepalived
/etc/rc.d/init.d/keepalived start

关闭方法

/etc/rc.d/init.d/keepalived stop

4.启动Slave上的Keepalived
/etc/rc.d/init.d/keepalived start

关闭方法

/etc/rc.d/init.d/keepalived stop

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272