Redis高可用方案:使用Keepalived实现主备双活
注意:请确保已经安装Redis和keepalived,本文不在介绍如何安装。
1、使用版本说明
Redis版本:5.0.2
Keepalived版本:1.3.5
Linux 版本:Centos7.9
查看Redis版本:
/usr/local/redis/bin/redis-cli -v

查看Keepalived版本信息:
rpm -qa|grep keepalived 或者 keepalived -v

2、功能实现说明:
- 使用Keepalived提供虚拟IP对外访问Redis
- Redis搭建主从数据同步,主用来读写数据 、从主要进行主数据同步备份。
- 当主出现宕机,Keepalived虚拟IP自动指向从服务器。从服务器临时变为主服务器继续工作。
- 待主服务器重新启动后,Keepalived虚拟IP重新指向主服务器。主服务器同步从服务器数据后继续工作。从服务器由临时主变为从继续进行主数据同步备份。
3、说明图
Keepalived会生成一个虚拟IP。客户端需要访问虚拟IP进行Redis连接:
3.1 、主和备服务器运行中

3.2、主宕机,备服务器运行中

3.3、 主恢复,备服务器运行中

4、搭建Redis主从
首先确保两台服务器都安装了Redis服务,Redis的端口号和密码两台服务器必须保持一致。我这里两台服务器都是使用端口号:6379和密码:1234qwer
服务器IP:
主服务器:192.168.42.130
备服务器:192.168.42.133
4.1、 修改配置文件
首先需要修改备服务器redis配置文件,把备服务器redis挂载到主服务器redis下面实现主从配置。
进入redis目录
cd /usr/local/redis/
修改redis.conf文件
vim redis.conf
找到replicaof和masterauth属性进行配置
# replicaof <masterip> <masterport>
replicaof 192.168.42.130 6379
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
#
# masterauth <master-password>
masterauth "1234qwer"
replicaof:主服务器IP和端口号
masterauth:用于在进行主从复制时,保护Redis主节点的数据安全。密码就是设置相同的主从节点的密码。以确保只有经过授权的从节点才能够连接到主节点。如果不配置,会导致节点连接失败:master_link_status:down
通过登录redis输入:info replication 可以查看Redis集群配置信息。如果搭建成功,会显示节点信息。
注意: 在Redis 5.0及以上版本,SLAVEOF 命令已经被废弃,并且在服务器上使用该命令会导致命令失效。所以在Redis 5.0及以上版本,设置复制的正确方法是使用 REPLICAOF 命令。为了兼容旧版本,通过配置的方式仍然支持 slaveof,但是通过命令的方式则不行了。
4.2、验证主从复制功能
验证方式:登录主服务器Redis,插入一条key数据。在备服务器中登录Redis进行通过该key进行查询,查看是否获取到数据。如果数据获取成功,说明Redis主从复制搭建成功。
进入主服务器登录redis
/usr/local/redis/bin/redis-cli
进行密码认证
auth 1234qwer
输出OK,表示认证成功。存入数据
set verify-key "Test Verify is Success"
输出OK,表示插入成功。接下来登录备服务器查看数据。进入备服务器登录redis:
/usr/local/redis/bin/redis-cli
进行密码认证
auth 1234qwer
输出OK,表示认证成功。获取key数据
get verify-key
输出:"Test Verify is Success",说明Redis主从搭建成功。
5、配置Keepalived信息
/etc/keepalived目录中存放keepalived.conf文件。在该目录下创建scripts_redis文件夹,目录 /etc/keepalived/scripts_redis,将 redis_stop.sh 、redis_master.sh、redis_fault.sh 、redis_check.sh 、redis_backup.sh 放入scripts_redis文件目录下。
5.1 主服务器配置
编写keepalived.conf
! Configuration File for keepalived
global_defs {
router_id redis-master #唯一标识 注意主备服务名不可相同
script_user root
enable_script_security
}
vrrp_script redis_check { #脚本检测名称,下方调用必须和这个名称一致
script "/etc/keepalived/scripts_redis/redis_check.sh" #监听redis是否启动脚本路径
interval 4 #监听心跳
weight -5
fall 3
rise 2
}
vrrp_instance VI_redis {
state MASTER #当前keepalived状态 MASTER 或者 BACKUP
interface eth0 #网卡名称根据实际情况设置可通过命令ifconfig查看
virtual_router_id 21
priority 110 #权重 主服务要高于备服务
garp_master_refresh 10
garp_master_refresh_repeat 2
advert_int 1
nopreempt
unicast_src_ip 192.168.42.130 #单播模式 当前服务器主服务器IP地址
unicast_peer {
192.168.42.133 #备服务器Ip
}
authentication { #keepalived之间通信的认证账号、密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.42.161 #虚拟IP地址 客户端统一的访问地址
}
garp_master_delay 1
garp_master_refresh 5
track_interface {
eth0 #网卡
}
track_script {
redis_check #脚本检测调用名称
}
notify_master /etc/keepalived/scripts_redis/redis_master.sh #master脚本 keepalived设置的状态为master时触发或者master停止后,backup升级为master时触发
notify_backup /etc/keepalived/scripts_redis/redis_backup.sh #backup脚本 keepalived设置的状态为backup时触发
notify_fault /etc/keepalived/scripts_redis/redis_fault.sh #fault脚本
notify_stop /etc/keepalived/scripts_redis/redis_stop.sh #stop脚本 keepalived停止时触发
}
编写 redis_master.sh,当主脚本启动时,需要先同步备服务器redis数据后,在设置为主节点进行启动:
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-status.log
REDISCLI="/usr/local/redis/bin/redis-cli"
echo "Running redis_master.sh..." >>$LOGFILE
echo "[Master]" >> $LOGFILE
date >> $LOGFILE
echo "Being Master..." >> $LOGFILE
echo "Running SLAVEOF cmd..." >> $LOGFILE
$REDISCLI -h 192.168.42.130 -p 6379 -a 1234qwer CONFIG SET masterauth "1234qwer" 2>&1
$REDISCLI -h 192.168.42.130 -p 6379 -a 1234qwer REPLICAOF 192.168.42.133 6379 2>&1
sleep 5s
echo "Run slaveof no one cmd..." >>$LOGFILE
$REDISCLI -h 192.168.42.130 -p 6379 -a 1234qwer REPLICAOF NO ONE >>$LOGFILE 2>&1
echo "Finished running redis_master.sh..." >>$LOGFILE
编写redis_backup.sh,
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-status.log
REDISCLI="/usr/local/redis/bin/redis-cli"
echo "Running redis_bakcup.sh..." >>$LOGFILE
echo "[Backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being Slave..." >> $LOGFILE
echo "Run SLAVEOF cmd..." >> $LOGFILE
$REDISCLI -h 192.168.42.130 -p 6379 -a 1234qwer CONFIG SET masterauth "1234qwer" >>$LOGFILE 2>&1
$REDISCLI -h 192.168.42.130 -p 6379 -a 1234qwer REPLICAOF 192.168.42.133 6379 >>$LOGFILE 2>&1
echo "Finished running redis_backup.sh..." >>$LOGFILE
5.2、备服务器配置
编写keepalived.conf
! Configuration File for keepalived
global_defs {
router_id redis-slave #唯一标识 注意主备服务名不可相同
script_user root
enable_script_security
}
vrrp_script redis_check {
script "/etc/keepalived/scripts_redis/redis_check.sh" #监听redis是否启动脚本路径
interval 4 #监听心跳
weight -5
fall 3
rise 2
}
vrrp_instance VI_redis {
state BACKUP #当前keepalived状态 设置为BACKUP
interface eth0
virtual_router_id 21
priority 100
garp_master_refresh 10
garp_master_refresh_repeat 2
advert_int 1
nopreempt
unicast_src_ip 192.168.42.133 #单播模式 当前服务器IP地址
unicast_peer {
192.168.42.130 #主服务器Ip
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.42.161 #虚拟IP地址 客户端统一的访问地址
}
garp_master_delay 1
garp_master_refresh 5
track_interface {
eth0
}
track_script {
redis_check
}
notify_master /etc/keepalived/scripts_redis/redis_master.sh
notify_backup /etc/keepalived/scripts_redis/redis_backup.sh
notify_fault /etc/keepalived/scripts_redis/redis_fault.sh
notify_stop /etc/keepalived/scripts_redis/redis_stop.sh
}
编写redis_master.sh
#!/bin/bash
# LOGFILE文件需要跟据实际情况更改
LOGFILE=/var/log/keepalived-redis-status.log
REDISCLI="/usr/local/redis/src/redis-cli"
echo "Running redis_master.sh..." >>$LOGFILE
echo "[Master]" >> $LOGFILE
date >> $LOGFILE
echo "Begin Master ..." >> $LOGFILE
echo "Run slaveof no one cmd...">>$LOGFILE
# SLAVEOF 5.0以上已经弃用 REPLICAOF
$REDISCLI -h 192.168.42.133 -p 6379 -a 1234qwer REPLICAOF NO ONE >>$LOGFILE 2>&1
echo "Finished running redis_master.sh..." >>$LOGFILE
编写redis_backup.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-status.log
REDISCLI="/usr/local/redis/src/redis-cli"
echo "Running redis_bakcup.sh..." >>$LOGFILE
echo "[Backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being Slave..." >> $LOGFILE
sleep 15s #休眠15秒,确保主服务器脚本redis_master.sh执行完毕后在执行主从命令
echo "Run SLAVEOF cmd..." >> $LOGFILE
# SLAVEOF 5.0已经弃用 改为:REPLICAOF
$REDISCLI -h 192.168.42.133 -p 6379 -a 1234qwer CONFIG SET masterauth "1234qwer" >>$LOGFILE 2>&1
$REDISCLI -h 192.168.42.133 -p 6379 -a 1234qwer REPLICAOF 192.168.42.130 6379 >>$LOGFILE 2>&1
echo "Finished running redis_backup.sh..." >>$LOGFILE
5.3、编写验证Redis是否启动脚本
编写redis_check.sh脚本,通过监听端口号判断(主备一致)
#!/bin/bash
LOGFILE=/var/log/check-redis-status.log
echo "Running redis_check.sh..." >> $LOGFILE
date >> $LOGFILE
CHECK=$(ss -tnlp|grep 6379)
if [ $? -ne 0 ]; then
echo "redis-server is not running..." >> $LOGFILE
systemctl stop keepalived.service
exit 1
else
echo "redis-server is running..." >> $LOGFILE
exit 0
fi
echo "Finished running redis_check.sh..." >> $LOGFILE
5.4 其他脚本
编写 redis_fault.sh (主备一致)
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-status.log
echo "Running redis_fault.sh..." >>$LOGFILE
echo "[Fault]" >> $LOGFILE
date >> $LOGFILE
echo "Finished running redis_fault.sh..." >> $LOGFILE
编写 redis_stop.sh (主备一致)
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-status.log
echo "Running redis_stop.sh...." >>$LOGFILE
echo "[Stop]" >> $LOGFILE
date >> $LOGFILE
echo "Finished running redis_stop.sh...." >>$LOGFILE
5.5、给脚本授可执行权限
chmod +x /etc/keepalived/scripts_redis/*.sh
5.6、 keepalived相关命令
Keepalived 安装命令
yum install keepalived -y
Keepalived配置所在目录
/etc/keepalived
Keepalived 日志文件
/var/log/message
启动Keepalived命令
systemctl start keepalived.service
重启Keepalived命令
systemctl restart keepalived.service
查看Keepalived状态命令
systemctl status keepalived.service
查看Keepalived虚拟VIP ip
ip addr
关闭Keepalived命令
systemctl stop keepalived.service
6、验证主备双活
我们可以通过连接工具RedisDesktopManager进行测试主备双活。首先连接地址填写keepalived生成的虚拟IP地址:192.168.42.161、 输入端口号:6379和密码:1234qwer

连接成功后,插入一条数据进行数据测试。之后在把主服务器redis停止模拟服务器宕机,测试连接继续进行数据插入。然后在把主服务器redis启动,keepalived也需要启动。启动完成后查看数据是否一致。如果一致说明主备双活搭建成功。

Redis高可用方案:使用Keepalived实现主备双活的更多相关文章
- Windows版本redis高可用方案探究
目录 Windows版本redis高可用方案探究 前言 搭建redis主从 配置主redis-28380 配置从redis-23381 配置从redis-23382 将redis部署为服务 启动red ...
- Redis高可用方案-哨兵与集群
Redis高可用方案 一.名词解释 二.主从复制 Redis主从复制模式可以将主节点的数据同步给从节点,从而保障当主节点不可达的情况下,从节点可以作为 后备顶上来,并且可以保障数据尽量不丢失(主从 ...
- Redis高可用方案----Redis主从+Sentinel+Haproxy
安装环境 这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为6379,redis-sentinel的端口为26379. ...
- 深入理解Redis高可用方案-Sentinel
Redis Sentinel是Redis的高可用方案.是Redis 2.8中正式引入的. 在之前的主从复制方案中,如果主节点出现问题,需要手动将一个从节点升级为主节点,然后将其它从节点指向新的主节点, ...
- MySQL高可用基础之keepalived+双主复制【转】
环境:MySQL-VIP:192.168.1.3MySQL-master1:192.168.1.1MySQL-master2:192.168.1.2 OS版本:CentOS release 6.4 ( ...
- 理解redis高可用方案
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解
Redis的哨兵机制是官方推荐的一种高可用(HA)方案,我们在使用Redis的主从结构时,如果主节点挂掉,这时是不能自动进行主备切换和通知客户端主节点下线的. Redis-Sentinel机制主要用三 ...
- Redis高可用配置(Keepalived)
主:172.16.0.104 备:172.16.0.105 VIP:172.16.0.107 客户端直接连VIP,当master 104的redis挂掉后,105作为master.当104重启后,10 ...
- 容器化redis高可用方案
偶然看到一个GITHUB项目,提供了一套Docker Compose下的redis Sentinel方案. 项目地址https://github.com/AliyunContainerService/ ...
- redis high available solution/ redis 高可用方案
http://developers.linecorp.com/blog/?p=1420 http://engineering.docusign.com/articles/redis-sentinel- ...
随机推荐
- 从PDF到OFD,国产化浪潮下多种文档格式导出的完美解决方案
前言 近年来,中国在信息技术领域持续追求自主创新和供应链安全,伴随信创上升为国家战略,一些行业也开始明确要求文件导出的格式必须为 OFD 格式.OFD 格式目前在政府.金融.税务.教育.医疗等需要文件 ...
- 对linux的理解--个人理解
linux系统中的命令我觉得可以和windows上的点点点,如文件的查找,文件的新建.删除,用户的添加.删除等来对比理解.一个是点点点,一个是用命令来完成. --------------------- ...
- 洛谷P1003
洛谷P1003 题目大意 简而言之就是在坐标轴上铺地毯,根据输入的坐标将地毯放在坐标轴上,然后最后给出一个坐标,找到铺在这个坐标上最上面的地毯编号 Train of thought 首先我们应该找到每 ...
- WPF/C#:在WPF中如何实现依赖注入
前言 本文通过 WPF Gallery 这个项目学习依赖注入的相关概念与如何在WPF中进行依赖注入. 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于 ...
- java后端解决请求跨域
跨域 跨域:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 例如:a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同 ...
- 利用FastAPI和OpenAI-Whisper打造高效的语音转录服务
最近好久没有写博客了,浅浅记录下如何将OpenAI-Whisper做成Web服务吧 介绍 在这篇指导性博客中,我们将探讨如何在Python中结合使用FastAPI和OpenAI-Whisper.Ope ...
- [oeasy]python0086_ASCII_出现背景_1963年_DEC_PDP系列主机_VT系列终端
编码进化 回忆上次内容 上次 回顾了 字符编码的新陈代谢 ibm 曾经的EBCDIC 由于 字符不连续 导致 后续 出现无数问题 随着 网络的发展 数据交换的 需要 原来的小隐患 现在 产生了 巨大问 ...
- 单细胞测序最好的教程(十):细胞类型注释迁移|万能的Transformer
作者按 本章节主要讲解了基于transformer的迁移注释方法TOSICA,该算法在迁移注释上达到了SOTA的水平,在注释这么卷的赛道愣是杀出了一条血路.本教程首发于单细胞最好的中文教程,未经授权许 ...
- js 做树形数组查询筛选功能
对二级菜单进行搜索查询: watch: { librarySearch(val) { if(val == '') { this.libraryFiles = this.libraryFilesAll ...
- 【Tutorial C】05 操作符 & 表达式
基本运算符 C使用运算符(operator)来代表算术运算.例如,+运算符可以使它两侧的值加在一起. 如果您觉得术语"运算符"听起来比较奇怪,那么请您记住那些东西总得有个名称. 与 ...