Redis高可用方案:使用Keepalived实现主备双活

news2024/11/17 23:51:15

注意:请确保已经安装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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac系统搭建Sonic总结

1.参考文档 https://sonic-cloud.cn/ https://mp.weixin.qq.com/s/PBnmgsmpXsQxtHU9g_05fA 测试设备&#xff1a;建议使用模拟器 Android&#xff1a;Android Studio自带模拟器 iOS&#xff1a;Xcode自带模拟器 2.所遇问题 1)拉取mysql5.7提示docker: no matching manif…

基于jstat 进行JVM监控

文章目录 引言I jstat 统计信息工具JVM 堆内存布局命令格式元数据空间统计堆内存统计JVM编译方法统计编译统计类加载统计II JVM调优基本概念: 应用程序的响应时间(RT)和吞吐量(QPS)JVM调优原理调优思路调优方法JVM调优技巧建议III 基于jstat 分析垃圾回收情况,进行JVM调优…

基于RS232的VGA显示

前言 基于ROM的VGA显示缺点&#xff1a;需要将图片转化为mif文件&#xff0c;使用的RAM是FPGA内部RAM模拟出来的&#xff0c;占用资源大切换显示图片需要重新转化&#xff0c;对ROM进行写入&#xff0c;使用极不方便&#xff0c;因此这里采用RS232进行VGA显示。 正文 一、基于…

跨境电商静态IP选择:机房IP还是住宅IP?

在跨境电商日益繁荣的今天&#xff0c;选择合适的静态IP代理对于网店的成功至关重要。代理IP不仅影响着店铺的网络连接速度和稳定性&#xff0c;还直接关系到店铺的安全性和防封能力。对于跨境网店而言&#xff0c;有静态机房IP和静态住宅IP两种选择。那么&#xff0c;究竟哪种…

病理切片染色标准化以及虚拟染色的系统总结|专题总结·24-08-30

小罗碎碎念 本期推文主题&#xff1a;虚拟染色及染色标准化在病理AI中的应用 昨晚1群在讨论虚拟染色和染色标准化&#xff0c;2群在讨论病理基础模型&#xff0c;二者恰好互补了&#xff0c;哈哈。 染色标准化的文章大致分为两种类型——一种是专门研究标准化&#xff0c;还有…

大模型Prompt提示设计简介(1)

提示设计是一门艺术&#xff0c;它涉及到精心构思的语句&#xff0c;旨在从语言模型中激发出我们渴望得到的回复。编写一个结构精巧、引人入胜的提示&#xff0c;是确保我们从语言模型那里获得既准确又高质量的答案的关键步骤。在这篇文章中&#xff0c;我们将深入探讨一些基本…

SQL 注入之 sqlmap 实战

在网络安全领域&#xff0c;SQL 注入攻击一直是一个严重的威胁。为了检测和利用 SQL 注入漏洞&#xff0c;安全人员通常会使用各种工具&#xff0c;其中 sqlmap 是一款非常强大且广泛使用的开源 SQL 注入工具。本文将详细介绍 sqlmap 的实战用法。 一、sqlmap 简介 sqlmap 是一…

Nat Commun系列|如何像搭积木一样去搭建你自己的病理AI模型框架|专题总结·24-08-30

小罗碎碎念 前情铺垫 今天的第一篇推文更偏向理论知识&#xff0c;分享了多篇综述&#xff0c;帮助大家快速了解病理切片染色标准化和虚拟染色的内容。 那么这期推文则是补充第一篇推文没有涉及的部分——染色标准化如何作为预处理流程出现在整体的框架中——准备了三篇Nature…

【中仕公考是骗子吗】公务员联考是什么意思?

公务员联考是指由多个省份在同一时间举行招录考试&#xff0c;并且这些省份在考试内容上保持较高的一致性。参与联考的省份往往采用同一套或相近的试卷&#xff0c;在具体的题量、难度或题型分布上可能会根据各自情况进行调整&#xff0c;同时可能加入一些具有本省特色的元素。…

基于web旅游信息平台的设计与实现

