三主三从 Redis 集群搭建与重启数据保障方案

三主三从 Redis 集群搭建与重启数据保障方案

jupiter
2026-05-10 / 0 评论 / 0 阅读 / 正在检测是否收录...

一、环境规划与准备工作

1.1 节点分配

服务器 IP端口角色备注
192.168.137.26666Master 1主节点
192.168.137.26667Slave 1从节点(作为 .2 主节点的备用)
192.168.137.36666Master 2主节点
192.168.137.36667Slave 2从节点(作为 .3 主节点的备用)
192.168.137.46666Master 3主节点
192.168.137.46667Slave 3从节点(作为 .4 主节点的备用)
注意:Redis 集群的总线通信端口会自动占用 port + 10000,即 1666616667,也需要开放。

1.2 软件环境要求

  • 操作系统:CentOS 7.x
  • Redis 版本:5.0 或以上(推荐 6.2.x / 7.2.x,因为内置集群管理工具,无需额外安装 ruby)
  • 网络互通:三台服务器之间需能互相 ping 通,所有端口可互相访问

二、每台服务器统一操作步骤(共三台)

以下操作需在 192.168.137.2、192.168.137.3、192.168.137.4 三台服务器上各自执行一遍

2.1 安装 Redis(三台机器)

# 安装编译依赖
yum install -y gcc gcc-c++ make tcl

# 下载 Redis(以 7.2.5 为例,可根据需要更换版本)
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.5.tar.gz
tar -zxvf redis-7.2.5.tar.gz
cd redis-7.2.5

# 编译安装
make
make install

# 验证安装成功
redis-server --version

2.2 创建工作目录(每台机器)

在三台服务器上分别创建各自的两个实例目录:

# 创建两个实例的工作目录
mkdir -p /data/redis-cluster/{6666,6667}/data
mkdir -p /data/redis-cluster/{6666,6667}/conf
mkdir -p /data/redis-cluster/{6666,6667}/logs

# 创建集群节点配置文件目录
mkdir -p /var/run/redis-cluster

2.3 生成主节点配置文件(端口 6666)

每台服务器需先完成主节点(6666)的配置。编辑配置文件:

vi /data/redis-cluster/6666/conf/redis.conf

以下为配置文件内容(以 192.168.137.2 为例):

# 基础配置
port 6666
bind 0.0.0.0
protected-mode no
daemonize yes
pidfile /var/run/redis-cluster/redis_6666.pid
loglevel notice
logfile /data/redis-cluster/6666/logs/redis.log

# 工作目录和数据目录
dir /data/redis-cluster/6666/data

# ========== 集群配置 ==========
cluster-enabled yes
cluster-config-file /data/redis-cluster/6666/conf/nodes-6666.conf
cluster-node-timeout 5000

# ========== 数据持久化配置(重点) ==========
# 同时开启 RDB + AOF 双重持久化,最大化数据安全
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump-6666.rdb

appendonly yes
appendfilename "appendonly-6666.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 设置访问密码,客户端连接时必须提供
requirepass redispasswd

# 设置主从同步认证密码,用于从节点向主节点进行身份验证
masterauth redispasswd

关键说明

  • cluster-enabled yes 开启集群模式,使该实例能够加入集群参与分布式存储与自动故障转移。
  • appendonly yes + appendfsync everysec:每秒将写入操作追加到 AOF 文件,在性能和安全性之间取得良好平衡,最多丢失最近 1 秒的数据。
  • save 配置:启用 RDB 快照(非必须),双重持久化加持,AOF 完整则优先使用 AOF 恢复。

2.4 生成从节点配置文件(端口 6667)

编辑从节点的配置文件:

vi /data/redis-cluster/6667/conf/redis.conf

内容与 6666 类似,只需将 6666 替换为 6667

port 6667
bind 0.0.0.0
protected-mode no
daemonize yes
pidfile /var/run/redis-cluster/redis_6667.pid
loglevel notice
logfile /data/redis-cluster/6667/logs/redis.log

dir /data/redis-cluster/6667/data

cluster-enabled yes
cluster-config-file /data/redis-cluster/6667/conf/nodes-6667.conf
cluster-node-timeout 5000

# 持久化配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump-6667.rdb

appendonly yes
appendfilename "appendonly-6667.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 设置访问密码,客户端连接时必须提供
requirepass redispasswd

# 设置主从同步认证密码,用于从节点向主节点进行身份验证
masterauth redispasswd

2.5 配置防火墙(三台机器)

bash

# 开放 Redis 端口
firewall-cmd --permanent --add-port=6666/tcp
firewall-cmd --permanent --add-port=6667/tcp

# 开放集群总线端口(Redis 内部通信使用,端口号+10000)
firewall-cmd --permanent --add-port=16666/tcp
firewall-cmd --permanent --add-port=16667/tcp

# 重载防火墙
firewall-cmd --reload

# 查看已开放的端口(验证)
firewall-cmd --list-ports

如果生产环境不方便关闭 SELinux,需额外设置 SELinux 规则:

