游乐游手机版
首页/数据库/文章详情

Redis Cluster部署实践

时间:2026-04-29 22:37
一、我们要做什么? 今天的目标很明确:在一台服务器(IP地址是192 168 166 9)上,手动搭建一个3主3从的Redis集群。这意味着我们需要启动6个Redis实例: 3个主节点(Master):端口号分别是6379、6381、6383。 3个从节点(Sla ve):端口号分别是6380、63

一、我们要做什么?

今天的目标很明确:在一台服务器(IP地址是192.168.166.9)上,手动搭建一个3主3从的Redis集群。这意味着我们需要启动6个Redis实例

  • 3个主节点(Master):端口号分别是6379、6381、6383。
  • 3个从节点(Sla ve):端口号分别是6380、6382、6384。

听起来有点复杂?别担心,跟着步骤走,其实就像搭积木一样清晰。

二、准备工作(傻瓜式操作)

1. 先搞一个模板配置文件

万事开头难,但第一步很简单。我们以系统默认的Redis配置文件为基础,创建一个模板:

  • /etc/redis.conf复制一份,命名为/etc/redis/6379.conf
  • 这个文件已经包含了端口、日志路径、数据目录等基础参数,是我们后续批量操作的基础。

2. 一键生成6个配置文件

有了模板,剩下的就是复制粘贴。一条命令就能搞定:

for i in {6380..6384}; do cp 6379.conf $i.conf; done

看,是不是瞬间就生成了从6380到6384的5个配置文件,加上原来的6379,正好6个。

3. 批量改配置(用循环搞定)

每个实例的配置不能完全一样,尤其是端口和文件路径。我们可以用一个简单的循环,批量修改每个配置文件中的关键项。下面这张表清晰地列出了需要修改的地方:

配置项 改成什么
端口 6379 → 6380、6381…
数据目录 /var/lib/redis/6379 → 各自端口
日志文件 /var/log/redis/6379.log → 各自端口
PID 文件 /var/run/redis/6379.pid → 各自端口
保护模式 yes → no
后台运行 no → yes
监听地址 127.0.0.1 → 192.168.166.9

这里有几个关键点:关闭保护模式绑定真实IP是为了让节点间能够互相通信,这是集群组建的前提。

4. 加上集群配置(每个配置文件末尾追加)

要让Redis实例以集群模式运行,还需要在每个配置文件的末尾加上这三行核心配置:

cluster-enabled yes
cluster-config-file nodes-端口.conf
cluster-node-timeout 15000

这三行的作用分别是:开启集群模式、指定集群节点配置的存储文件、设置节点间心跳超时时间为15秒。超时后,集群会认为该节点可能故障了。

三、启动所有实例

配置妥当,是时候让它们跑起来了。同样,一条命令启动所有6个实例:

for i in {6379..6384}; do redis-server /etc/redis/$i.conf; done

检查一下进程,如果能看到6个`redis-server`在运行,那么恭喜,第一步的“单兵作战”已经完成。

四、组成集群(手动搓)

现在我们有6个独立的Redis服务,但它们彼此还不认识。接下来,我们要把它们组织成一个真正的集群。

1. 让所有节点互相认识

我们需要让其中一个节点作为“介绍人”,去认识其他所有节点。这里选择6379端口这个实例:

for i in {6380..6384}; do redis-cli -h 192.168.166.9 -p 6379 cluster meet 192.168.166.9 $i; done

执行完这条命令,这6个节点就建立起了联系,知道了彼此的存在。但此时,它们还不知道各自在集群里该干什么。

2. 分配槽位(16384个槽,平均分给3个Master)

这是Redis Cluster的核心设计。整个集群有16384个哈希槽(slot),所有数据都通过key的CRC16校验和对16384取模,映射到某个槽上。现在,我们需要把这16384个“货架”平均分配给3个主节点来管理。

节点 槽位范围 槽数量
6379 0 ~ 5461 5462
6381 5462 ~ 10922 5461
6383 10923 ~ 16383 5461

分配命令如下:

redis-cli -h 192.168.166.9 -p 6379 cluster addslots {0..5461}
redis-cli -h 192.168.166.9 -p 6381 cluster addslots {5462..10922}
redis-cli -h 192.168.166.9 -p 6383 cluster addslots {10923..16383}

