Linux下Redis6.x集群搭建与主从复制详解
基于Linux环境,通过多实例主从复制搭建Redis6 x集群,实现读写分离与自动故障转移,涵盖集群创建、节点增删、槽点迁移及投票机制,采用去中心化架构确保高可用性,并支持数据自动分片、动态扩容及负载均衡。
1、前言
在正式搭建集群之前,必须先将单机版Redis运行起来——如果这一步没有完成,后续所有操作都是徒劳。单机安装可参考《Linux服务器Redis 6.x安装、配置》,按照步骤操作即可。
2、主从复制优势
- 读写分离,提升系统扩展能力
- 故障快速恢复,增强数据可靠性
简单来说,主库负责处理写入操作,从库专门响应读请求,各司其职,从而有效分散服务器压力。

3、服务器准备
本次搭建采用一主一从的集群架构,共3组。生产环境中,建议将每组实例部署在不同物理服务器上,但为了演示方便,我们在同一台机器上运行,通过端口号加以区分。
注意: 如果使用云服务器,需在安全组和防火墙中开放两个端口段:一是Redis客户端端口(如7001-7006),二是Redis总线端口(客户端端口+10000,例如17001-17006)。两个端口缺一不可。
4、环境搭建
4.1、创建集群工作目录
mkdir /usr/local/redis/cluster -p
4.2、搭建单机环境
在cluster目录下创建redis7001文件夹,然后部署一个单机版Redis,端口设置为7001。此步骤与单机安装完全一致,不再赘述。
4.3、集群配置
先停止7001的单机实例,接着修改配置文件:
vim /usr/local/redis/cluster/redis7001/config/redis.conf
内容如下:
daemonize yes 注释 bind 127.0.0.1 protected-mode no daemonize yes cluster-enabled yes logfile "/usr/local/redis/cluster/redis7001/log/redis.log" port 7001 # 直接指定即可,无需手动创建conf文件 cluster-config-file nodes-7001.conf #集群对外暴露的IP(公网IP)及端口 cluster-announce-ip 111.xxx.xxx.175 cluster-announce-port 7001
这里有几个关键点:cluster-enabled yes必须开启;cluster-config-file会自动生成,无需提前创建;外网IP和端口请填写你自己的公网IP。
4.4、复制实例
将redis7001目录复制六份,分别对应7002到7006:
cp redis7001/ redis7002 -r ...... cp redis7001/ redis7006 -r

4.5、修改其他实例配置文件
其他实例均从7001复制而来,只需修改以下几处:
# logfile中的redis700x改为对应文件夹名,例如redis7002 logfile "/usr/local/redis/cluster/redis700x/log/redis.log" # port改为对应端口,例如7002 port 700x # cluster-config-file改为对应端口,例如nodes-7002.conf cluster-config-file nodes-700x.conf # cluster-announce-port改为对应端口 cluster-announce-port 700x
重复操作,将7002到7006全部修改完毕。
4.6、创建批量启动/关闭脚本
所有实例运行在同一台机器上,手动逐个启停十分繁琐,编写两个脚本可大幅简化操作。脚本放在/usr/local/redis/cluster目录下。
启动脚本:
vim start-all.sh
内容:
cd redis7001/bin ./redis-server ../config/redis.conf cd ../.. cd redis7002/bin ./redis-server ../config/redis.conf cd ../.. cd redis7003/bin ./redis-server ../config/redis.conf cd ../.. cd redis7004/bin ./redis-server ../config/redis.conf cd ../.. cd redis7005/bin ./redis-server ../config/redis.conf cd ../.. cd redis7006/bin ./redis-server ../config/redis.conf cd ../..
授权:
chmod u+x start-all.sh
关闭脚本:
vim shutdow-all.sh
内容:
redis7001/bin/redis-cli -p 7001 shutdown redis7001/bin/redis-cli -p 7002 shutdown redis7001/bin/redis-cli -p 7003 shutdown redis7001/bin/redis-cli -p 7004 shutdown redis7001/bin/redis-cli -p 7005 shutdown redis7001/bin/redis-cli -p 7006 shutdown
同样授权:
chmod u+x shutdow-all.sh
4.7、创建集群
1、启动所有节点
sh start-all.sh

