1. 从单机到分布式:为什么我们需要不同的Redis部署模式?
如果你用过Redis,大概率是从一个简单的redis-server命令开始的。一个进程,一个端口,数据全在内存里,读写快得飞起。这很好,直到你的应用流量开始增长,或者老板要求系统不能宕机。这时你会发现,那个熟悉的单机Redis变得有点“脆弱”了——机器挂了数据全丢,流量大了响应变慢,想扩容还得停机迁移数据。这些问题,本质上都是单点架构的局限性。
所以,Redis的部署模式演进,就是一个典型的“打怪升级”过程,目标很明确:更高的可用性、更强的数据可靠性、以及可扩展的性能。从最基础的单机模式,到主从复制分担读压力,再到哨兵模式实现自动故障转移,最后到集群模式解决海量数据与高并发写入的终极难题。每一种模式都不是凭空出现的,而是为了解决前一种模式在特定场景下的痛点。
今天,我们就抛开那些官方文档里干巴巴的名词解释,从一个实际运维和开发者的角度,把这四种部署模式(单机、主从、哨兵、集群)的核心原理、优缺点、以及最关键的实际选型与避坑方案彻底讲透。你会发现,选择哪种模式,不取决于哪种听起来更“高级”,而完全取决于你的业务场景到底需要什么。是追求极致的简单和开发速度?还是要求99.99%的可用性?或者是数据量已经大到单机根本装不下?
2. 模式一:单机部署——简单粗暴的起点
单机部署是Redis所有故事的开始。它意味着在一台物理机或虚拟机(甚至一个Docker容器)上,运行一个Redis服务进程,所有数据都存储在该进程管理的内存中,可选地持久化到本地磁盘。对于开发、测试、或者初期用户量很小的生产环境,它几乎是唯一的选择。
2.1 核心原理与工作方式
单机Redis的核心就是一个redis-server进程。它采用单线程Reactor模型处理网络I/O和命令执行(6.0版本后引入了多线程处理网络I/O,但命令执行仍是单线程)。所有客户端连接都通过I/O多路复用技术进行管理,命令被顺序执行。数据全部存储在内存中,通过RDB(快照)或AOF(追加日志)机制,或两者结合,实现数据的持久化。
它的工作方式极其“单纯”:
- 启动服务:执行
redis-server /path/to/redis.conf,加载配置文件。 - 客户端连接:应用通过
host:port(默认6379)连接到这个唯一的服务节点。 - 数据操作:所有读写请求都直接发往这个节点,由它全权处理并返回结果。
- 持久化(可选):根据配置,在后台异步生成RDB文件,或同步追加命令到AOF文件。
注意:很多人误以为Redis单线程是性能瓶颈。恰恰相反,在绝大多数场景下,单线程避免了多线程的上下文切换和锁竞争开销,配合纯内存操作和高效的I/O多路复用,使其在单核CPU上就能达到极高的QPS。瓶颈往往在网络带宽和内存大小。
2.2 优点:为什么我们最初都爱它?
- 极致简单:部署、配置、维护的成本几乎为零。一条命令就能跑起来,对开发者极其友好。这也是为什么
docker run -d redis能成为最流行的入门方式。 - 性能强悍:没有分布式协调的开销,所有数据都在本地内存,延迟极低,吞吐量很高,足以支撑早期业务。
- 功能完整:支持Redis的所有数据结构和命令,没有任何限制。
- 资源消耗少:只需要一个进程,对系统资源要求低。
2.3 缺点与风险:单点故障是致命伤
当业务从“能用”走向“好用”和“稳定”时,单机模式的缺点就暴露无遗:
- 单点故障(SPOF):这是最致命的问题。一旦运行Redis的服务器宕机、重启或Redis进程崩溃,整个缓存服务立刻不可用,所有依赖它的应用都会受到影响,可能导致服务雪崩。
- 数据可靠性风险:虽然提供了RDB和AOF,但都存在数据丢失窗口。RDB是定时快照,两次快照之间的数据会丢失。AOF虽然更安全,但
appendfsync everysec策略下仍可能丢失1秒数据,而always策略又会严重性能。机器磁盘损坏也可能导致持久化文件丢失。 - 容量瓶颈:数据量受限于单机内存。当数据量超过物理内存,要么使用虚拟内存(性能骤降),要么无法写入。升级内存是最直接的扩容方式,但成本高且有上限。
- 性能瓶颈:所有读写压力集中于一机。虽然Redis本身处理能力强,但网络I/O、CPU(特别是持久化时)和内存带宽可能成为瓶颈。无法通过增加节点来线性提升QPS。
- 无法做读写分离:所有请求,无论是读是写,都由同一个节点处理,无法利用多台服务器的资源来分摊读压力。
2.4 适用场景与解决方案
适用场景:
- 开发与测试环境:快速搭建,用完即弃。
- 个人项目或微型企业应用:用户量小,对可用性要求不高。
- 学习与研究:理解Redis基础功能的最佳选择。
“准生产”单机优化方案: 如果你的业务暂时还不需要高可用,但又想尽可能提升单机的可靠性,可以这样做:
- 持久化策略:采用
RDB + AOF混合模式。用AOF保证数据安全性,定期用RDB做全量备份以便快速恢复和节省磁盘空间。配置aof-use-rdb-preamble yes。 - 监控与告警:务必部署监控,关注内存使用率、连接数、持久化状态、慢查询。设置内存使用阈值告警(如>80%)。
- 备份与恢复演练:定期将RDB和AOF文件备份到异地(如云存储),并定期进行恢复演练,确保备份有效。
- 资源隔离:为Redis进程配置
cgroup限制CPU和内存,避免被其他进程影响。在生产服务器上,尽量让Redis独占一个实例。
3. 模式二:主从复制(Replication)——读写分离的雏形
主从模式是解决单机读压力和数据备份问题的第一步。它引入了多个Redis实例,其中一个作为主节点(Master),负责处理写操作;一个或多个作为从节点(Slave),通过异步复制机制,实时同步主节点的数据,并主要承担读请求。
3.1 核心原理:基于命令流的异步复制
主从复制的核心是异步数据同步。其工作流程如下:
- 建立连接:从节点启动后,通过
replicaof <masterip> <masterport>命令(旧版为slaveof)向主节点发起连接。 - 全量同步(SYNC):连接建立后,如果从节点是首次连接,或复制偏移量(Replication Offset)已不在主节点的复制积压缓冲区(Replication Backlog)中,则会触发全量同步。
- 主节点执行
bgsave生成当前内存数据的RDB快照。 - 将RDB文件通过网络传输给从节点。
- 从节点清空旧数据,加载RDB文件。
- 在主节点生成和传输RDB期间,新的写命令会被缓存在内存的缓冲区中。
- 主节点执行
- 部分同步(PSYNC):如果从节点的复制偏移量仍在主节点的复制积压缓冲区内,则触发部分同步。主节点只需将缓冲区中从该偏移量之后的所有写命令发送给从节点即可,效率极高。
- 命令传播:完成初始同步后,主节点每执行一个写命令(如SET、LPUSH),都会异步地将该命令发送给所有从节点。从节点接收到命令后,在自己的数据副本上执行,从而保持最终一致性。
3.2 优点:读扩展与数据备份
- 读写分离:这是最主要的价值。可以将大量的读请求(如商品信息查询、用户会话获取)分发到多个从节点,显著减轻主节点的压力,提升整体读吞吐量。应用端需要实现简单的路由逻辑(写走主,读走从)。
- 数据热备份:从节点是主节点的完整数据副本,实现了数据的实时备份。即使主节点数据丢失,也可以快速切换到从节点(需手动或通过其他工具)。
- 提升可用性:虽然主节点故障后不会自动切换,但至少从节点可以继续提供读服务,避免了服务完全不可用。为后续实现高可用打下了基础。
- 架构清晰:配置简单,概念容易理解。
3.3 缺点与风险:故障转移的缺失
主从模式并未解决单机模式的所有问题,尤其是高可用性:
- 手动故障转移:当主节点故障时,整个系统将失去写能力。需要人工干预,选择一个从节点提升为新的主节点,并让其他从节点和客户端指向新的主节点。这个过程耗时、易错,且在故障期间服务受影响。
- 写能力瓶颈:所有写操作仍然集中在单一主节点,写性能和容量没有提升。
- 异步复制的数据不一致:由于复制是异步的,主节点写入成功后,命令传播到从节点存在微小延迟。在极端情况下(主节点在传播命令前宕机),可能导致已向客户端确认的写操作在从节点上丢失,造成数据不一致。从节点读取的数据可能是稍旧版本。
- 复制风暴:如果一个主节点挂载了太多从节点,在全量同步时,主节点需要为每个从节点生成并传输RDB,会消耗大量主节点的CPU、内存和网络带宽,可能导致主节点服务性能下降甚至宕机。
3.4 部署实践与避坑指南
部署示例(一主一从): 假设主节点运行在192.168.1.10:6379,从节点运行在192.168.1.11:6379。
- 主节点配置:基本保持单机配置,但建议设置
repl-backlog-size(复制积压缓冲区大小,如1GB)以优化部分同步。 - 从节点配置:在
redis.conf中添加一行replicaof 192.168.1.10 6379。或者启动后使用命令REPLICAOF 192.168.1.10 6379。
关键配置与调优:
repl-backlog-size:务必设置一个合适的大小(例如1gb)。它决定了网络闪断后,从节点能通过部分同步恢复的最大数据量。设置过小会导致频繁的全量同步,增加主节点压力。client-output-buffer-limit replica:调整主节点对从节点的输出缓冲区限制。对于从节点多或网络慢的场景,可以适当调大,避免因缓冲区溢出导致复制中断。repl-diskless-sync:在磁盘IO性能差的机器上,可以考虑开启无盘复制,主节点直接将RDB通过网络发送,不落盘,但会对网络带宽和主节点CPU造成瞬时压力。min-replicas-to-write和min-replicas-max-lag:可以配置主节点在至少N个从节点的延迟都小于M秒时,才接受写请求。这在一定程度上保证了数据的可靠性,但牺牲了可用性(从节点出问题会导致主节点不可写),需谨慎使用。
常见问题与排查:
- 从节点显示
master_link_status:down:检查网络连通性、防火墙、主节点密码(masterauth配置)是否正确。 - 复制延迟(
master_repl_offset与slave_repl_offset差值大):可能是从节点性能不足、网络带宽瓶颈,或主节点写入压力过大。监控slave_repl_offset的增长速度是否持续低于master_repl_offset。 - 频繁全量同步:检查
repl-backlog-size是否足够,以及主从网络是否不稳定导致连接频繁断开重连。
4. 模式三:哨兵模式(Sentinel)——高可用的守护者
主从模式解决了读扩展,但故障转移需要手动。哨兵模式就是为了自动化这个过程而生的。它不是一个独立的Redis节点,而是一个分布式监控与管理系统,由多个哨兵进程组成,负责监控主从节点,并在主节点故障时,自动完成故障发现、选举和切换。
4.1 核心原理:基于共识的自动故障转移
哨兵系统的工作原理可以概括为“监控、通知、自动切换”:
- 监控:每个哨兵进程以固定频率(默认1秒)向所有被监控的主节点、从节点以及其他哨兵节点发送PING命令,检测它们是否在线。
- 主观下线(SDOWN):如果一个哨兵在配置的
down-after-milliseconds时间内没有收到主节点的有效回复,该哨兵会主观地认为这个主节点下线了。 - 客观下线(ODOWN):当足够数量(由
quorum参数配置)的哨兵都报告该主节点主观下线时,这个主节点就被标记为客观下线。这是触发故障转移的前提。 - 哨兵领导者选举:一旦主节点被判定为客观下线,哨兵们会通过Raft共识算法选举出一个“领导者哨兵”(Sentinel Leader),由它来负责本次故障转移操作。这避免了多个哨兵同时执行切换导致混乱。
- 故障转移:领导者哨兵会从原主节点的从节点列表中,根据一定的规则(如优先级
replica-priority、复制偏移量等)选出一个最合适的从节点,向其发送SLAVEOF NO ONE命令,将其提升为新的主节点。 - 配置更新与通知:领导者哨兵会让其他从节点复制新的主节点,并通过发布订阅(Pub/Sub)机制,将新的主节点地址通知给所有客户端(需要客户端支持哨兵协议或使用哨兵客户端)。
4.2 优点:自动化与高可用
- 自动化故障转移:核心价值。主节点故障后,能在数十秒内自动完成切换,极大减少了服务不可用时间,实现了服务的高可用(HA)。
- 监控与通知:持续监控所有Redis节点和哨兵自身的健康状态,并能及时通知系统管理员或客户端。
- 配置中心:客户端无需硬编码Redis主节点地址,而是连接哨兵来查询当前可用的主节点地址,实现了服务发现的解耦。
- 多哨兵防脑裂:通常部署奇数个(如3个或5个)哨兵节点,分布在不同的物理机器上,通过共识机制避免因单个哨兵故障或网络分区导致的误判。
4.3 缺点与局限:写瓶颈与容量限制
哨兵模式本质上是主从模式+自动故障管理,因此它继承了主从模式的大部分缺点:
- 写能力与容量未扩展:所有写操作仍然集中在单一主节点,存储容量受限于单机内存。这是哨兵模式无法解决的根本问题。
- 异步复制数据丢失:和主从模式一样,存在数据不一致的窗口期。在主节点宕机前未来得及同步到新主节点的数据会永久丢失。
- 配置与复杂度提升:需要部署和维护多个哨兵进程,配置项增多(如
quorum、down-after-milliseconds),架构变得复杂。 - 客户端支持:应用需要使用支持哨兵协议的客户端(如Jedis、Lettuce的Sentinel模式),或通过哨兵API自行获取主节点地址,增加了客户端的复杂度。
4.4 部署与运维核心要点
典型部署架构: 通常建议部署3个哨兵进程,与Redis主从节点混合或独立部署。关键是要将哨兵分布在不同的物理机或可用区,避免同时宕机。
- Redis Master:
192.168.1.10:6379 - Redis Slave-1:
192.168.1.11:6379 - Redis Slave-2:
192.168.1.12:6379 - Sentinel-1:
192.168.1.10:26379 - Sentinel-2:
192.168.1.11:26379 - Sentinel-3:
192.168.1.12:26379
哨兵配置文件 (sentinel.conf) 关键参数:
sentinel monitor mymaster 192.168.1.10 6379 2 # 监控名为‘mymaster’的主节点,quorum=2 sentinel down-after-milliseconds mymaster 5000 # 5秒无响应判为主观下线 sentinel failover-timeout mymaster 60000 # 故障转移超时时间60秒 sentinel parallel-syncs mymaster 1 # 故障转移后,每次同时向新主同步的从节点数运维经验与避坑:
quorum值的设定:这是最重要的参数之一。quorum表示判定客观下线所需的最少哨兵票数。例如,3个哨兵时,quorum=2是常见设置。它必须满足:quorum <= number of sentinels / 2 + 1,以避免网络分区时出现“双主”脑裂。通常设为哨兵总数/2 + 1取整。down-after-milliseconds:根据网络状况调整。在稳定的内网可以设小(如3秒),在公网或波动网络要设大(如10-30秒),避免因网络抖动导致误切换。- 客户端重试与刷新:客户端在收到切换通知后,必须能够关闭旧连接,与新主节点建立连接,并具备重试机制。确保客户端库的版本支持哨兵且配置正确。
- 监控哨兵本身:哨兵进程也可能挂掉。需要监控哨兵进程的状态和日志。如果多数哨兵宕机,整个高可用体系将失效。
- 故障转移期间的写丢失:这是异步复制架构的固有风险。对数据一致性要求极高的场景,需要在应用层做补偿(如写数据库后异步双写Redis,或使用最终一致性策略)。
5. 模式四:集群模式(Cluster)——分布式终极方案
当数据量超过单机内存,或者写并发高到单主节点无法承受时,哨兵模式也无能为力。Redis Cluster是Redis官方提供的分布式解决方案,它通过数据分片(Sharding)将数据分散到多个节点上,同时每个分片内部采用主从复制保证可用性,从而实现了水平扩展。
5.1 核心原理:分片、 Gossip与智能客户端
Redis Cluster的设计非常精妙,其核心包括三个部分:
数据分片(Sharding):
- Redis Cluster将整个数据空间划分为16384个哈希槽(Hash Slot),编号0-16383。
- 每个键(Key)通过CRC16算法计算出一个16位的值,然后对这个值取模16384,得到该键所属的槽位。
- 集群中的每个主节点负责处理一部分连续的哈希槽。例如,一个3主节点的集群,可能这样分配:Node1负责0-5460槽,Node2负责5461-10922槽,Node3负责10923-16383槽。
- 数据根据其键的哈希槽被存储到对应的主节点上。
节点通信与故障检测(Gossip协议):
- 集群中所有节点(主节点和从节点)通过Gossip协议彼此通信。每个节点都维护一份关于集群的元数据,包括所有节点的状态、负责的槽位等。
- 节点间定期发送PING/PONG消息交换信息。如果一个节点在超时时间内未收到另一个节点的PONG回复,则会将其标记为疑似下线(PFAIL)。当多数主节点都认为某个主节点PFAIL时,该节点被标记为已下线(FAIL),并触发故障转移。
请求路由:
- 重定向(MOVED/ASK):客户端可以连接集群中任意节点。如果请求的键不属于该节点,节点会返回一个
MOVED错误,并告知客户端正确的节点地址。智能客户端(如JedisCluster、Lettuce)会缓存槽位到节点的映射关系,后续直接发往正确节点。 - 智能客户端:成熟的客户端库会在内部维护槽位映射表,并能在映射变化(如故障转移、扩容缩容)时自动更新,大部分请求可以直接路由到正确节点,无需重定向。
- 重定向(MOVED/ASK):客户端可以连接集群中任意节点。如果请求的键不属于该节点,节点会返回一个
5.2 优点:水平扩展与高可用结合
- 海量数据存储:通过将数据分片到多个节点,突破了单机内存限制,理论上可以线性扩展至16384个主节点。
- 高性能读写:写请求也被分散到不同的主节点,解决了单主节点的写瓶颈。读请求同样可以分散,结合从节点实现读写分离。
- 内置高可用:每个分片(主节点)都可以配置一个或多个从节点。当主节点故障时,其从节点会自动晋升为新主(类似哨兵机制,但由集群自身完成),继续服务该分片的数据。
- 去中心化:没有中心化的管理节点(如哨兵),集群状态信息在所有节点间通过Gossip协议同步,避免了单点故障。
5.3 缺点与挑战:复杂度与功能限制
功能强大必然带来复杂性,Redis Cluster并非银弹:
- 客户端复杂度:必须使用支持Cluster协议的客户端。虽然智能客户端能处理重定向和缓存,但连接管理和故障感知逻辑比直连或哨兵模式复杂得多。
- 不支持多键操作:这是最大的功能限制。涉及多个键的命令(如
MGET、MSET),除非这些键都在同一个节点(即通过hash tag确保它们哈希到同一槽位),否则无法执行。所有Lua脚本中的键也必须位于同一节点。 - 批量操作性能:由于数据分布在多个节点,原本单机的批量操作可能变成多次网络往返,需要客户端做聚合,性能有损耗。
- 运维复杂度高:集群的搭建、扩容、缩容、故障处理都比前几种模式复杂。虽然官方提供了
redis-cli --cluster工具,但仍需谨慎操作,尤其是数据迁移期间。 - 网络分区(脑裂)风险:在极端网络分区下,可能出现少数派的主节点被原从节点替代,导致数据写入冲突(原主节点恢复后,其未同步的写数据会丢失)。Redis Cluster通过配置
cluster-node-timeout和cluster-slave-validity-factor等参数来缓解,但无法完全避免CAP理论中的取舍。
5.4 集群搭建、管理与深度调优
搭建一个最小集群(3主3从):
# 准备6个节点的配置文件,开启集群模式 # redis.conf 中需要配置: cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 # 启动6个Redis实例后,使用集群创建命令 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 # 每个主节点配1个从节点关键配置解析:
cluster-node-timeout:节点失联超时时间,默认15秒。影响故障检测速度和迁移超时判断。在网络稳定的环境可适当调小以加快故障转移。cluster-require-full-coverage:默认为yes。当集群中任何一部分哈希槽没有节点负责时,整个集群将停止服务。如果希望部分节点故障时其他槽位仍可服务,可设为no,但需客户端能处理部分失败。cluster-migration-barrier:主节点需要保持至少几个从节点才允许迁移。默认为1。
扩容与缩容操作:
- 添加新节点:先以空节点加入集群,然后从现有节点中迁移一部分哈希槽到新节点。使用
redis-cli --cluster add-node和redis-cli --cluster reshard命令。 - 删除节点:先将其负责的槽位迁移到其他节点,确保该节点为空节点,然后从集群中移除。使用
redis-cli --cluster reshard和redis-cli --cluster del-node命令。
警告:槽位迁移是在线操作,但会阻塞涉及键的请求。务必在业务低峰期进行,并做好监控。
常见问题排查:
- 集群状态异常(
CLUSTERDOWN):检查集群是否满足cluster-require-full-coverage要求,或者多数主节点间网络是否连通。使用redis-cli --cluster check检查集群健康状态。 MOVED重定向过多:客户端槽位映射表未正确缓存或已过期。检查客户端版本和配置,确保其支持集群协议并能处理重定向。频繁的重定向会严重影响性能。- 数据倾斜:某些节点数据量或请求量远高于其他节点。可能是由于
hash tag使用不当导致大量键聚集在少数槽位。需要分析键的分布,或考虑使用一致性哈希客户端在应用层做分片。 - 故障转移失败:检查从节点状态是否正常,集群中大多数主节点是否可达。故障转移需要集群中大多数主节点达成共识。
6. 模式对比与选型决策指南
了解了四种模式的原理和细节后,最关键的一步是如何根据你的业务场景做出正确选择。下面这个表格从核心维度进行了对比:
| 特性维度 | 单机模式 | 主从模式 | 哨兵模式 | 集群模式 |
|---|---|---|---|---|
| 数据容量 | 单机内存上限 | 单机内存上限 | 单机内存上限 | 可水平扩展,理论无上限 |
| 写性能 | 单机上限 | 单机上限 | 单机上限 | 可水平扩展,多主节点分担 |
| 读性能 | 单机上限 | 可扩展,读写分离 | 可扩展,读写分离 | 可扩展,读写分离+分片 |
| 可用性 | 低(单点故障) | 较低(主节点单点) | 高(自动故障转移) | 高(分片内主从+自动转移) |
| 数据可靠性 | 依赖持久化 | 依赖持久化+热备 | 依赖持久化+热备 | 依赖持久化+热备 |
| 一致性模型 | 强一致 | 最终一致(主从异步) | 最终一致(主从异步) | 最终一致(分片内主从异步) |
| 功能完整性 | 完整支持 | 完整支持 | 完整支持 | 有限制(跨节点多键操作) |
| 架构复杂度 | 极简 | 简单 | 中等 | 复杂 |
| 运维成本 | 极低 | 低 | 中 | 高 |
| 典型应用场景 | 开发测试、微小型应用 | 读多写少,需备份,可接受手动切换 | 读多写少,要求高可用,数据量不大 | 海量数据、高并发读写、要求高可用 |
选型决策路径:
第一步:评估数据量与性能需求
- 数据量 < 单机内存,且预计未来增长缓慢:优先考虑单机、主从或哨兵模式。
- 数据量 > 单机内存,或写QPS远超单机处理能力:必须选择集群模式。
第二步:评估可用性要求
- 可接受分钟级手动恢复:主从模式可能足够,配合监控告警和运维脚本。
- 要求秒级自动故障恢复,服务中断时间最短:必须选择哨兵模式或集群模式。
第三步:评估业务功能兼容性
- 业务严重依赖跨Key事务(如MGET多个不同键)、或复杂的多键Lua脚本:集群模式是禁区,因为跨节点操作不被支持。此时只能使用哨兵模式,并通过客户端分片(如Twemproxy, Codis)或升级单机内存来应对容量问题,但这会引入新的代理层复杂度。
- 业务以单Key操作或同一哈希标签下的多Key操作为主:可以放心使用集群模式。
第四步:评估团队运维能力
- 团队缺乏分布式系统运维经验:从哨兵模式开始是更稳妥的选择。集群模式的扩容、缩容、故障排查复杂度更高。
- 团队具备较强的运维能力,且业务规模明确需要分布式:直接上集群模式。
个人经验之谈: 在实际项目中,我见过太多为了“追求先进”而盲目使用集群,最后被跨节点操作和运维复杂度搞得焦头烂额的案例。我的建议是:不要过度设计。很多业务在早期,一个配置了持久化和监控的哨兵模式(一主两从三哨兵)架构,足以支撑千万级用户量和TB级以下的数据缓存需求,并且保持了Redis全部功能的可用性。只有当监控指标明确显示内存或写压力即将成为瓶颈时,再开始规划向集群模式的迁移。迁移本身也是一个复杂的项目,需要充分测试业务兼容性和数据迁移方案。记住,最适合的才是最好的,架构演进应该跟随业务成长,而非提前预支复杂度。