# 临时关闭 SELinux
setenforce 0

# 永久关闭(生产环境建议按需配置而非完全关闭)
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

2.6 启动 Redis 服务(每台两个实例)

先启动主节点 6666,再启动从节点 6667:

# 启动主节点
redis-server /data/redis-cluster/6666/conf/redis.conf

# 启动从节点
redis-server /data/redis-cluster/6667/conf/redis.conf

# 验证启动成功
ps aux | grep redis-server
netstat -tuln | grep -E '6666|6667'

如果出现不应有的启动问题,请检查:

  • 配置文件中的 dir 目录是否具有写入权限;
  • pidfile 目录是否存在且权限正确;
  • 端口是否被占用。

如果希望开机自启,可创建 systemd 服务文件:

# 示例:创建 /etc/systemd/system/redis-6666.service
cat > /etc/systemd/system/redis-6666.service << EOF
[Unit]
Description=Redis Server 6666
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /data/redis-cluster/6666/conf/redis.conf
ExecStop=/usr/local/bin/redis-cli -p 6666 shutdown
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target
EOF

# 启用服务
systemctl enable redis-6666
systemctl enable redis-6667

三、创建 Redis 集群(只需在一台机器执行)

三台服务器上的 6 个 Redis 实例全部启动后,在任意一台有 redis-cli 工具的机器上执行以下命令:

redis-cli  -a 'redispasswd' --cluster create \
  192.168.137.2:6666 \
  192.168.137.3:6666 \
  192.168.137.4:6666 \
  192.168.137.2:6667 \
  192.168.137.3:6667 \
  192.168.137.4:6667 \
  --cluster-replicas 1

参数说明

  • 前三个 IP:端口 会被分配为 主节点
  • 后三个 IP:端口 会自动成为对应的 从节点
  • --cluster-replicas 1 表示每个主节点配 1 个从节点

执行后,系统会输出槽位(slot)分配方案,会出现如下提示:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
...
Can I set the above configuration? (type 'yes' to accept):

输入 yes 确认即可。等待片刻,看到以下输出即表示成功:

[OK] All 16384 slots covered.

四、数据持久化配置详解(保证重启不丢数据)

4.1 双重持久化策略:AOF + RDB

本次方案同时启用 AOF(Append Only File) 持久化,以确保数据安全性。

为什么能确保重启不丢数据?

  • AOF 每秒同步一次appendfsync everysec 确保最多丢失 1 秒内的数据,这是安全性极高的配置。
  • Redis 重启时优先使用 AOF 恢复:由于 AOF 比 RDB 更完整,重启时会自动读取 AOF 文件恢复数据。
  • AOF 重写机制:当 AOF 文件增长到一定阈值时,自动重写压缩,避免文件过大影响性能。

4.2 验证持久化是否生效

# 1. 写入测试数据
redis-cli -c -h 192.168.137.2 -p 6666 -a 'redispasswd' set test_key "test_value"

# 2. 检查各节点是否生成了持久化文件
ls -la /data/redis-cluster/6666/data/    # 应看到 .rdb 和 .aof 文件
ls -la /data/redis-cluster/6667/data/

# 3. 手动触发一次 AOF 重写(可选,验证 AOF 是否正常工作)
redis-cli -p 6666 -a 'redispasswd' BGREWRITEAOF

五、重启与数据恢复验证方案

5.1 验证场景一:重启单个 Redis 实例

测试目标:重启单个实例后,数据不丢失,自动重新加入集群。

执行步骤

# 1. 先写入测试数据
redis-cli -c -h 192.168.137.2 -p 6666 -a 'redispasswd' set user:1001 "test1001"

# 2. 停止 192.168.137.2:6666 实例
redis-cli -h 192.168.137.2 -p 6666 -a 'redispasswd' shutdown

# 3. 确认节点已从集群中标记为 fail
redis-cli -h 192.168.137.3 -p 6666 -a 'redispasswd' cluster nodes | grep 192.168.137.2

# 4. 重新启动实例
redis-server /data/redis-cluster/6666/conf/redis.conf

# 5. 等待几秒后检查数据是否还在
redis-cli -c -h 192.168.137.2 -p 6666 get user:1001
# 应返回 "test1001",数据未丢失

预期结果:数据完整保留,节点自动重新加入集群。

5.2 验证场景二:模拟实例宕机(断电/强制 kill),数据恢复

# 1. 写入更多测试数据
for i in {1..100}; do
  redis-cli -c -h 192.168.137.2 -p 6666  -a 'redispasswd'  set test:key:$i "value_$i"
done

# 2. 强行杀死进程(模拟断电)
ps aux | grep "6666.*redis-server" | grep -v grep
kill -9 <PID>

# 3. 重启实例
redis-server /data/redis-cluster/6666/conf/redis.conf

# 4. 验证数据完整性
redis-cli -c -h 192.168.137.2 -p 6666  -a 'redispasswd'  keys "test:key:*" | wc -l
# 应返回 100
redis-cli -c -h 192.168.137.3 -p 6667  -a 'redispasswd'  get test:key:50

