redis主从+keepalived实现高可用

Redis是我们当下比较流行使用的非关系数据库,可支持多样化的数据类型,多线程高并发支持,redis运行在内存拥有更快的读写。因为redis的表现如此出色,如何能保障redis在运行中能够应对宕机故障,

Redis支持数据的备份,即master-slave模式的数据备份。
性能极高 – Redis能读的速度是100K+次/s,写的速度是80K+次/s
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

准备环境

Centos7 --> 10.0.0.7 -->主Redis -->主Keepalived
Centos7 --> 10.0.0.8 -->从Redis -->备Keepalived
VIP --> 10.0.0.122 (此IP必须和主备2台机器同网段但没有被使用)
redis-4.0.0
下载路径:http://download.redis.io/releases/redis-6.0.8.tar.gz
KeepAlived(直接使用yum安装)

Redis编译安装

1、提前准备好的redis软件放在/opt目录下:redis-4.0.0.tar.gz

cd /opt
tar -zxvf redis-4.0.0.tar.gz
mv redis-4.0.0 redis
cd redis
makeMALLOC=libc
make PREFIX=/usr/local/redis install

2、配置redis启动脚本

vim /etc/init.d/redis

#!/bin/sh
#chkconfig:2345 80 90
# Simple Redisinit.d script conceived to work on Linux systems
# as it doesuse of the /proc filesystem.

#配置redis端口号
REDISPORT=6379
#配置redis启动命令路径
EXE=/usr/local/redis/bin/redis-server
#配置redis连接命令路径
CLIEXE=/usr/local/redis/bin/redis-cli
#配置redis运行PID路径
PIDFILE=/var/run/redis_6379.pid
#配置redis的配置文件路径
CONF="/etc/redis/redis.conf"
#配置redis的连接认证密码
REDISPASSWORD=123456

function start () {
        if [ -f $PIDFILE ]

        then
                echo "$PIDFILE exists,process is already running or crashed"
        else
                echo "Starting Redisserver..."
                $EXE $CONF &
        fi
}

function stop () {
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXE -p $REDISPORT -a $REDISPASSWORD shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting forRedis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
}

function restart () {
        stop
        sleep 3
        start
}

case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    *)
    echo -e "\e[31m Please use $0 [start|stop|restart] asfirst argument \e[0m"
    ;;
esac
授予执行权限:chmod +x /etc/init.d/redis
添加开机启动:
chkconfig --add redis
chkconfig redis on
查看:chkconfig --list | grep redis

此次试验事先关闭了防火墙和selinux,生产环境建议开启防火墙。

3、添加redis命令环境变量

#vi /etc/profile
#添加下一行参数
exportPATH="$PATH:/usr/local/redis/bin"
#环境变量生效
source /etc/profile

4、启动redis服务

systemctl start  redis 
#检查启动情况
ps -ef | grep redis
image.png

注:在我们两台服务器上先执行同样的操作安装完成redis,接下来安装完成后,就直接进入配置主从环境。

Redis主从配置

我们的思路是以10.0.0.7作为主,10.0.0.8作为从,10.0.0.122作为VIP漂移地址,应用通过10.0.0.122的6379端口访问redis数据库。

正常运行下,当主节点10.0.0.7宕机后,VIP飘逸到10.0.0.8上,这时10.0.0.8就会接管10.0.0.7成为主节点,10.0.0.7就会成为从节点,继续提供读写操作。

当10.0.0.7恢复正常后,这时10.0.0.7会与10.0.0.8进行一次数据同步,10.0.0.7原有的数据不会丢失,还会同步宕机之间已经写入到10.0.0.8的数据,数据同步完成之后,

VIP会因为权重的原因重新回到10.0.0.7节点上并成为主节点,10.0.0.8会因为失去VIP会重新成为从节点,恢复到初始状态继续提供不间断的读写服务。

1、配置redis的配置文件
Master-10.0.0.7配置文件

vim /etc/redis/redis.conf
    bind 0.0.0.0
    port 6379
    daemonize yes
    requirepass 123456
    slave-serve-stale-data yes
    slave-read-only no

Slave-10.0.0.8配置文件

vim /etc/redis/redis.conf
    bind 0.0.0.0
    port 6379
    daemonize yes
    slaveof 10.0.0.7 6379
    masterauth 123456
    slave-serve-stale-data yes
    slave-read-only no

2、配置完成后重启redis服务!验证主从是否正常。
主节点10.0.0.7终端登录测试:
[root@localhost ~]# redis-cli -a 123456
127.0.0.1:6379> INFO

