搭建Redis群集模式
Redis 集群模式搭建全攻略:从环境准备到故障处理
在高并发、大数据量的业务场景中,单节点 Redis 面临存储容量有限、性能瓶颈明显、无高可用保障等问题。Redis 集群(Redis Cluster)通过分片存储(将数据分散到多个节点)和自动故障转移(主节点故障时从节点自动升级为主),完美解决了这些痛点,成为生产环境的首选方案。本文将带大家从零开始,一步步完成 Redis 集群的搭建与验证,同时分享关键运维技巧。
一、集群核心原理快速理解
在动手搭建前,先明确 Redis 集群的两个核心概念,避免后续配置时 “知其然不知其所以然”:
- 分片机制:Redis 集群将所有数据划分为 16384 个哈希槽(Hash Slot),每个主节点负责一部分槽位(例如 3 个主节点时,可能分别负责 0-5460、5461-10922、10923-16383 槽)。客户端访问时,会根据CRC16(key) % 16384计算键对应的槽位,再路由到对应主节点。
- 主从复制与故障转移:为保证高可用,每个主节点至少配置 1 个从节点。当主节点宕机时,集群会通过投票机制从其从节点中选举新主节点,自动完成故障转移,整个过程无需人工干预。
本次搭建目标:3 主 3 从 Redis 集群(生产环境推荐最少 3 主,避免单点风险)。
二、环境准备
2.1 服务器配置
本次使用 6 台 CentOS 7 虚拟机(也可在单台机器上通过不同端口模拟多节点,生产环境建议独立服务器),配置如下:
节点角色 | IP 地址 | 端口 | 作用 |
主节点 1 | 192.168.1.10 | 6379 | 负责部分哈希槽,存储数据 |
从节点 1 | 192.168.1.11 | 6379 | 同步主节点 1 数据,备用 |
主节点 2 | 192.168.1.12 | 6379 | 负责部分哈希槽,存储数据 |
从节点 2 | 192.168.1.13 | 6379 | 同步主节点 2 数据,备用 |
主节点 3 | 192.168.1.14 | 6379 | 负责部分哈希槽,存储数据 |
从节点 3 | 192.168.1.15 | 6379 | 同步主节点 3 数据,备用 |
2.2 依赖安装
所有节点需先安装 Redis 编译依赖(GCC):
# 安装GCC(CentOS系统)
yum install -y gcc-c++
# 验证GCC版本(需4.8及以上)
gcc --version
2.3 关闭防火墙与 SELINUX
为避免端口被拦截,临时关闭防火墙(生产环境建议按需开放 6379 端口,而非直接关闭):
# 关闭防火墙
systemctl stop firewalld
# 禁止防火墙开机启动
systemctl disable firewalld
# 关闭SELINUX
setenforce 0
# 永久关闭SELINUX(需重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
三、Redis 安装与节点配置
3.1 下载并编译 Redis
所有节点执行以下步骤,安装 Redis 6.2.6(稳定版,兼容性好):
# 1. 下载Redis源码包
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
# 2. 解压源码包
tar -zxvf redis-6.2.6.tar.gz -C /usr/local/
# 3. 进入编译目录
cd /usr/local/redis-6.2.6/
# 4. 编译(PREFIX指定安装路径)
make PREFIX=/usr/local/redis install
# 5. 复制配置文件模板到安装目录
cp redis.conf /usr/local/redis/
3.2 集群节点核心配置
每个节点需修改/usr/local/redis/redis.conf,关键配置项如下(所有节点均需配置,无需区分主从,集群会自动分配主从角色):
# 1. 绑定IP(0.0.0.0允许所有机器访问,生产环境建议指定具体IP)
bind 0.0.0.0
# 2. 关闭保护模式(允许跨机器访问)
protected-mode no
# 3. 端口号(默认6379,若单台机器模拟多节点需修改)
port 6379
# 4. 开启后台运行
daemonize yes
# 5. 启用集群模式(核心配置)
cluster-enabled yes
# 6. 集群节点配置文件(自动生成,无需手动编辑)
cluster-config-file nodes.conf
# 7. 集群节点超时时间(毫秒,超时未响应则认为节点宕机)
cluster-node-timeout 15000
# 8. 数据持久化方式(AOF+RDB混合模式,推荐生产环境使用)
appendonly yes
appendfilename "appendonly.aof"
save 900 1
save 300 10
save 60 10000
# 9. 设置密码(所有节点密码必须一致,否则集群通信失败)
requirepass 123456
# 10. 集群节点间通信密码(与requirepass保持一致)
masterauth 123456
3.3 启动所有 Redis 节点
所有节点执行启动命令,验证进程是否正常运行:
# 启动Redis(指定配置文件)
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
# 验证进程(出现redis-server即为成功)
ps -ef | grep redis
# 验证端口(6379端口监听即为成功)
netstat -tulnp | grep 6379
四、创建 Redis 集群
Redis 5.0 + 版本内置redis-cli集群命令,无需额外安装 ruby 环境,操作更简单。
4.1 执行集群创建命令
在任意一个节点(例如主节点 1:192.168.1.10)执行以下命令,将 6 个节点组成集群:
/usr/local/redis/bin/redis-cli -a 123456 --cluster create \
192.168.1.10:6379 \
192.168.1.12:6379 \
192.168.1.14:6379 \
192.168.1.11:6379 \
192.168.1.13:6379 \
192.168.1.15:6379 \
--cluster-replicas 1
命令参数说明:
- -a 123456:指定 Redis 密码(与requirepass一致);
- --cluster create:表示创建集群;
- 前 3 个 IP: 端口:默认作为主节点;
- 后 3 个 IP: 端口:默认作为从节点(对应前 3 个主节点);
- --cluster-replicas 1:表示每个主节点分配 1 个从节点。
4.2 确认集群创建
执行命令后,Redis 会自动分配哈希槽并提示确认,输入yes即可:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0-5460
Master[1] -> Slots 5461-10922
Master[2] -> Slots 10923-16383
Adding replica 192.168.1.11:6379 to 192.168.1.10:6379
Adding replica 192.168.1.13:6379 to 192.168.1.12:6379
Adding replica 192.168.1.15:6379 to 192.168.1.14:6379
>>> Trying to optimize slaves allocation for anti-affinity
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
看到[OK] All 16384 slots covered.表示集群创建成功,所有哈希槽已分配完成。
五、集群验证与功能测试
5.1 查看集群状态
在任意节点执行以下命令,连接集群并查看状态:
# 连接集群(-c表示集群模式,否则无法路由到对应节点)
/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.10 -p 6379
# 查看集群信息(重点关注cluster_state:ok,表示集群正常)
192.168.1.10:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
...
# 查看所有节点信息(可看到主从角色、槽位分配)
192.168.1.10:6379> cluster nodes
# 输出示例(末尾带"master"为从节点,带"slave"为从节点,且标注了对应主节点ID)
abc123... 192.168.1.10:6379@16379 master - 0 1695000000000 1 connected 0-5460
def456... 192.168.1.11:6379@16379 slave abc123... 0 1695000001000 2 connected
...
5.2 数据读写测试
集群模式下,客户端会自动根据键的哈希槽路由到对应主节点,测试如下:
# 1. 写入数据(会自动路由到负责对应槽位的主节点)
192.168.1.10:6379> set user:1 zhangsan
-> Redirected to slot [14598] located at 192.168.1.14:6379
OK
# 2. 读取数据(同样会自动路由)
192.168.1.14:6379> get user:1
"zhangsan"
# 3. 查看数据所在槽位
192.168.1.14:6379> cluster keyslot user:1
(integer) 14598
5.3 故障转移测试
模拟主节点宕机,验证从节点是否自动升级为主:
- 停止主节点 1(192.168.1.10):
/usr/local/redis/bin/redis-cli -a 123456 shutdown
- 查看集群节点状态:
192.168.1.14:6379> cluster nodes
# 输出会显示192.168.1.11:6379(原从节点1)变为master,负责0-5460槽位
def456... 192.168.1.11:6379@16379 master - 0 1695000100000 7 connected 0-5460
abc123... 192.168.1.10:6379@16379 master,fail - 1695000090000 1695000088000 1 disconnected
- 验证数据可用性:
# 写入原主节点1负责的槽位数据(会路由到新主节点192.168.1.11)
192.168.1.14:6379> set user:2 lisi
-> Redirected to slot [7412] located at 192.168.1.11:6379
OK
192.168.1.11:6379> get user:2
"lisi"
故障转移成功后,集群仍能正常提供服务,数据无丢失。
六、生产环境运维建议
- 节点扩容 / 缩容:
-
- 扩容:新增主从节点后,执行redis-cli --cluster add-node添加节点,再通过--cluster reshard重新分配槽位;
-
- 缩容:先通过--cluster reshard将待删除主节点的槽位迁移到其他主节点,再执行--cluster del-node删除节点。
- 数据备份:
-
- 开启 AOF+RDB 混合持久化,确保数据不丢失;
-
- 定期备份appendonly.aof和dump.rdb文件,建议存储到异地服务器。
- 监控告警:
-
- 使用 Redis 自带的info命令或第三方工具(如 Prometheus+Grafana)监控集群状态;
-
- 配置告警规则:当cluster_state变为fail、节点宕机、槽位未覆盖时,及时发送告警。
- 密码与安全:
-
- 生产环境禁止使用bind 0.0.0.0,需指定允许访问的 IP;
-
- 密码建议复杂度高(字母 + 数字 + 特殊符号),定期更换;
-
- 开启 Redis 的rename-command功能,禁用CONFIG、FLUSHDB等危险命令。
七、常见问题排查
- 集群创建失败:Could not connect to Redis at xxx:6379: Connection refused
-
- 检查防火墙是否关闭或端口是否开放;
-
- 确认 Redis 配置中protected-mode为no,bind地址正确。
- 集群状态为 fail:cluster_state:fail
-
- 查看是否有主节点宕机且无可用从节点;
-
- 检查节点间密码是否一致(requirepass和masterauth必须相同)。