外观
Redis Cluster 安装
Redis Cluster 是 Redis 提供的分布式解决方案,支持自动分片和高可用。本文档将详细介绍 Redis Cluster 的安装步骤和最佳实践。
Redis Cluster 基本概念
架构设计
Redis Cluster 采用去中心化的架构,主要特点包括:
- 数据自动分片到多个节点
- 支持自动故障转移
- 无中心节点,所有节点平等
- 支持水平扩展
节点类型
Redis Cluster 中的节点分为两种类型:
- 主节点(Master):负责处理读写请求,存储数据
- 从节点(Slave):负责复制主节点的数据,提供冗余和故障转移支持
分片机制
Redis Cluster 使用哈希槽(Hash Slot)进行数据分片:
- 整个集群共有 16384 个哈希槽
- 每个键通过
CRC16(key) % 16384计算哈希槽 - 每个主节点负责一部分哈希槽
- 从节点复制主节点的所有哈希槽
故障转移
Redis Cluster 自动故障转移过程:
- 从节点定期向主节点发送 PING 命令
- 如果主节点在规定时间内没有响应,从节点标记主节点为疑似下线(PFAIL)
- 从节点向其他节点传播主节点的疑似下线状态
- 如果超过半数节点标记主节点为疑似下线,主节点被标记为下线(FAIL)
- 从节点选举产生新的主节点
- 新的主节点接管原主节点的哈希槽
- 集群恢复正常
安装前准备
系统要求
- 操作系统:Linux(推荐 CentOS 7+ 或 Ubuntu 18.04+)
- CPU:至少 2 核
- 内存:每个节点至少 2GB
- 磁盘:至少 20GB 可用空间
- 网络:所有节点之间网络互通,关闭防火墙或开放必要端口
软件依赖
- GCC:版本 4.8 及以上
- Make:版本 3.81 及以上
- tcl:版本 8.5 及以上(用于运行 Redis 测试)
- openssl:版本 1.0.2 及以上(可选,用于 SSL/TLS 支持)
节点规划
Redis Cluster 至少需要 3 个主节点,建议配置为 3 主 3 从的结构,共 6 个节点。
示例节点规划:
| 节点角色 | IP 地址 | 端口 | 数据目录 |
|---|---|---|---|
| 主节点 1 | 192.168.1.101 | 7001 | /data/redis/7001 |
| 主节点 2 | 192.168.1.102 | 7002 | /data/redis/7002 |
| 主节点 3 | 192.168.1.103 | 7003 | /data/redis/7003 |
| 从节点 1 | 192.168.1.101 | 7004 | /data/redis/7004 |
| 从节点 2 | 192.168.1.102 | 7005 | /data/redis/7005 |
| 从节点 3 | 192.168.1.103 | 7006 | /data/redis/7006 |
环境准备
- 关闭防火墙(或开放必要端口)
bash
# CentOS 7
firewall-cmd --zone=public --add-port=7001-7006/tcp --permanent
firewall-cmd --reload
# Ubuntu
iptables -A INPUT -p tcp --dport 7001:7006 -j ACCEPT
iptables-save > /etc/iptables/rules.v4- 关闭 SELinux(或配置适当的策略)
bash
# 临时关闭
setenforce 0
# 永久关闭
vi /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=disabled- 安装依赖
bash
# CentOS 7
yum install -y gcc make tcl openssl-devel
# Ubuntu
apt update
apt install -y gcc make tcl libssl-dev- 创建数据目录
bash
mkdir -p /data/redis/7001 /data/redis/7002 /data/redis/7003
mkdir -p /data/redis/7004 /data/redis/7005 /data/redis/7006
chown -R redis:redis /data/redis安装 Redis
下载 Redis
bash
# 下载 Redis 6.2.6(稳定版)
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6编译安装
bash
# 编译
make
# 安装
sudo make install PREFIX=/usr/local/redis
# 创建软链接
ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis-cli
ln -s /usr/local/redis/bin/redis-server /usr/bin/redis-server验证安装
bash
redis-server --version
redis-cli --version配置 Redis Cluster
创建配置文件
为每个节点创建配置文件,以 7001 节点为例:
bash
vi /data/redis/7001/redis.conf配置内容:
txt
# 绑定地址
bind 0.0.0.0
# 端口
port 7001
# 以守护进程方式运行
daemonize yes
# 进程 PID 文件
pidfile /var/run/redis_7001.pid
# 日志文件
logfile /data/redis/7001/redis.log
# 数据目录
dir /data/redis/7001
# 启用集群模式
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes-7001.conf
# 集群节点超时时间(毫秒)
cluster-node-timeout 15000
# 启用 AOF 持久化
appendonly yes
# AOF 文件名
appendfilename "appendonly.aof"
# AOF 重写策略
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 密码(可选,建议设置)
# requirepass your_strong_password
# masterauth your_strong_password按照同样的方式创建其他节点的配置文件,修改端口号和目录路径即可。
启动节点
bash
# 启动所有节点
redis-server /data/redis/7001/redis.conf
redis-server /data/redis/7002/redis.conf
redis-server /data/redis/7003/redis.conf
redis-server /data/redis/7004/redis.conf
redis-server /data/redis/7005/redis.conf
redis-server /data/redis/7006/redis.conf验证节点启动
bash
# 查看节点进程
ps -ef | grep redis-server
# 查看节点日志
cat /data/redis/7001/redis.log创建 Redis Cluster
使用 redis-cli 创建集群
Redis 5.0+ 提供了 --cluster 选项用于创建集群:
bash
redis-cli --cluster create \
192.168.1.101:7001 \
192.168.1.102:7002 \
192.168.1.103:7003 \
192.168.1.101:7004 \
192.168.1.102:7005 \
192.168.1.103:7006 \
--cluster-replicas 1参数说明:
--cluster create:创建集群--cluster-replicas 1:每个主节点分配 1 个从节点
确认集群创建
执行命令后,会显示集群的配置方案,输入 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.102:7005 to 192.168.1.101:7001
Adding replica 192.168.1.103:7006 to 192.168.1.102:7002
Adding replica 192.168.1.101:7004 to 192.168.1.103:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2 192.168.1.101:7001
slots:[0-5460] (5461 slots) master
M: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3 192.168.1.102:7002
slots:[5461-10922] (5462 slots) master
M: c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 192.168.1.103:7003
slots:[10923-16383] (5461 slots) master
S: d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5 192.168.1.101:7004
replicates c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
S: e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6 192.168.1.102:7005
replicates a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2
S: f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1 192.168.1.103:7006
replicates b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3
Can I set the above configuration? (type 'yes' to accept): yes验证集群创建
bash
# 连接集群
redis-cli -c -h 192.168.1.101 -p 7001
# 查看集群信息
192.168.1.101:7001> CLUSTER INFO
# 查看集群节点
192.168.1.101:7001> CLUSTER NODES集群测试
基本功能测试
bash
# 连接集群
redis-cli -c -h 192.168.1.101 -p 7001
# 设置键值对
192.168.1.101:7001> SET key1 value1
OK
# 获取键值对
192.168.1.101:7001> GET key1
"value1"
# 查看键所在的槽
192.168.1.101:7001> CLUSTER KEYSLOT key1
(integer) 9189
# 查看槽对应的节点
192.168.1.101:7001> CLUSTER SLOTS故障转移测试
- 模拟主节点故障
bash
# 查看当前主从关系
redis-cli -c -h 192.168.1.101 -p 7001 CLUSTER NODES
# 停止一个主节点
redis-cli -c -h 192.168.1.101 -p 7001 SHUTDOWN
# 查看故障转移情况
redis-cli -c -h 192.168.1.102 -p 7002 CLUSTER NODES- 恢复主节点
bash
# 启动刚才停止的主节点
redis-server /data/redis/7001/redis.conf
# 查看节点状态,此时该节点会成为从节点
redis-cli -c -h 192.168.1.102 -p 7002 CLUSTER NODES集群管理
添加节点
添加主节点
bash
# 启动新的 Redis 节点
redis-server /data/redis/7007/redis.conf
# 将新节点添加到集群
redis-cli --cluster add-node 192.168.1.101:7007 192.168.1.101:7001
# 重新分配哈希槽
redis-cli --cluster reshard 192.168.1.101:7001添加从节点
bash
# 启动新的 Redis 节点
redis-server /data/redis/7008/redis.conf
# 将新节点添加为从节点
redis-cli --cluster add-node --cluster-slave --cluster-master-id <master-node-id> 192.168.1.101:7008 192.168.1.101:7001删除节点
bash
# 删除从节点
redis-cli --cluster del-node 192.168.1.101:7001 <slave-node-id>
# 删除主节点(需要先迁移其哈希槽)
# 1. 迁移哈希槽
redis-cli --cluster reshard 192.168.1.101:7001
# 2. 删除节点
redis-cli --cluster del-node 192.168.1.101:7001 <master-node-id>查看集群状态
bash
# 查看集群信息
redis-cli -c -h 192.168.1.101 -p 7001 CLUSTER INFO
# 查看集群节点
redis-cli -c -h 192.168.1.101 -p 7001 CLUSTER NODES
# 查看集群健康状态
redis-cli --cluster check 192.168.1.101:7001常见问题(FAQ)
Q1: 创建集群时提示 "Node is not empty" 错误
A1: 这是因为节点的数据目录中已经存在数据或集群配置文件。解决方案:
bash
# 停止节点
redis-cli -c -h 192.168.1.101 -p 7001 SHUTDOWN
# 清空数据目录
rm -rf /data/redis/7001/*
# 重新启动节点
redis-server /data/redis/7001/redis.confQ2: 集群节点无法通信
A2: 检查以下几点:
- 防火墙:确保所有节点之间的端口(包括集群总线端口,通常是端口号+10000)都已开放
- 绑定地址:确保配置文件中的
bind选项设置正确,或设置为0.0.0.0 - 密码:如果设置了密码,确保所有节点的
requirepass和masterauth配置一致 - 网络连通性:使用
ping命令测试节点之间的网络连通性
Q3: 故障转移后,原主节点重新加入集群成为从节点,如何恢复为主节点?
A3: 可以使用 CLUSTER FAILOVER 命令手动触发故障转移:
bash
# 连接到原主节点(现在是从节点)
redis-cli -c -h 192.168.1.101 -p 7001
# 执行手动故障转移
192.168.1.101:7001> CLUSTER FAILOVERQ4: 如何查看集群中每个节点的内存使用情况?
A4: 使用以下命令:
bash
# 查看所有节点的内存使用情况
for port in {7001..7006}; do \
echo "Node 192.168.1.101:$port:"; \
redis-cli -c -h 192.168.1.101 -p $port INFO memory | grep used_memory_human; \
doneQ5: 集群扩容后,如何重新分配哈希槽?
A5: 使用 redis-cli --cluster reshard 命令重新分配哈希槽:
bash
redis-cli --cluster reshard 192.168.1.101:7001执行命令后,按照提示输入:
- 要迁移的哈希槽数量
- 接收哈希槽的目标节点 ID
- 输入
all表示从所有其他主节点迁移哈希槽,或输入具体的节点 ID 表示从特定节点迁移 - 输入
done完成配置
Q6: Redis Cluster 支持多少个节点?
A6: Redis Cluster 理论上支持最多 1000 个节点,但推荐的节点数量在 3-100 之间。节点数量过多会增加集群的复杂度和网络开销。
最佳实践
硬件规划:
- 主节点和从节点应部署在不同的物理机器上,避免单点故障
- 根据数据量和访问量规划节点数量和硬件配置
- 建议使用 SSD 存储,提高性能
配置优化:
- 设置合理的密码,确保集群安全
- 启用 AOF 持久化,提高数据安全性
- 调整
cluster-node-timeout参数,根据实际情况设置 - 配置适当的内存淘汰策略
监控与告警:
- 监控集群状态、节点健康、内存使用、CPU 使用率等指标
- 设置告警阈值,及时发现并处理异常情况
- 推荐使用 Prometheus + Grafana 进行监控
备份与恢复:
- 定期备份集群数据
- 测试备份的恢复流程
- 考虑使用 Redis 内置的备份命令或第三方工具
版本升级:
- 定期升级 Redis 版本,获取新功能和安全修复
- 升级前进行充分测试
- 按照官方文档的升级步骤进行操作
客户端配置:
- 使用支持 Redis Cluster 的客户端库
- 配置合理的连接池参数
- 实现重试机制,处理节点故障和连接异常
容量规划:
- 根据业务增长规划集群容量
- 预留足够的资源,避免频繁扩容
- 考虑数据分片和水平扩展
安全设置:
- 限制集群的访问 IP
- 启用 SSL/TLS 加密通信
- 定期审计集群配置和权限
