【Redis入门篇|第五篇】Redis集群基本概念

发布时间:2026/10/12 3:55:16
【Redis入门篇|第五篇】Redis集群基本概念
1. 什么是集群在正式介绍 Redis 的集群模式之前有必要先弄清楚「集群」这个概念本身。集群Cluster是指将多台服务器组合在一起作为一个整体对外提供服务的一种架构方式。这在我们的软件开发中非常常见首先这是为了安全考虑我举一个例子当服务器宕机之后如果只有一台服务器的话那么整个服务也就停掉了那么此时如果你正在玩游戏玩的正起劲的时候突然告诉你停服了那么此时就很恼火了再比如玩的时候这个游戏一卡一卡的肯定会影响用户的体验这就需要我们使用集群的方式来让这个项目实现高可用了解决一些突发的问题。集群的核心价值主要体现在三个方面高可用当集群中的某台服务器出现故障时其他服务器可以接管它的工作保证服务不中断。高性能通过将请求分散到多台服务器上并行处理集群可以支撑远超单机的吞吐量。高扩展当业务增长、单机容量不足时可以通过向集群中添加新机器来水平扩展而不需要更换更昂贵的硬件。根据分工方式的不同集群又可以细分为几种常见类型负载均衡集群多台服务器同时处理请求通过负载均衡器把流量分发到各节点提升整体处理能力。这样做的好处就是防止压力过爆举个例子演唱会门票如果大麦的服务器只有一个那么那一天周杰伦的演唱会门票开卖的话几百万人在一秒内对一台服务器进行访问这个服务器肯定承受不了这么大的压力如果此时有十台服务器的话这样每个服务器就只需要承受几十万的压力这样一来这个服务就没那么容易被挤爆了高可用集群一台主服务器对外服务备用服务器实时同步数据主节点故障时自动切换保证服务连续性。这个的好处就是为了留一个备选方案只有一个服务器的话出了问题我们没法寻找其他人的帮助但如果有两个及以上的话就可以在第一台服务器宕机的时候顶上去维持这个服务同时我们的数据也完美的保存了下来。分布式存储集群数据被拆分到多个节点上存储每个节点只保存一部分数据共同组成完整的数据集。这个在我们的大项目里面用到的非常多庞大的数据如果都存到一个节点的话那么安全系数会非常低我们利用多个节点存储的话即使一个节点坏了我们的损失也是微小的不至于毁灭我们整个项目。理解了集群的基本概念后再来看 Redis 的集群模式就会清晰很多。Redis 的集群方案正是综合运用了上述思想来解决单机 Redis 在容量、性能和可用性上的瓶颈。从而实现最终的高可用。2. Redis 集群概述Redis 集群Redis Cluster是 Redis 官方提供的分布式解决方案它通过将数据自动分片Sharding到多个节点上实现了数据的水平扩展和高可用。在 Redis 集群中每个节点都保存一部分数据所有节点的数据合起来才是完整的数据集。Redis 集群主要解决了单机 Redis 的三大痛点容量瓶颈单台 Redis 服务器的内存容量有限当数据量超过单机内存时就需要集群来扩展存储能力。性能瓶颈单机 Redis 的读写性能受限于 CPU 和网络集群可以将请求分散到多个节点提升整体吞吐量。可用性风险单机 Redis 一旦宕机整个服务就会不可用集群通过主从复制和故障转移机制保证了高可用。Redis 集群的核心特性可以概括为以下几点数据分片集群将数据自动分散到多个节点每个节点只负责一部分数据实现存储的横向扩展。高可用每个主节点都配有从节点主节点故障时从节点会自动提升为新的主节点保证服务不中断。去中心化集群中的每个节点都保存了完整的集群状态信息任意节点都可以接收客户端的请求并转发给正确的节点。在线扩展集群支持在运行过程中动态添加或移除节点数据会自动重新分片无需停机。3. Redis 集群的数据分片原理Redis 集群采用哈希槽Hash Slot机制来实现数据分片。整个集群被划分为 16384 个哈希槽每个键通过 CRC16 算法计算出一个哈希值再对 16384 取模得到该键所属的哈希槽编号。哈希槽的分配规则如下集群中的每个主节点负责一部分哈希槽例如一个三节点的集群可以分配为节点 A 负责 0-5460 号槽节点 B 负责 5461-10922 号槽节点 C 负责 10923-16383 号槽。当客户端写入一个键时Redis 会计算该键的哈希槽然后路由到负责该槽的节点上进行读写。当集群中新增或移除节点时哈希槽会在节点之间重新分配数据也会随之迁移整个过程对客户端基本透明。这种设计带来的好处是显而易见的扩展简单新增节点时只需从其他节点迁移一部分哈希槽过来即可不需要全量数据拷贝。定位高效客户端可以通过哈希槽直接计算出键所在的节点无需广播查询。数据均衡哈希算法能够将数据相对均匀地分布到各个节点避免单节点数据过多。4. Redis 集群的高可用机制Redis 集群的高可用依赖于主从复制和故障转移两大机制。在集群中每个主节点都可以配置一个或多个从节点。从节点会实时同步主节点的数据当主节点发生故障时集群会通过投票机制从从节点中选举出一个新的主节点继续对外提供服务。这个故障转移过程通常在几秒内完成对业务的影响很小。集群的故障检测依赖节点之间的心跳机制每个节点会定期向其他节点发送心跳消息报告自己的状态。当一个节点在设定的超时时间内没有收到某个节点的响应时会将该节点标记为疑似下线。当集群中超过半数的主节点都认为某个节点疑似下线时该节点会被正式标记为下线并触发故障转移流程。值得注意的是Redis 集群要求至少有三个主节点才能正常工作这是为了保证在部分节点故障时集群仍然能够通过投票机制达成一致避免出现脑裂问题。5. Redis 集群的搭建与使用搭建一个 Redis 集群通常需要准备至少六个节点三个主节点和三个从节点以保证高可用。下面以官方推荐的搭建方式为例进行说明。首先需要为每个节点准备一份独立的配置文件主要配置项包括# 开启集群模式 cluster-enabled yes 集群配置文件名 cluster-config-file nodes.conf 节点超时时间毫秒 cluster-node-timeout 5000 开启追加持久化 appendonly yes配置完成后依次启动各个 Redis 节点然后使用 redis-cli 的集群创建命令将它们组成一个集群# 创建集群指定三个主节点和三个从节点 redis-cli --cluster create \ 192.168.1.10:6379 \ 192.168.1.11:6379 \ 192.168.1.12:6379 \ 192.168.1.13:6379 \ 192.168.1.14:6379 \ 192.168.1.15:6379 \ --cluster-replicas 1其中 --cluster-replicas 1 表示每个主节点配备一个从节点。命令执行后redis-cli 会自动分配哈希槽并建立主从关系。客户端连接集群时需要使用集群模式进行连接。以 Java 的 Jedis 客户端为例import redis.clients.jedis.JedisCluster; import java.util.HashSet; import java.util.Set; public class ClusterDemo { public static void main(String[] args) { SetHostAndPort nodes new HashSet(); nodes.add(new HostAndPort(192.168.1.10, 6379)); nodes.add(new HostAndPort(192.168.1.11, 6379)); nodes.add(new HostAndPort(192.168.1.12, 6379)); JedisCluster jedisCluster new JedisCluster(nodes); jedisCluster.set(name, redis-cluster); System.out.println(jedisCluster.get(name)); jedisCluster.close(); } }使用集群模式连接后客户端会自动处理槽位路由和节点故障转移开发者无需关心底层细节。6. Redis 集群的注意事项在使用 Redis 集群时有几个关键点需要特别注意多键操作受限由于数据分散在不同节点上涉及多个键的事务、管道和 Lua 脚本操作要求所有键必须位于同一个哈希槽中。可以通过哈希标签Hash Tag机制让相关键强制落在同一个槽内。数据库数量受限集群模式只支持使用 db0不支持多数据库。键的批量操作像 KEYS 这样的全量扫描命令在集群中效率很低建议使用 SCAN 命令配合游标分批遍历。数据迁移期间在节点扩容或缩容时正在迁移的槽位会短暂返回 ASK 重定向客户端需要正确处理这种临时重定向。从节点默认不可读写集群中的从节点默认不对外提供读写服务主要用于数据备份和故障转移。如果确实需要读写分离需要额外配置。7. 总结Redis 集群是解决单机 Redis 容量和性能瓶颈的官方方案。它通过哈希槽机制实现数据分片通过主从复制和故障转移保证高可用通过 Gossip 协议实现去中心化的节点通信。对于数据量持续增长、对可用性要求较高的业务场景Redis 集群是一个成熟且可靠的选择。在实际落地时建议先根据业务的数据规模和读写压力评估是否需要集群再合理规划节点数量和哈希槽分配。同时要注意多键操作、数据迁移等使用细节才能让集群发挥出应有的价值。