架构思维:分布式系统的原理性问题总结

发布于:2025-03-24 ⋅ 阅读:(25) ⋅ 点赞:(0)

在这里插入图片描述

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 PaxosMulti 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跨区域优化)。

总结

  1. 分片选择:主用Range分片按类目划分,辅以一致性Hash处理非热点数据。
  2. 热点处理:元数据服务动态路由,热点类目拆分为多个分片,结合缓存抗读压力。
  3. 数据一致性:主从复制+Raft协议,确保强一致性;异地容灾采用异步复制+Gossip。
  4. 元数据管理:ETCD集群存储分片信息,客户端缓存元数据减少延迟。

此方案平衡了扩展性、一致性与可用性,灵活应对海量数据与业务热点,符合高并发场景需求。

在这里插入图片描述