redis搭建一主一从+keepalived(虚拟IP)实现高可用

news/2025/3/25 23:25:47/

rediskeepalivedIP_0">redis搭建一主一从+keepalived(虚拟IP)实现高可用

前提
有两台机器:如 10.50.3.141 10.50.3.142,虚拟ip如:10.50.3.170

安装redis(两台机器执行):

# 启用Remi仓库(CentOS 7)
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm# 安装Redis 6.x
sudo yum --enablerepo=remi install redis -y# 验证版本
redis-server --version

配置Redis主从
vim /etc/redis.conf
主节点的配置文件

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 60 100
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
# 从节点同步密码
masterauth 123456
slave-serve-stale-data no
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
#配置正确的redis连接密码
requirepass 123456appendonly yes
appendfilename "appendonly.aof"
appendfsync always
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb#这是虚拟IP
replicaof 10.50.3.170 6379

从节点的配置文件

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised systemd
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile "/var/log/redis/redis.log"
databases 16
save 60 100
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/var/lib/redis"
# 从节点同步密码
masterauth "123456"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
#配置正确的redis连接密码
requirepass "123456"
slave-serve-stale-data noappendonly yes
appendfilename "appendonly.aof"
appendfsync always
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb# Generated by CONFIG REWRITE
latency-tracking-info-percentiles 50 99 99.9
user default on sanitize-payload #ea2c0ed04d278df4c7b5f9de01217a0c8122313ecc7514483f3e4af9f702029a ~* &* +@all

重启Redis服务(两台服务器执行)

sudo systemctl restart redis
sudo systemctl enable redis

安装Keepalived(两台服务器执行)​

sudo yum install keepalived -y

配置Keepalived虚拟IP
主节点的配置文件
vim /etc/keepalived/keepalived.conf

global_defs {router_id REDIS_HA_MASTER     # 主节点标识(从节点改为REDIS_HA_SLAVE)vrrp_skip_check_adv_addr      # 允许忽略广播地址检查#vrrp_strict                  # 必须注释,否则VIP无法绑定
}! ------------------- Redis健康检查配置 -------------------
vrrp_script chk_redis {script "/usr/local/bin/check_redis.sh"interval 2weight -20timeout 5
}! ------------------- Redis虚拟IP实例 -------------------
vrrp_instance VI_REDIS {state MASTER                  # 从节点改为 BACKUPinterface eth0                # 网卡名用ip addr确认(如ens192)virtual_router_id 88          # 主从必须相同(1-255,不与其它服务冲突)priority 100                  # 主节点100,从节点设为更低值(如90)advert_int 1authentication {auth_type PASSauth_pass RedisHA@123     # 主从密码需一致(建议修改)}virtual_ipaddress {10.50.3.170/24 dev eth0           # 虚拟IP(掩码按实际网络调整)}track_script {chk_redis}# 确保启用抢占模式(主节点恢复后自动夺回VIP)preempt delay 300notify_master "/usr/local/bin/master.sh"notify_backup "/usr/local/bin/backup.sh"
}

从节点的配置文件

global_defs {router_id REDIS_HA_SLAVE     # 主节点标识(从节点改为REDIS_HA_SLAVE)vrrp_skip_check_adv_addr      # 允许忽略广播地址检查#vrrp_strict                  # 必须注释,否则VIP无法绑定
}! ------------------- Redis健康检查配置 -------------------
vrrp_script chk_redis {script "/usr/local/bin/check_redis.sh"interval 2weight 2timeout 5
}! ------------------- Redis虚拟IP实例 -------------------
vrrp_instance VI_REDIS {state BACKUP                  # 从节点改为 BACKUPinterface eth0                # 网卡名用ip addr确认(如ens192)virtual_router_id 88          # 主从必须相同(1-255,不与其它服务冲突)priority 90                   # 主节点100,从节点设为更低值(如90)advert_int 1authentication {auth_type PASSauth_pass RedisHA@123     # 主从密码需一致(建议修改)}virtual_ipaddress {10.50.3.170/24 dev eth0}track_script {chk_redis}# 确保启用抢占模式(主节点恢复后自动夺回VIP)preempt delay 300notify_master "/usr/local/bin/master.sh"notify_backup "/usr/local/bin/backup.sh"
}

配置健康检查及切换脚本
主节点
/usr/local/bin/check_redis.sh

REDIS_PASS="123456"
LOG_FILE="/var/log/redis_health.log"# 检查Redis进程
if ! pgrep -x redis-server >/dev/null; thenecho "$(date) - Redis进程不存在" >> $LOG_FILEexit 1
fi# 检查服务响应(增加超时3秒)
if ! timeout 3 redis-cli -a "$REDIS_PASS" ping 2>/dev/null | grep -q PONG; thenecho "$(date) - Redis服务无响应" >> $LOG_FILEexit 1
fiecho "$(date) - 状态正常" >> $LOG_FILE
exit 0

