在海量数据处理的场景下,单机系统的存储和计算能力终有上限。为了实现水平扩展(Scale-out),分片(Sharding)架构成为了分布式设计的核心。不同的分布式中间件根据其业务场景(文档存储、文件存储、搜索、缓存),采用了截然不同的分片策略和高可用(HA)机制。
1. MongoDB Sharding:角色分明的元数据管理
MongoDB 的分片架构是典型的中心化元数据管理模式,其架构清晰地划分为三类角色。
核心组件
- Shard(分片):实际存储数据的节点。为了保证高可用,每个 Shard 内部通常是一个 Replica Set(副本集),包含主节点和从节点,支持自动故障转移。
- Mongos(路由):数据库集群的请求入口。应用端连接 Mongos,由它根据片键(Shard Key)将请求路由到具体的 Shard。
- Config Server(配置服务器):整个集群的大脑,存储元数据(Metadata),即数据块与分片的映射关系。如果你对构建高可用的数据库集群感兴趣,可以在 云栈社区 的数据库板块找到更多深入探讨。
高可用与故障模式
MongoDB 的高可用依赖于 Shard 内部的副本集机制。然而,架构设计中存在一个关键的依赖点:Config Server。
故障影响:当 Config Server 挂掉(或不可用)时,由于元数据无法更新,集群将进入 Read-Only(只读) 模式。此时无法进行分片迁移(Chunk Migration)或元数据变更,但仍可读取现有数据,这是一种在 CAP 理论中权衡了一致性与可用性的设计。
2. HDFS:强一致性的元数据高可用
HDFS(Hadoop Distributed File System)作为大数据存储基石,其架构设计重点在于 NameNode 的高可用,这涉及到复杂的分布式协调。
核心组件
- NameNode:管理文件系统的命名空间和元数据。
- DataNode:实际存储数据块的节点。
- JournalNode:用于在主备 NameNode 之间同步 EditLog(操作日志)的组件。
依赖 ZooKeeper 的高可用设计
HDFS 的高可用(HA)架构强依赖于 ZooKeeper 和 JournalNode 集群:
- ZooKeeper 的作用:负责监控 NameNode 的状态,并在发生故障时辅助进行自动故障转移(Failover),防止“脑裂”。这类分布式协调与高可用设计,属于 后端与架构 领域的核心知识。
- JournalNode 的 Quorum 机制:为了保证元数据不丢失,主 NameNode 写入日志时,必须写入至少 3 个 JournalNode 中的大多数(Majority)才算成功。这种多数派写入机制(Paxos/Raft 思想)保证了数据的一致性。
3. ElasticSearch:索引维度的分片与共识算法演进
ElasticSearch(ES)的分片逻辑主要围绕“索引(Index)”展开,其集群管理经历了从简易到严谨的演进。
分片与副本策略
- 逻辑分片:ES 的数据是按照索引分片的,而不是按照物理节点分片。一个索引被切分成多个 Shard,这些 Shard 分布在不同的 Node 上。
- 高可用:每个主分片(Primary Shard)可以配置多个副本分片(Replica Shard)。副本不仅用于故障恢复,还能分担读取流量。
集群管理与选举算法的演进
ES 节点通过选举 Master 来管理集群状态(创建索引、分配分片等)。其选举算法在 7.0 版本前后有重大变革:
- 7.0 以前:使用的是 Zen Discovery 模块,内置了一种类 Bully 的选举算法。这种算法简单但存在一些网络分区下的边界问题(如脑裂风险较高)。
- 7.0 以后:引入了全新的集群协调层,采用了类 Raft 的一致性算法。这大大提高了集群在元数据更新和选主过程中的确定性和安全性。
4. Redis Cluster:去中心化的 Gossip 协议
Redis Cluster 选择了与上述系统完全不同的去中心化(Decentralized)路线,旨在实现极高的性能和线性扩展。
数据分布与高可用
- 分片机制:集群将数据空间划分为 16384 个哈希槽(Slots),Cluster 被分为多个分片,不同分片负责不同的 Slot 范围,从而保存不同数据。
- 主备复制:每个分片内部通过主备复制(Master-Slave)来保证可用性。关于 Redis 的更多高级特性和最佳实践,值得深入探索。
独特的故障转移机制
Redis Cluster 的设计亮点在于其不依赖外部组件:
- 不依赖 Sentinel:与 Redis Sentinel 模式不同,Cluster 模式不需要额外部署哨兵节点。
- 分片内选举:Cluster 本身具备分片选举能力。当 Master 宕机,该分片的 Slave 节点会自动发起选举成为新的 Master。
通信协议
Gossip 协议:节点之间通过 Gossip 协议不断交换信息(Ping/Pong)。这种传播方式使得集群状态(如节点上线、下线、Slot 迁移)最终会在整个网络中达成一致。当节点发生变化时,集群会自动更新拓扑信息,无需中心化的配置服务介入。
总结对比
通过对比这四种架构,我们可以看到分布式系统设计的权衡艺术:
| 系统 |
分片逻辑 |
核心角色 |
高可用/一致性依赖 |
选举/共识机制 |
| MongoDB |
基于 Chunk 和 Shard Key |
Mongos, Config, Shard |
Replica Set + Config Server |
Raft (内部副本集) |
| HDFS |
文件块 Block 分布 |
NameNode, DataNode |
ZooKeeper + JournalNode |
ZK + Quorum Journal |
| ElasticSearch |
基于 Index |
Master, Data Node |
Primary/Replica Shards |
类 Bully (<7.0) / 类 Raft (>=7.0) |
| Redis |
基于 Hash Slots |
Master, Slave (无中心) |
Master-Slave Replication |
Gossip + 内部选举 |
MongoDB 和 HDFS 倾向于拥有明确的元数据管理角色(Config Server/NameNode),易于管理但存在单点影响。
ElasticSearch 融合了逻辑分片与物理分布,并在新版本中加强了共识算法的严谨性。
Redis Cluster 则追求极致的性能和去中心化,利用 Gossip 协议实现了自管理的集群架构。不同的业务场景和技术要求,决定了最终架构的选型。
|