三、系统分析 &#xff08;一&#xff09;识别参与者 对于平台功能需求的分析&#xff0c;我们定位了四种参与者&#xff1a;普通用户、注册用户、企业级用户、网站维护人员。现对参与者描述如下&#xff1a; &#xff08;1&#xff09;普通用户 描述&#xff1a;可以注册成…

安全帽佩戴监测摄像机

安全帽是工业生产中必不可少的安全防护装备&#xff0c;能有效保护工人头部免受意外伤害。然而&#xff0c;管理人员往往难以监督工人是否正确佩戴安全帽&#xff0c;这可能导致一些潜在的安全隐患。为了解决这一问题&#xff0c;一种新型的安全帽佩戴监测摄像机 应运而生。 这…

python基础(13魔法方法介绍)

python系列文章目录 python基础&#xff08;01变量&数据类型&运算符&#xff09; python基础&#xff08;02序列共性&#xff09; python基础(03列表和元组) python基础&#xff08;04字符串&字典&#xff09; python基础&#xff08;05集合set&#xff09; pytho…

docker Desktop报错 error pulling image configuration 处理

问题描述 在 docker 拉数据 出现以下错误 error pulling image configurarion&#xff1a; 这个问题 主要是 可能应该某些原因不能网络无法连上镜像 原因分析&#xff1a; 1。 2024年 5月以后 国内很多IP都 。。。懂的都懂&#xff0c;很多 VPN 也是。。。 懂的都懂&#x…

Edge资源占用优化:调整浏览器设置与关闭自动更新检查

最近&#xff0c;作者在学习过程中&#xff0c;打开任务管理器的时候注意到&#xff0c;即使没有打开浏览器&#xff0c;edge依然有着内存占用较高的情况&#xff1a; 于是就在网上收集了一些后台调优的方法&#xff0c;如果各位朋友有更多优化浏览器资源占用的方法&#xff0c…

ansible自动化运维项目详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Ansible 是一个开源的自动化工具&#xff0c;主要用于配置管理、应用部署、任务自动化和IT编排。在实际的运维项目中&#xff0c;Ansible可以帮助运维工程师以一致、可重复和可靠的方式管理大量服务器和服务…

论文翻译:Scaling Instruction-Finetuned Language Models

Scaling Instruction-Finetuned Language Models https://www.jmlr.org/papers/volume25/23-0870/23-0870.pdf 指令微调语言模型 文章目录 指令微调语言模型摘要1. 引言2. Flan微调2.1 微调数据2.2 微调过程2.3 评估协议 3. 扩展到5400亿参数和1836个任务4. 带有思维链注释的微…

python实战二-筛选多个Excel中数据

筛选12个月中单日销售额大于300的数据&#xff0c;并将符合条件数据存储到新表中。 import time from openpyxl import Workbook, load_workbook import os """ 筛选销售额大于300的销售数据&#xff0c;创建新表存储 """ def 筛选数据(file_dir…

iOS 模拟器打不开:unable to boot the simulator

重启电脑后发现模拟器打不开&#xff0c;提示如下&#xff1a; 解决方法&#xff1a; 1、在Finder里command shift G前往文件夹 ~/Library/Developer/CoreSimulator/Caches2、删除Caches文件里面的dyld文件 3、重启模拟器即可

前缀和2️⃣-二维前缀和

题目链接&#xff1a;**【模板】二维前缀和_牛客题霸_牛客网** 题目描述&#xff1a; 解法&#xff1a; 算法思路&#xff1a; 类比于一维数组的形式&#xff0c;如果我们能处理出来从[0, 0] 位置到 [i, j] 位置这片区域内所有元素的累加和&#xff0c;就可以在O(1) 的时间内…

BioEdit 序列比对编辑器

软件介绍 BioEdit是一个功能齐全免费的分子生物学应用软件&#xff0c;可以完成核苷酸序列和蛋白质序列进行所有常规的分析操作。 如&#xff1a;序列比对、序列检索、引物设计、系统发育分析等。与DNAMAN 相比&#xff0c;其分析内容相对更丰富一些&#xff0c;而且提供了很…