/usr/local/bin/master.sh

#!/bin/bash
redis-cli -a 123456 replicaof no one

/usr/local/bin/backup.sh

#!/bin/bash
redis-cli -a 123456 replicaof 10.50.3.170 6379

从节点
/usr/local/bin/check_redis.sh

REDIS_PASS="123456"
LOG_FILE="/var/log/redis_health.log"# 检查Redis进程
if ! pgrep -x redis-server >/dev/null; thenecho "$(date) - Redis进程不存在" >> $LOG_FILEexit 1
fi# 检查服务响应(增加超时3秒)
if ! timeout 3 redis-cli -a "$REDIS_PASS" ping 2>/dev/null | grep -q PONG; thenecho "$(date) - Redis服务无响应" >> $LOG_FILEexit 1
fiecho "$(date) - 状态正常" >> $LOG_FILE
exit 0

/usr/local/bin/master.sh

#!/bin/bash
# 提升为主节点时,强制所有其他节点成为本节点的从节点
redis-cli -a 123456 REPLICAOF NO ONE
# 更新其他节点的复制关系(假设节点列表已知)
for node in 10.50.3.141; doredis-cli -h $node -a 123456 REPLICAOF 10.50.3.170 6379
done

/usr/local/bin/backup.sh

#!/bin/bash
redis-cli -a 123456 replicaof 10.50.3.170 6379

启动Keepalived

sudo systemctl start keepalived
sudo systemctl enable keepalived

验证

redis-cli -a 123456 SET testkey "hello"
redis-cli -a 123456 GET testkey主节点 systemctl stop redis
ip addr  看是否漂移到从节点,然后set get key来试下是否正常

http://www.ppmy.cn/news/1582566.html

相关文章

vue3配置代理实现axios请求本地接口返回PG库数据【前后端实操】

前端编写 安装 axios 如果当前未安装axios,可以执行如下指令安装 npm install axios配置代理 当前为基于Vite构建的项目,在 vite.config.ts 中配置代理,在defineConfig中新增server配置,主要关注两个点: 一、需要代…

IS-IS原理与配置

一、IS-IS概述 IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是ISO(International Organization for Standardization,国际标准化组织)为它的CLNP(ConnectionLessNet…

2025年3月GESP八级真题解析

第一题——上学 题目描述 C 城可以视为由 n n n 个结点与 m m m 条边组成的无向图。这些结点依次以 1 , 2 , … , n 1,2,…,n 1,2,…,n 标号,边依次以 1 , 2 , … , m 1,2,…,m 1,2,…,m 标号。第 i i i 条边( 1 ≤ i ≤ m 1≤i≤m 1≤i≤m&#…

深入理解 Redis SDS:高效字符串存储的秘密

目录 1. 引言 1.1 Redis 中字符串的广泛应用 2. SDS 结构定义 2.1 Redis 3.2 之前的 SDS 结构 2.2 Redis 3.2 及之后的 SDS 结构 3. SDS 与传统 C 字符串的比较 3.1 获取字符串长度 3.2 缓冲区溢出问题 3.3 二进制安全性 3.4 内存分配次数 4. SDS 的内存分配策略 4.…

Spring Boot分布式项目异常处理实战:从崩溃边缘到优雅恢复

当单体应用拆分成分布式系统,异常就像被打开的潘多拉魔盒:RPC调用超时、分布式事务雪崩、第三方接口突然罢工…在最近的电商大促中,我们的系统就经历了这样的至暗时刻。本文将用真实代码示例,展示如何构建分布式异常处理体系。 一…

路由Vue Router基本用法

路由的作用是根据URL来匹配对应的组件,并且无刷新切换模板的内容。vue.js中,可使用Vue Router来管理路由,让构建单页应用更加简单。 一、效果 二、实现 1.项目中安装Vue Router插件 pnpm install vue-routerlastest 2.main.js import { …

数据结构:二叉树(二)·(重点)

前言 文章结尾有彩蛋哦~~ 前面我们已经知道了什么是树,树是⼀种⾮线性的数据结构,它是由 n ( n>0 ) 个有限结点组成⼀个具有层次关系的集合。 那么这篇文章就让我们来了解一下什么是二叉树吧! 二叉树的概念与结…

2025年01月02日浙江鼎永前端面试

目录 webpack 和 vite 区别react fiber 架构vue diff 算法react diff 算法hooks 源码垂直水平布局项目介绍单点登录大文件上传微前端 1. webpack 和 vite 区别 Webpack 和 Vite 是两种不同的前端构建工具,它们在设计理念、性能表现和使用场景上存在显著差异。以下…