2、创建集群连接
进入集群目录,然后执行创建命令。注意——集群至少需要三个主节点(因为投票机制要求半数以上),这里六个实例会自动分配主从关系。
cd /usr/local/redis/cluster/redis7001/bin ./redis-cli --cluster create 162.14.119.135:7001 162.14.119.135:7002 162.14.119.135:7003 162.14.119.135:7004 162.14.119.135:7005 162.14.119.135:7006 --cluster-replicas 1
参数--cluster-replicas 1表示每个主节点配备一个从节点。


3、集群连接测试
连接任意一个节点:
cd redis7001/bin ./redis-cli -h 162.14.119.135 -c -p 7001
尝试set一个键,你会发现请求自动跳转到了7002节点——说明该键的哈希槽落到了7002上。再执行get操作,也能正常取回数据,集群路由功能工作正常。

重新连接7001,然后get刚刚设置的name,Redis会自动从7002取回,用户体验与单机版完全一致。

5、整合SpringBoot
SpringBoot整合Redis单机版已广为人知,切换到集群版只需修改配置文件。以yaml为例:
spring:
redis:
cluster:
nodes:
- 162.14.119.135:7001
- 162.14.119.135:7002
- 162.14.119.135:7003
- 162.14.119.135:7004
- 162.14.119.135:7005
- 162.14.119.135:7006
#连接超时时间
timeout: 3600ms
#密码
password:
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 1
shutdown-timeout: 500ms
操作非常简单,只需将单机版配置中的host和port替换为cluster.nodes列表即可。
6、删除、新增节点
动手之前,先用redis-cli --cluster check ip:port查看集群状态,获取每个节点的ID以及主从对应关系。

6.1、删除从节点
删除命令:redis-cli --cluster del-node ip:port id
./redis-cli --cluster del-node 162.14.119.135:7006 fbb17810c3df7038baf9e9f9a83b7d4a38283c29

6.2、新增从节点
被删除的节点重新启动后不会自动加入集群——它现在是一个独立的master节点。要想让它回归,必须先执行cluster reset,然后使用add-node命令添加。这里直接用之前删除的7006演示,如果你想使用全新实例,流程完全相同。
重置节点:
# 确保7006节点已启动 ./redis-cli -h 162.14.119.135 -c -p 7006 cluster reset

加入集群:
./redis-cli --cluster add-node 162.14.119.135:7006 162.14.119.135:7002 --cluster-sla ve --cluster-master-id d882c3ab7f37613663d7f063c4d7eae5cefd7fb7
参数说明:add-node后面第一个参数是新节点,第二个是集群中任意一个现有节点;--cluster-sla ve表示新节点以从节点身份加入;--cluster-master-id指定它要挂载到哪个主节点下。如果不指定,系统会随机分配给一个主节点。

查看集群情况:
./redis-cli --cluster check 162.14.119.135:7001

6.3、删除主节点
删除主节点比从节点复杂——需要先将其负责的哈希槽迁移到其他主节点上,然后才能执行删除。以删除7003节点(ID为9f1e025a88826db82a4b6fc60a707dcbf7b2d6eb)为例。

首先进行槽点迁移:
./redis-cli --cluster reshard 162.14.119.135:7003
下面这张截图来自另一个场景,但操作步骤完全一致:

槽迁移完成后,即可删除节点:
./redis-cli --cluster del-node 162.14.119.135:7003 9f1e025a88826db82a4b6fc60a707dcbf7b2d6eb

再次执行check,可以看到7003已经消失。

