零数据丢失!Redis 双机热备高可用架构生产搭建指南

1 阅读8分钟

一、文档说明

1.1 适用场景

  • 中小型生产业务:需要Redis秒级高可用、业务零中断、数据零丢失的场景,如后台缓存、用户会话、热点数据存储、接口限流等
  • 单机房双机热备场景:仅两台服务器部署Redis,无需集群多节点,追求架构简单、运维成本低、稳定性高
  • 业务零感知切换需求:不允许Redis宕机导致业务报错、重连、数据丢失,需要故障自动切换
  • 数据强一致场景:双节点实时双向同步,节点恢复后自动增量补全数据

1.2 不适用场景

  • 超大规模海量数据、超高并发场景(建议使用Redis Cluster集群)
  • 异地多活、跨机房部署场景(VIP无法跨机房漂移)
  • 需要读写分离、海量读请求分流场景(该方案为单VIP统一读写)

1.3 环境参数

服务/参数详细配置
Redis版本6.2.12(生产稳定版)
节点1(主)192.168.1.20
节点2(备)192.168.1.21
虚拟IP(VIP)192.168.1.23(业务统一接入地址)
Redis端口6379
Redis密码123456(可自定义修改)
系统环境CentOS7/8、RockyLinux(兼容主流Linux发行版)
高可用组件Keepalived(VIP自动漂移、故障检测)

1.4 架构原理

采用双主互为主从+VIP单点入口架构,两台Redis节点双向实时复制数据,保证双节点数据一致;业务仅连接虚拟VIP,不直接连接物理节点。Keepalived实时监控Redis服务状态,当当前VIP所在节点Redis故障、服务宕机或机器离线时,VIP秒级漂移至正常备节点,实现业务无感知、无中断、不丢数据。

架构流程图:业务 → VIP(192.168.1.23) → Redis双主互备节点(20/21)

二、前置环境准备(两台节点统一执行)

2.1 关闭防火墙与SELinux

生产测试环境建议关闭,避免端口拦截导致同步、VIP漂移异常

# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config

2.2 安装基础依赖

# CentOS/RockyLinux
yum install -y gcc gcc-c++ make wget net-tools

# Ubuntu 系统替换为:
# apt install -y gcc make wget net-tools

2.3 配置主机映射(可选)

echo "192.168.1.20 redis-master
192.168.1.21 redis-backup" >> /etc/hosts

三、Redis6.2.12 编译安装(两台节点统一执行)

3.1 下载解压源码包

cd /usr/local
# 下载官方稳定版
wget https://download.redis.io/releases/redis-6.2.12.tar.gz
# 解压
tar -zxvf redis-6.2.12.tar.gz
# 重命名简化目录
mv redis-6.2.12 redis
cd redis

3.2 编译安装

make && make install

3.3 创建工作目录

# 数据持久化目录、配置目录
mkdir -p /var/lib/redis /etc/redis
chmod 777 /var/lib/redis

四、Redis双主互备核心配置

核心原理:两台节点互相配置replicaof,实现双向实时数据同步,配合统一密码认证,保证数据双向复制正常。

4.1 节点1 192.168.1.20 配置

# 复制默认配置文件
cp /usr/local/redis/redis.conf /etc/redis/redis-6379.conf
# 编辑配置文件
vim /etc/redis/redis-6379.conf

写入以下完整生产配置(直接覆盖原有内容):

# 网络配置
bind 0.0.0.0
port 6379
protected-mode no
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log
dir /var/lib/redis

# 认证配置(双主同步必备)
requirepass 123456
masterauth 123456

# 双主核心:同步对端节点数据
replicaof 192.168.1.21 6379
repl-backlog-size 128mb
repl-disable-tcp-nodelay yes

# RDB持久化策略
save 3600 1
save 300 100
save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
stop-writes-on-bgsave-error yes

# AOF持久化(保障数据不丢失)
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes

4.2 节点2 192.168.1.21 配置

cp /usr/local/redis/redis.conf /etc/redis/redis-6379.conf
vim /etc/redis/redis-6379.conf

写入以下完整配置:

# 网络配置
bind 0.0.0.0
port 6379
protected-mode no
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis_6379.log
dir /var/lib/redis

# 认证配置
requirepass 123456
masterauth 123456

# 双主核心:同步对端节点数据
replicaof 192.168.1.20 6379
repl-backlog-size 128mb
repl-disable-tcp-nodelay yes

# RDB持久化策略
save 3600 1
save 300 100
save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
stop-writes-on-bgsave-error yes

# AOF持久化
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes

五、配置Redis系统服务(两台统一配置)

vim /etc/systemd/system/redis.service

写入服务配置:

[Unit]
Description=Redis 6.2.12 High Available Server
After=network.target

