一、准备工作
-
安装依赖和 Redis 源码
集群模式和单机模式类似,先安装编译环境和 Redis:sudo apt-get update sudo apt-get install build-essential wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar -zxvf redis-7.2.4.tar.gz cd redis-7.2.4 make make install -
安装 Ruby(用于 redis-trib.rb 工具,Redis 5.x 以后推荐用 redis-cli)
sudo apt-get install ruby sudo gem install redis
二、准备多个 Redis 实例
-
创建多个实例目录
以 6 节点为例(3主3从),每个节点一个目录:mkdir -p ~/redis-cluster/{7000,7001,7002,7003,7004,7005} -
复制配置文件到各实例目录
for port in {7000..7005}; do cp redis-7.2.4/redis.conf ~/redis-cluster/$port/ done -
修改每个配置文件
主要修改如下参数(以7000为例):port 7000 cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000 appendonly yes daemonize yes bind 0.0.0.0- 端口号每个实例不同(7000~7005)
cluster-enabled yes开启集群cluster-config-file节点配置文件appendonly yes开启持久化daemonize yes后台运行
三、启动所有 Redis 实例
for port in {7000..7005}; do
redis-server ~/redis-cluster/$port/redis.conf
done
四、创建集群
方式一:使用 redis-cli(推荐)
redis-cli --cluster create \
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
--cluster-replicas 1表示每个主节点有一个从节点
方式二:使用 redis-trib.rb(旧版)
ruby redis-trib.rb create --replicas 1 \
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
五、验证集群状态
-
连接集群节点
redis-cli -c -p 7000 -
查看集群状态
cluster info cluster nodes
六、常见部署建议
- 生产环境建议每个节点单独服务器或虚拟机,端口可自定义
- 建议配置密码(requirepass、masterauth)和防火墙安全策略
- 节点数建议至少3主3从,保证高可用
- 集群节点间网络需互通
七、集群管理常用命令
- 查看槽分布
redis-cli -c -p 7000 cluster slots - 手动分配槽(如有需要)
redis-cli -c -p 7000 cluster addslots {0..5460} - 添加/删除节点、迁移槽等请参考官方文档
八、常见问题排查
- 节点无法加入集群:检查端口防火墙、bind地址、cluster-enabled配置
- 集群不健康:使用
cluster info查看状态,排查主从同步、网络 - 客户端连接报 MOVED/ASK 错误:需使用支持集群的客户端(如
redis-cli -c)
九、集群运维管理
1. 集群节点管理
添加节点:
假设你要新增一个节点(如7006),步骤如下:
- 新建配置和目录,启动新节点(参考前面步骤)。
- 加入集群:
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000第一个参数是新节点,第二个是集群中的任意节点。
删除节点:
- 查看节点ID:
redis-cli -c -p 7000 cluster nodes - 删除节点(如节点ID为
abcdef123456):redis-cli --cluster del-node 127.0.0.1:7000 abcdef123456
2. 集群扩容与缩容
扩容:
- 新增节点并启动;
- 使用
add-node命令加入集群; - 重新分配槽,将部分槽迁移到新节点:
redis-cli --cluster reshard 127.0.0.1:7000按提示选择要迁移的槽数、目标节点等。
缩容:
- 将节点上的槽迁移到其他节点;
- 使用
del-node命令移除节点。
3. 故障处理与主从切换
- 集群模式下,主节点故障后,集群会自动提升从节点为主节点,实现高可用。
- 可通过
cluster failover命令手动触发主从切换。
十、安全加固
1. 配置访问密码
在每个实例的 redis.conf 中添加:
requirepass yourpassword
masterauth yourpassword
2. 关闭危险命令
可通过 rename-command 禁用或重命名部分高危命令:
rename-command FLUSHALL ""
rename-command FLUSHDB ""
3. 网络安全
- 只监听内网地址(
bind参数)。 - 配置防火墙,仅允许可信IP访问集群端口(7000~7005等)。
- 禁止公网直接访问。
十一、集群常见问题排查
1. 节点间无法通信
- 检查防火墙和安全组端口(默认 7000~7005 及端口+10000用于集群总线通信)。
- 检查
bind地址和网络配置。
2. 集群状态不健康
- 使用
cluster info查看状态。 - 检查主从节点同步情况。
- 检查是否有节点下线或丢失槽。
3. 客户端连接报错
- 报
MOVED或ASK错误,需使用支持集群的客户端(如redis-cli -c,或者使用 JedisCluster、LettuceCluster 等)。
4. 数据分片不均衡
- 可通过
reshard命令重新分配槽。
十二、集群持久化与备份
- 推荐开启
appendonly yes(AOF日志),保障数据安全。 - 可以定期备份各节点的数据文件(如 dump.rdb、appendonly.aof)。
十三、集群升级与迁移
- 升级前建议先备份数据。
- 按官方文档逐节点升级,避免集群不可用。
- 集群迁移可通过 reshard 工具迁移槽和数据。
十四、Redis 集群原理简介
1. 数据分片(Slot机制)
- Redis 集群将所有数据分为 16384 个槽(slot)。
- 每个主节点负责一部分槽,客户端根据 key 的哈希值映射到相应的槽,然后定位到对应的主节点。
- 当集群扩容/缩容时,通过槽迁移实现数据迁移。
2. 节点角色
- 主节点(Master):负责读写和分片。
- 从节点(Slave):负责备份主节点,实现高可用。
3. 集群总线
- 节点间通过集群总线(端口号+10000)进行通信,维护分布式状态和故障检测。
十五、主从故障自动切换(Failover)
- 集群模式下,每个主节点建议配置至少一个从节点。
- 当主节点不可用时,集群会自动选举一个从节点升级为主节点,保证分片的高可用。
- 故障检测和自动切换由集群协议完成,无需人工干预。
十六、扩容/缩容实操示例
1. 扩容(增加主节点)
假设原有集群有3主3从,新增1主1从:
步骤:
- 新建两个节点目录(如7006、7007),配置端口、cluster-enabled等参数。
- 启动新节点:
redis-server ~/redis-cluster/7006/redis.conf redis-server ~/redis-cluster/7007/redis.conf - 将新主节点加入集群:
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 - 将新从节点设置为新主节点的从节点:
- 查新主节点ID:
redis-cli -c -p 7006 cluster nodes - 设置主从关系:
redis-cli -c -p 7007 cluster replicate <7006主节点ID>
- 查新主节点ID:
- 重新分配槽(迁移部分槽到新主节点):
redis-cli --cluster reshard 127.0.0.1:7000按提示选择迁移槽数和目标节点。
2. 缩容(删除主节点)
步骤:
- 将要删除节点的槽迁移到其他主节点(
reshard命令)。 - 删除节点:
redis-cli --cluster del-node 127.0.0.1:7000 <要删除的节点ID> - 停止并清理该节点服务。
十七、客户端连接方式
1. 使用 redis-cli
- 集群模式需加
-c参数:redis-cli -c -p 7000
2. Java 客户端
-
推荐使用 JedisCluster 或 LettuceCluster。
-
示例(Jedis):
Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("127.0.0.1", 7000)); nodes.add(new HostAndPort("127.0.0.1", 7001)); // ...添加全部主节点 JedisCluster cluster = new JedisCluster(nodes, password); cluster.set("key", "value");
3. Python 客户端
-
使用 redis-py-cluster:
from rediscluster import RedisCluster startup_nodes = [{"host": "127.0.0.1", "port": "7000"}] rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True, password="yourpassword") rc.set("key", "value")
4. 其他语言
- 参考各自语言的 Redis 集群客户端,如 Node.js 的 ioredis、Go 的 go-redis。
十八、常见集群维护脚本
- 官方 redis-cli 支持大部分集群管理操作。
- 可用 shell 脚本批量启动/停止节点。
- 可用
redis-cli --cluster命令批量迁移槽、添加/删除节点等。
十九、更多参考与建议
- 官方推荐至少3主3从,保证高可用和分片均衡。
- 生产环境建议不同节点部署在不同物理/虚拟机上,防止单点故障。
- 定期备份各节点数据,监控集群健康状态。
- 详细参数和故障处理请查阅 Redis Cluster 官方文档。
二十、Redis 集群高可用保障
1. 多主多从架构
- 最少建议 3主3从,每个主节点有至少一个从节点。
- 主节点负责分片数据,从节点实时同步主节点数据,主节点故障时自动提升从节点为主节点。
2. 自动故障转移
- Redis 集群协议会自动检测主节点失效(通过投票机制),并自动提升从节点。
- 故障转移无需人工干预,保证服务连续性。
3. 数据一致性
- 集群模式下,写操作只保证主节点数据一致性,从节点异步同步。
- 可通过客户端实现“读写分离”,即读从节点、写主节点。
二十一、监控与运维
1. 监控指标
- 集群状态:
cluster info、cluster nodes - 主从同步延迟、丢失槽数、节点下线数
- 内存使用率、慢查询、连接数等
2. 监控工具
- 推荐使用 Prometheus + Grafana,结合 redis_exporter。
- 也可使用开源监控系统如 Zabbix、Datadog 等。
3. 告警设置
- 关键指标(如节点下线、主从切换、内存超限)需设置告警,及时通知运维人员。
二十二、集群扩展最佳实践
1. 扩容建议
- 新增节点时,务必均衡分配槽,避免数据倾斜。
- 每次扩容建议只迁移部分槽,避免影响性能。
2. 缩容建议
- 迁移槽后再删除节点,确保数据完整性。
- 删除节点前,建议先将其所有槽迁移到其他节点。
3. 动态扩展
- Redis 集群支持在线扩容和缩容,业务无感知,适合高并发场景。
二十三、常见场景说明
1. 跨机房部署
- 集群节点建议部署在同一机房或同一内网,避免网络延迟影响主从同步和故障检测。
- 跨机房部署需关注网络可靠性和延迟。
2. 灾备方案
- 可定期备份 RDB/AOF 文件到异地,或使用第三方同步工具实现异地灾备。
3. 读写分离
- 业务层可将读请求路由到从节点,减轻主节点压力。
- 需注意读从节点可能存在数据延迟。
二十四、生产环境注意事项
1. 配置优化
- 关闭危险命令(如 FLUSHALL、FLUSHDB)。
- 设置密码和防火墙,禁止公网访问。
- 合理配置 maxmemory、maxclients 等参数。
2. 资源规划
- 内存需比数据量多预留30%以上,防止 OOM。
- 集群节点建议单独物理机或高性能虚拟机。
3. 灾难恢复
- 定期备份,测试恢复流程。
- 建议预案主节点全部故障或集群分裂场景。
4. 版本管理
- 生产环境建议使用稳定版,及时关注安全补丁和升级通知。
二十五、常见问题与解决方案
| 问题 | 解决方法 |
|---|---|
| 节点频繁下线 | 检查网络延迟、端口防火墙、机器性能 |
| 槽分布不均 | 使用 reshard 命令重新分配槽 |
| 主从同步延迟大 | 检查带宽、磁盘IO、主节点压力 |
| 客户端报 MOVED/ASK | 使用支持集群的客户端,或升级驱动版本 |
| 数据丢失 | 检查持久化设置,定期备份,避免单节点无从节点 |
二十六、实用脚本示例
1. 批量启动/停止所有节点
for port in {7000..7005}; do
redis-server ~/redis-cluster/$port/redis.conf
done
for port in {7000..7005}; do
redis-cli -p $port shutdown
done
2. 查看所有节点状态
for port in {7000..7005}; do
echo "Node $port:"
redis-cli -c -p $port cluster info
done
1004

被折叠的 条评论
为什么被折叠?