6.4、新增主节点
这里使用全新实例进行演示。将redis7001复制一份为redis7007,修改配置并启动。
加入集群:
./redis-cli --cluster add-node 162.14.119.135:7007 162.14.119.135:7001
查看集群情况:
./redis-cli --cluster check 162.14.119.135:7001

分配槽点:
./redis-cli --cluster reshard 162.14.119.135:7007
截图来自其他场景,但操作流程完全一致:

分配从节点: 在分配槽点时,如果集群中已有空闲的从节点,它们会自动挂载到新的主节点下。如果没有,则参照前面6.2、新增从节点的步骤手动添加一个。
7、投票机制
每个哈希槽都拥有一个主节点和多个从节点。举例说明:六个节点中,A、B、C为主节点,A1、B1、C1为对应的从节点。如果A发生故障,集群会通过投票将A1提升为主节点,A1继承A的全部数据——相当于A的副本接替工作,集群继续正常运行。
投票过程由集群中所有主节点共同参与,如果半数以上的主节点与故障主节点通信超时,则判定该主节点已下线。因此,集群至少需要3个主节点,每个主节点至少配备一个从节点,总计至少6个Redis实例。
什么情况下整个集群不可用?
- a: 如果某个主节点宕机且没有从节点,集群直接进入fail状态。
- b: 如果超过半数的主节点宕机,无论是否有从节点,集群都会进入fail状态。
集群不可用时,所有操作均会收到(error) CLUSTERDOWN The cluster is down错误提示。
8、主节点宕机演示
- 当某个主节点宕机后,对应的从节点会自动升级为主节点。待原主节点重新启动,它会自动加入集群,并成为那个新主节点(原从节点升任)的从节点。
- 如果从节点宕机,重启后它仍会以原主节点的从节点身份重新加入集群。
宕机前
可以看到主节点7001,从节点7004:

宕机后
手动关闭7001,稍等片刻(默认15秒),7004从节点自动晋升为主节点,并继承数据。待7001重新启动,它会自动成为7004的从节点。

注意: 超时时间可通过cluster-node-timeout配置项进行调整。
宕机后恢复
重新启动7001节点,它会自动变为7004的从节点。

9、重置集群
有时需要从头开始,操作步骤非常简单:
1. 关闭集群中所有实例。
2. 删除每个实例bin目录下的aof、rdb、nodes.conf文件。
3. 重新建立集群:
./redis-cli --cluster create 162.14.119.135:7001 162.14.119.135:7002 162.14.119.135:7003 162.14.119.135:7004 162.14.119.135:7005 162.14.119.135:7006 --cluster-replicas 1 # 查看集群情况 ./redis-cli --cluster check 162.14.119.135:7001
10、集群原理
Redis集群的核心机制是数据自动分片——将数据分散到不同的主节点上,然后主节点同步至从节点,从而实现高可用。
整个集群共有16384个哈希槽,每个键通过hash算法计算出所属槽位,然后存储到对应的主节点上。集群中的每个节点负责一部分槽位。以三个主节点为例:
- 节点A负责0号至5460号插槽。
- 节点B负责5461号至10922号插槽。
- 节点C负责10923号至16383号插槽。
当增删节点时,实际就是重新分配这些槽位,同时数据也会随之迁移。
总结
以上便是Redis 6.x集群从搭建到运维的完整实践指南。主从复制、故障转移、节点管理、集群原理等关键知识点均已覆盖,希望能够帮助你快速上手。如有疑问,欢迎交流探讨。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Redis是什么:核心特性、架构与应用场景解析
Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。
Windows 安装 MongoDB 完整图文教程
本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。
Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。
MacOS安装MongoDB完整教程
本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。
Ubuntu系统安装与配置Redis完整指南
本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。
- 热门数据榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-09-01 06:20
2026-09-01 06:20
2026-09-01 06:20
2026-09-01 06:19
2026-09-01 06:19
2026-09-01 06:19
2026-09-01 06:18
2026-09-01 06:18
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