[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis-6379.conf
ExecReload=/usr/local/bin/redis-cli -a 123456 shutdown
ExecStop=/usr/local/bin/redis-cli -a 123456 shutdown
PrivateTmp=true
Restart=no

[Install]
WantedBy=multi-user.target

5.1 启动服务并开机自启

systemctl daemon-reload
systemctl start redis
systemctl enable redis

5.2 验证双主同步状态

两台节点分别执行以下命令,查看同步状态

redis-cli -a 123456 info replication

正常结果:两台节点role均为slave,master_host指向对端IP,说明双向同步搭建成功。

六、Keepalived高可用配置

6.1 安装Keepalived(两台统一执行)

# CentOS
yum install -y keepalived

# Ubuntu
# apt install -y keepalived

6.2 编写Redis健康检测脚本(两台统一)

脚本作用:实时检测Redis存活状态,Redis异常则停止Keepalived,触发VIP漂移

vim /etc/keepalived/check_redis.sh
#!/bin/bash
# 检测Redis连通性
redis-cli -a 123456 ping | grep PONG > /dev/null 2>&1

# 异常则退出,触发VIP漂移
if [ $? -ne 0 ]; then
    systemctl stop keepalived
    exit 1
fi

添加执行权限

chmod +x /etc/keepalived/check_redis.sh

6.3 节点1(192.168.1.20)主节点配置

# 备份默认配置
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
global_defs {
   router_id redis_ha_master
}

# 检测规则:2秒检测一次,异常权重-20
vrrp_script chk_redis {
    script "/etc/keepalived/check_redis.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0  # 务必替换为服务器真实网卡名称
    virtual_router_id 51
    priority 100    # 主节点优先级更高
    advert_int 1

    # VRRP认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 绑定检测脚本
    track_script {
        chk_redis
    }

    # 虚拟VIP配置
    virtual_ipaddress {
        192.168.1.23/24 dev eth0 label eth0:1
    }
}

6.4 节点2(192.168.1.21)备节点配置

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
global_defs {
   router_id redis_ha_backup
}

vrrp_script chk_redis {
    script "/etc/keepalived/check_redis.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0  # 务必替换为服务器真实网卡名称
    virtual_router_id 51
    priority 90     # 备节点优先级低于主节点
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }

    virtual_ipaddress {
        192.168.1.23/24 dev eth0:1
    }
}

七、启动高可用服务

两台节点统一执行

systemctl start keepalived
systemctl enable keepalived

7.1 验证VIP生效

ip addr

正常状态:主节点192.168.1.20 绑定VIP 192.168.1.23,备节点无VIP

八、生产级高可用验证测试

8.1 数据同步验证

# 连接VIP写入数据
redis-cli -h 192.168.1.23 -a 123456
set ha_test 123456
get ha_test

分别登录两台物理节点查询数据,均能查询到写入数据,说明双向同步正常。

8.2 主节点Redis故障漂移测试

  1. 停止主节点Redis:systemctl stop redis
  2. 秒级检测:Keepalived检测到Redis异常,自动停止本机服务
  3. VIP自动漂移至备节点192.168.1.21
  4. 业务持续连接VIP读写,无中断、无报错

8.3 主节点恢复自动同步测试

  1. 启动主节点Redis:systemctl start redis
  2. 主节点自动增量同步备节点所有新数据
  3. VIP自动回迁主节点,恢复初始架构

8.4 机器宕机极端测试

主节点直接关机/断电,VIP秒级漂移至备节点,业务零感知,数据完全一致。

九、常用运维命令

# 查看Redis状态
systemctl status redis
# 重启Redis
systemctl restart redis

# 查看Keepalived状态
systemctl status keepalived
# 重启Keepalived
systemctl restart keepalived

# 查看VIP绑定情况
ip addr

# 查看Redis主从同步状态
redis-cli -a 123456 info replication

# 连接VIP测试
redis-cli -h 192.168.1.23 -a 123456

十、生产核心注意事项

  • 网卡适配:配置中eth0必须替换为服务器真实网卡(可通过ip addr查询),网卡错误会导致VIP漂移失效
  • 密码统一:两台Redis密码、masterauth必须完全一致,否则双向同步失败
  • 禁止直连物理节点:所有业务必须连接VIP地址,避免双写冲突、数据不一致
  • 持久化必开:AOF+RDB混合持久化生产必须开启,防止宕机数据丢失
  • 脚本权限:检测脚本必须添加执行权限,否则Keepalived无法检测服务状态
  • 虚拟路由ID一致:两台Keepalived的virtual_router_id必须相同,否则无法组建VRRP集群
  • 优先级区分:主备节点优先级必须一高一低,避免VIP抢占混乱

十一、方案优势总结

  • 架构极简稳定:双机热备无复杂集群逻辑,故障率极低,是中小型生产最优方案
  • 数据强一致:双向实时复制,故障切换、节点恢复均无数据丢失
  • 业务零感知:秒级VIP漂移,无需业务改配置、无需重启服务
  • 运维成本低:部署简单、排查方便、无需复杂监控
  • 自动自愈:故障自动切换、恢复自动追数、自动回迁