文章目录
PRE
引言
在分布式系统中设计支持海量商品存储的高扩展性架构,需综合考虑数据分片、复制策略及一致性算法
1. 数据分片策略
Hash取模分片
将商品ID通过哈希函数取模,均匀分布到节点。例如,4个节点时,商品ID%4决定存储位置。优点:数据分布均匀;缺点:扩展性差,节点增减导致大规模数据迁移。
一致性Hash分片
节点和数据映射到哈希环,数据顺时针找到最近节点存储。通过虚拟节点(如10个虚拟节点对应4个物理节点)减少数据倾斜。优点:节点增减仅影响相邻数据,迁移量小;缺点:仍存在单一热点问题。
当我们新增一台服务器,即节点 E 时,受影响的数据仅仅是新服务器到所处环空间中前一台服务器(即沿着逆时针方向的第一台服务器)之间的数据。只有商品 100 和商品 101 从节点 A 被移动到节点 E,其他节点的数据保持不变。此后,节点 A 只存储 Hash 值为 2 和 3 的商品,节点 E 存储 Hash 值为 0 和 1 的商品
Range分片
虽然一致性 Hash 提升了稳定性,使节点的加入和退出不会造成大规模的数据迁移,但本质上 Hash 分片是一种静态的分片方式,必须要提前设定分片的最大规模,而且无法避免单一热点问题, 某一数据被海量并发请求后,不论如何进行 Hash,数据也只能存在一个节点上,这势必会带来热点请求问题。比如某些商品卖得非常火爆,通过 Hash 分片的方式很难针对热点商品做单独的架构设计。
所以,如何解决单一热点问题?答案是做 Range(范围)分片
按业务属性(如商品类目)灵活分片。例如,热门3C类目细分三级类目,冷门类目合并分片。优点:可针对业务热点动态调整;缺点:需元数据管理分片规则,复杂度较高。
2. 应对热点数据
- 读热点:引入缓存(如Redis)分担数据库压力,结合本地缓存减少网络开销。
- 写热点:
- Range分片:将热点类目拆分为多个分片,结合垂直扩展(提升单节点性能)。
- 分片元数据服务:通过ETCD集群管理分片信息,动态路由请求,灵活调整热点分片分布。
3. 数据复制与一致性
- 主从复制:数据副本提升可用性,主节点故障时从节点接管。
- 一致性算法:
- 强一致性(Raft/Paxos):确保数据变更原子性。ETCD使用Raft,选举Leader处理请求,日志复制保证多数节点一致。
- 最终一致性(Gossip):节点间异步传播数据,容忍临时不一致。适用于AP场景,如Cassandra。
4. 分片元数据管理
- 元数据服务:独立集群存储分片规则、节点状态,通过ETCD保证高可用和一致性。
- 客户端路由:请求先查询元数据获取分片位置,结合缓存减少元数据访问延迟。
5. 一致性算法对比
在分布式系统中,造成系统不可用的场景很多,比如服务器硬件损坏、网络数据丢包等问题,解决这些问题的根本思路是多副本,副本是分布式系统解决高可用的唯一手段,也就是主从模式,那么如何在保证一致性的前提下,提高系统的可用性,Paxos 就被用来解决这样的问题,而 Paxos 又分为 Basic Paxos
和 Multi Paxos
,然而因为它们的实现复杂,工业界很少直接采用 Paxos 算法。
Raft 是 Multi Paxos 的一种实现,是通过一切以领导者为准的方式,实现一系列值的共识,然而不是所有节点都能当选 Leader 领导者,Raft 算法对于 Leader 领导者的选举是有限制的,只有最全的日志节点才可以当选。正因为 ETCD 选择了 Raft,为工业界提供了可靠的工程参考,就有更多的工程实现选择基于 Raft,如 TiDB 就是基于 Raft 算法的优化
除此之外, 还可以有一种思路:分片元数据服务毕竟是一个中心化的设计思路,而且基于强一致性的共识机制还是可能存在性能的问题,有没有更好的架构思路呢?
既然要解决可用性的问题,根据 Base 理论,需要实现最终一致性,那么 Raft 算法就不适用了,因为 Raft 需要保证大多数节点正常运行后才能运行。这个时候,可以选择基于 Gossip 协议的实现方式。
Gossip 的协议原理有一种传播机制叫谣言传播,指的是当一个节点有了新数据后,这个节点就变成了活跃状态,并周期性地向其他节点发送新数据,直到所有的节点都存储了该条数据。这种方式达成的数据一致性是 “最终一致性”,即执行数据更新操作后,经过一定的时间,集群内各个节点所存储的数据最终会达成一致,很适合动态变化的分布式系统。
节点 A 向节点 B、C 发送新数据,节点 B 收到新数据后,变成了活跃节点,然后节点 B 向节点 C、D 发送新数据
- Basic Paxos:解决单个值共识,两阶段提交(Prepare/Accept),高延迟但可靠。
- Multi Paxos:选举Leader处理多个提案,减少Prepare阶段开销,提升效率。
- Raft:简化Multi Paxos,Leader选举、日志复制和安全性明确分离,易于工程实现。
- Gossip : 当一个节点有了新数据后,这个节点就变成了活跃状态,并周期性地向其他节点发送新数据,直到所有的节点都存储了该条数据
6. 扩展性与容灾
- 动态扩缩容:一致性Hash或Range分片支持平滑扩容,数据迁移期间双写保证可用性。
- 多数据中心:跨地域部署结合异步复制(最终一致性)或同步协议(如Raft跨区域优化)。
总结
- 分片选择:主用Range分片按类目划分,辅以一致性Hash处理非热点数据。
- 热点处理:元数据服务动态路由,热点类目拆分为多个分片,结合缓存抗读压力。
- 数据一致性:主从复制+Raft协议,确保强一致性;异地容灾采用异步复制+Gossip。
- 元数据管理:ETCD集群存储分片信息,客户端缓存元数据减少延迟。
此方案平衡了扩展性、一致性与可用性,灵活应对海量数据与业务热点,符合高并发场景需求。