5.3 验证场景三:整机重启(模拟断电/维护)

测试目标:服务器重启后,Redis 自动恢复并重新加入集群,数据不丢失。

提前设好开机自启(以 systemd 为例):

# 确保两个实例都已配置开机自启
systemctl enable redis-6666
systemctl enable redis-6667

# 重启服务器后,等待 30 秒让所有服务完全启动
如果您已严格按照 2.6 小节创建了 redis-6666.serviceredis-6667.service 两个 systemd 服务文件,则重启后 Redis 会自动恢复。

验证逻辑:

# 1. 重启前写入测试数据
redis-cli -c -h 192.168.137.2 -p 6666 set after_reboot_test "data_before_reboot"

# 2. 记录当前集群状态
redis-cli -h 192.168.137.2 -p 6666 cluster nodes > /tmp/cluster_before.txt

# 3. 整机重启
reboot

# 4. 服务器重启后,重新登录,检查 Redis 服务
systemctl status redis-6666
systemctl status redis-6667

# 5. 检查集群状态
redis-cli -c -h 192.168.137.2 -p 6666 cluster info | grep cluster_state
# 应输出 cluster_state:ok

redis-cli -c -h 192.168.137.2 -p 6666 get after_reboot_test
# 应返回 "data_before_reboot"

# 6. 检查所有节点是否在线
redis-cli -h 192.168.137.2 -p 6666 cluster nodes | grep -E "6666|6667"

5.4 验证场景四:主节点故障自动转移(高可用)

注意:本场景用于验证集群不丢失数据(依靠从节点自动接管并加载持久化文件)。

bash

# 1. 写入大量测试数据(模拟生产数据)
for i in {1..1000}; do
  redis-cli -c -h 192.168.137.2 -p 6666 set hatest:$i "some_long_payload_for_key_$i"
done

# 2. 记下写入的数据量
redis-cli -c -h 192.168.137.2 -p 6666 dbsize

# 3. 人为“故障”:关闭 192.168.137.2:6666 主节点
redis-cli -h 192.168.137.2 -p 6666 shutdown

# 4. 集群自动故障转移,等待 15 秒左右

# 5. 查看哪个从节点被提升了
redis-cli -h 192.168.137.3 -p 6666 cluster nodes

# 6. 数据验证(连接新的主节点)
redis-cli -c -h 192.168.137.3 -p 6667 dbsize

# 7. 测试调用任意数据看是否还在
redis-cli -c -h 192.168.137.4 -p 6666 get hatest:500
关键点:由于所有节点开启了 AOF 持久化,原从节点提升为新主节点时,其本地的 AOF 文件包含了同步自原主节点的所有数据,因此不会丢失数据。

六、常用管理与监控命令

6.1 集群状态检查

# 连接集群(使用 -c 参数开启集群模式)
redis-cli -c -h 192.168.137.2 -p 6666

# 查看集群状态
cluster info

# 查看所有节点
cluster nodes

# 查看槽位分配
cluster slots

6.2 单节点管理

# 停止节点
redis-cli -h 192.168.137.2 -p 6666 shutdown

# 启动节点
redis-server /data/redis-cluster/6666/conf/redis.conf

# 查看节点日志
tail -f /data/redis-cluster/6666/logs/redis.log

6.3 数据持久化验证

# 检查 AOF 文件是否存在且非空
ls -lh /data/redis-cluster/*/data/*.aof

# 检查 RDB 文件
ls -lh /data/redis-cluster/*/data/*.rdb

# 手动触发数据同步 / 持久化操作
redis-cli -h 192.168.137.2 -p 6666 BGSAVE      # 后台 RDB
redis-cli -h 192.168.137.2 -p 6666 BGREWRITEAOF # 后台重写 AOF

七、故障排查清单

常见问题与解决方案

🔴 问题1:重启后节点未自动加入集群

原因:可能集群配置文件 nodes.conf 发生变化或网络不通。

解决方案

  1. 确保 cluster-config-file 目录有写入权限且文件未被删除;
  2. 检查节点间网络连接:telnet 192.168.137.3 6666
  3. 手动执行握手:redis-cli -h 192.168.137.3 -p 6666 CLUSTER MEET 192.168.137.2 6666

🔴 问题2:数据恢复不完整

原因:AOF 文件损坏或持久化未开启。

解决方案

  1. 检查配置文件中的 appendonly yes 是否正确设置;
  2. 若 AOF 损坏,尝试修复:redis-check-aof --fix /path/to/appendonly.aof
  3. 若 RDB 文件也不存在,需从备份恢复。

🔴 问题3:集群状态为 FAIL

原因:存活的主节点数不足集群总节点数的一半。

解决方案

  1. 检查各节点是否正常运行:ps aux | grep redis-server
  2. 检查所有节点的防火墙端口是否开放(包括总线端口 1666616667);
  3. 待足够节点恢复后,集群会自动恢复。
0

评论 (0)

打卡
取消