是否使用了主-副本(Master-Slave)或多主(Multi-Master)复制?

B2C Data Innovating with Forum and Technology
Post Reply
muskanislam99
Posts: 272
Joined: Thu Dec 26, 2024 5:46 am

是否使用了主-副本(Master-Slave)或多主(Multi-Master)复制?

Post by muskanislam99 »

对于 WhatsApp 这种处理海量消息、遍布全球的分布式系统,其数据库复制策略绝不会是简单的主-副本(Master-Slave)模式,而是更高级的多主(Multi-Master)或去中心化(Decentralized/Peer-to-Peer)复制。

1. 为什么 WhatsApp 不使用传统的主-副本(Master-Slave)模式
传统的主-副本(或主-从)复制模式有以下局限性,使其不适合 WhatsApp 的规模和需求:

单点写入瓶颈: 所有写入操作都必须经过主节点。当写入量巨大时,主节点会成为瓶颈,限制了写入的横向扩展能力。
单点故障(SPOF): 如果主节点发生故障,在新的主节点选举和提升完成之前,整个系统的写入服务会中断,可用性受到影响。虽然有自动故障切换机制,但仍然存在服务中断窗口。
从库延迟: 主库和从库之间存在复制延迟。读从库可能会读到旧数据。如果需要强一致性读取,则仍需读主库,这会增加主库的压力。
跨数据中心复制复杂: 在全球部署时,跨数据中心的主从复制会面临巨大的网络延迟,导致从库滞后严重,甚至可能需要复杂的同步机制来保证数据最终一致。
2. WhatsApp 采用的复制策略:多主(Multi-Master)或去中心化架构
WhatsApp 主要依赖于像 Apache Cassandra 或 ScyllaDB 这样的分布式 NoSQL 数据库。这些数据库的架构本身就是多主(Multi-Master)或无主(Masterless / Peer-to-Peer)的复制模型,这非常适合 WhatsApp 的需求。

a. 多主/无主复制的特点
所有节点皆可读写:
在 Cassandra/ScyllaDB 集群中,所有节点都是 贝宁 whatsapp 数据库 对等的。任何节点都可以接受读写请求,并充当协调器(Coordinator)来路由请求到正确的副本。
优点: 消除了单点写入瓶颈,写入能力可以随着节点数量的增加而线性扩展。
数据复制到多个节点(Replication Factor):
每份数据都会根据复制因子(Replication Factor, RF)在集群中的多个节点上保存副本。例如,如果 RF=3,则每份数据有 3 个副本。
高可用性: 即使部分节点或甚至整个数据中心离线,只要有足够数量的副本可用(根据一致性级别),系统仍能继续提供读写服务。
数据中心感知复制(NetworkTopologyStrategy):
WhatsApp 在全球拥有多个数据中心。其数据库会配置为跨数据中心复制,确保数据副本分散在不同的地理位置。
例如,一份数据可能在 DC1 有 3 个副本,在 DC2 有 2 个副本。这提供了对整个数据中心级别故障的抵抗能力。
优点: 灾难恢复能力强,即使一个数据中心完全宕机,其他数据中心也能继续服务。
最终一致性和可调一致性级别:
多主复制通常会倾向于最终一致性。这意味着数据更新会在所有副本上异步传播。
客户端在进行读写操作时,可以指定一个一致性级别(Consistency Level, CL)。例如:
写入:
ONE:只要一个副本确认写入成功就返回。最快,但一致性最弱。
QUORUM:大多数副本确认写入成功才返回。读写性能与一致性之间的平衡。
ALL:所有副本确认写入成功才返回。强一致性,但延迟最高,可用性最低。
读取:
ONE:从任何一个副本读取。
QUORUM:从大多数副本读取,进行版本比较,返回最新数据。
PACELC 定理: 在无分区(No Partition)时,系统可以在延迟和一致性之间权衡;在分区(Partition)时,系统必须在可用性和一致性之间权衡。WhatsApp 在大多数情况下会选择低延迟和高可用性(即最终一致性)。
冲突解决机制:
在多主环境中,当不同节点同时更新同一份数据时,可能会发生冲突。
Cassandra 默认使用**最后写入胜出(Last Write Wins, LWW)**策略,通过时间戳来决定哪个写入是“最新”的。
读修复(Read Repair)和反熵(Anti-Entropy): 数据库会通过这些后台机制来检测并修复副本之间的数据不一致,确保数据最终收敛。
分布式事务和消息队列配合:
虽然核心数据是最终一致的,但对于某些需要更强一致性的操作(如用户注册、支付等),WhatsApp 可能会采用更复杂的分布式事务机制(如两阶段提交),或者通过消息队列和补偿机制来确保操作的原子性和最终一致性。
3. 实际应用中的结合
消息内容存储: 对于消息本身,最可能使用多主/无主架构的 NoSQL 数据库(如 Cassandra),以实现极高的写入吞吐量和高可用性,牺牲即时强一致性以换取可用性。消息的“已发送”、“已送达”、“已读”状态也是通过这种最终一致性模型传播的。
用户账户/群组元数据: 对于一些不那么频繁更新但需要更强一致性的数据(如用户个人资料、群组名称、成员列表),可能会根据实际需求配置更高的一致性级别(例如,QUORUM 读写),或可能甚至使用专门的关系型数据库(如果数据量相对较小且对事务性要求极高)。
总之,WhatsApp 广泛采用了多主(或无主)复制模型,并利用分布式数据库固有的高可用特性以及在应用层构建的补偿机制,以满足其海量消息、高并发和全球化部署的严苛需求。
Post Reply