切记:必须分配完所有16384个槽,集群才能进入可用状态。

3. 建立主从关系(谁是谁的备胎)

光有主节点还不够,我们需要为每个主节点配一个从节点,以实现高可用。首先,需要获取每个主节点的唯一ID:

redis-cli -h 192.168.166.9 -p 6379 cluster nodes

在输出的信息中找到端口为6379、6381、6383的节点,记下它们长长的ID。然后,执行复制命令:

# 让6380成为6379的从节点
redis-cli -h 192.168.166.9 -p 6380 cluster replicate <6379的ID>
# 让6382成为6381的从节点
redis-cli -h 192.168.166.9 -p 6382 cluster replicate <6381的ID>
# 让6384成为6383的从节点
redis-cli -h 192.168.166.9 -p 6384 cluster replicate <6383的ID>

至此,一个3主3从的Redis集群就手动搭建完成了。

五、验证集群

搭建完了,怎么知道成不成功?用这两个命令检查一下:

redis-cli -h 192.168.166.9 -p 6379 cluster nodes
redis-cli -h 192.168.166.9 -p 6379 cluster info

第一条命令会列出所有节点的详细信息,包括角色(master/sla ve)、状态和负责的槽位范围。第二条命令则展示集群的整体状态,确保`cluster_state`是`ok`。如果一切正常,那么你的集群就已经在健康运行了。

六、故障恢复(自动的)

Redis Cluster最大的魅力之一就是自动故障转移。我们来模拟一下:

模拟故障

kill -9 <某个master的进程ID>

自动发生的事

  • 集群会检测到该主节点失联。
  • 经过选举,该主节点对应的从节点会自动晋升为新的主节点。
  • 集群继续对外提供服务,整个过程对客户端几乎透明。

恢复后

  • 当那个宕机的主节点重新启动后,它会发现自己原来的“位置”已经被从节点接替了。
  • 于是,它会自动以从节点(Sla ve)的身份重新加入集群,成为新主节点的副本。
  • 整个过程无需人工干预,非常智能。

七、常用命令速查表(大白话版)

为了方便后续管理和排查,这里整理了一份集群常用命令指南:

命令 大白话解释
cluster meet IP 端口 把某个节点拉进群
cluster nodes 看看群里都有谁,谁是什么角色
cluster addslots 槽位 把一批槽分给当前节点
cluster replicate 节点ID 让当前节点给指定节点当备胎
cluster info 看看集群整体状态好不好
cluster failover 手动让备胎上位(强制切换)
cluster keyslot key 看这个 key 属于哪个槽
cluster forget 节点ID 把某个节点踢出群

八、核心注意点(避坑指南)

手动搭建集群虽然灵活,但细节决定成败。下面这些坑,前人已经踩过了:

解决办法
启动 Redis 不用绝对路径 必须用绝对路径,否则 nodes.conf 会乱
保护模式没关 必须设置 protected-mode no
监听 127.0.0.1 改成真实 IP,否则其他节点连不上
槽位没分完 16384 个槽必须全部分配,集群才能用
主节点没有从节点 每个 Master 最好配一个 Sla ve,否则挂了就丢数据

九、总结一句话

手动搭建Redis Cluster的流程可以高度概括为:准备6份配置 → 启动所有实例 → 节点互相发现 → 分配哈希槽 → 建立主从关系。最终,你得到的是一个具备数据分片自动故障转移能力的高可用3主3从集群。

这个过程虽然比用`redis-cli --cluster create`一键创建要繁琐,但对于理解Redis Cluster的底层机制非常有帮助。希望这份手把手的指南能为你提供清晰的参考。

您可能感兴趣的文章:
  • docker实现redis-cluster模式集群部署的示例代码
  • Docker-compose部署redis-cluster集群的完整步骤
  • 基于Redis6.2.6版本部署Redis Cluster集群的问题
  • k8s部署redis cluster集群的实现
  • 使用Ruby脚本部署Redis Cluster集群步骤讲解
  • 如何用docker部署redis cluster的方法
来源:https://www.jb51.net/database/362229k8p.htm
上一篇如何执行PL/SQL动态SQL_EXECUTE IMMEDIATE语法与绑定变量 下一篇mysql如何实现基于角色的访问控制RBAC_MySQL 8.0角色激活与默认配置
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须