.
image.png

从节点10.0.0.8终端登录测试:
[root@localhost ~]# redis-cli -a 123456
127.0.0.1:6379> info

image.png

3、同步测试

主节点10.0.0.7


image.png

从节点10.0.0.8


image.png

到此redis的主从已经完成!

KeepAlived配置实现双机热备

使用Keepalived实现VIP,并且通过notify_master、notify_backup、notify_fault、notify_stop来实现容灾。

1、配置Keepalived配置文件

主Keepalived配置文件

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id redis01
}

vrrp_script chk_redis {
    script "/etc/keepalived/script/redis_check.sh"
    interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777984
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        10.0.0.122
    }

    notify_master /etc/keepalived/script/redis_master.sh
    notify_backup /etc/keepalived/script/redis_backup.sh
    notify_fault  /etc/keepalived/script/redis_fault.sh  
    notify_stop   /etc/keepalived/script/redis_stop.sh
}

备用Keepalived配置文件

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id redis02
}

vrrp_script chk_redis {
    script "/etc/keepalived/script/redis_check.sh"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eno16777984
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        10.0.0.122
    }

    notify_master /etc/keepalived/script/redis_master.sh
    notify_backup /etc/keepalived/script/redis_backup.sh
    notify_fault  /etc/keepalived/script/redis_fault.sh  
    notify_stop  /etc/keepalived/script/redis_stop.sh
}

2、配置脚本
Master KeepAlived --10.0.0.7

创建存放脚本目录:mkdir -p /etc/keepalived/script/
cd /etc/keepalived/script/
[root@localhost script]# cat redis_check.sh 
#!/bin/bash 
ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING` 
if [ "$ALIVE" == "PONG" ];then
echo $ALIVE 
exit 0 
else
echo $ALIVE 
exit 1 
fi
[root@localhost script]# cat redis_master.sh 
#!/bin/bash
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
sleep 15
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >>$LOGFILE 2>&1
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 10.0.0.8 6379 >>$LOGFILE  2>&1
if [ $? -ne 0 ];then
    echo "data rsync fail." >>$LOGFILE 2>&1
else
    echo "data rsync OK." >> $LOGFILE  2>&1
fi
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态 
echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
if [ $? -ne 0 ];then
    echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1
else
    echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILE  2>&1
fi
[root@localhost script]# cat redis_backup.sh 
#!/bin/bash 
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >>$LOGFILE 2>&1
sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色 
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 10.0.0.8 6379 >>$LOGFILE  2>&1
[root@localhost script]# cat redis_fault.sh 
#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
[root@localhost script]# cat redis_stop.sh 
#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

Slave KeepAlived -- 10.0.0.8

创建存放脚本目录:mkdir -p /etc/keepalived/script/
cd /etc/keepalived/script/
[root@localhost script]# cat redis_check.sh 
#!/bin/bash 
ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING` 
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE 
exit 0 
else
echo $ALIVE 
exit 1 
fi
[root@localhost script]# cat redis_master.sh 
#!/bin/bash 
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >>$LOGFILE 2>&1
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 10.0.0.7 6379 >>$LOGFILE  2>&1
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态 
echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
[root@localhost script]# cat redis_backup.sh 
#!/bin/bash 
REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >>$LOGFILE 2>&1
sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色 
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 10.0.0.7 6379 >>$LOGFILE  2>&1
[root@localhost script]# cat redis_fault.sh 
#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
[root@localhost script]# cat redis_stop.sh 
#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

3、启动服务

systemctl start keepalived
systemctl enable keepalived

4、测试服务是否正常

ps -ef | grep keepalived
image
ping 172.16.81.139
image

查看VIP地址

image

测试连接redis是否正常

redis-cli -h 172.16.81.139 -p 6379 -a 123456

image

Keepalived测试完成!!

测试故障转移情况

关闭主redis服务,查看从redis是否会接管VIP变成主?然后再新的主redis141上插入数据,测试当140恢复,数据是否存在?141的是否会变成从节点?

1、主140关闭redis

service redis stop

2、查看141状态

测试VIP连接远程连接

image

通过INFO可以查看状态信息

image

可以看到从节点的141已经变成master节点了。

3、插入数据

image

4、开启140主节点

service redis start

5、查看140和141的主从状态
141的状态,变回了从


image

140的状态,变回了主

image

我们在140上查看刚刚在141上插入的新数据

image

数据存在,证明主从切换是正常的!!!

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

推荐阅读更多精彩内容