如何处理数据库节点宕机和重启?

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

如何处理数据库节点宕机和重启?

Post by muskanislam99 »

在像 WhatsApp 这样拥有数十亿用户和海量数据的分布式系统中,数据库节点宕机和重启是常态,而非异常。因此,系统必须设计得能够优雅地处理节点故障,并实现自动化的故障转移(Failover)和高效的故障恢复(Recovery),以确保服务不中断和数据一致性。

WhatsApp 主要依赖于像 Apache Cassandra 或 ScyllaDB 这样的去中心化、高可用 NoSQL 数据库,它们提供了处理节点故障的内置机制。

1. 节点宕机(Downtime)的处理
当一个数据库节点宕机时,系统会经历以下步骤:

a. 故障检测 (Detection)
流言协议 (Gossip Protocol):
Cassandra/ScyllaDB 集群中的每个节点都通过 Gossip 协议不断地与其他节点交换心跳和状态信息。
如果一个节点在预定时间内没有响应心跳,其他节点会逐渐将其标记为“不可达”(UNREACHABLE)。
这种检测是去中心化且快速的。
外部监控系统:
WhatsApp 会有完善的监控基础设施(如 Prometheus, Zabbix 等)来持续收集所有数据库节点的 CPU、内存、磁盘 I/O、网络和进程健康状况等指标。
一旦检测到异常(如进程崩溃、资源耗尽、网络连接断开),会立即触发警报通知运维团队。
客户端驱动健康检查:
智能数据库客户端驱动程序(如 Cassandra Java Driver)本身也维护着集群中节点的健康视图。它们会停止向已检测到故障的节点发送请求。
b. 故障期间的处理 (Handling During Downtime - Failover)
流量自动重定向:
客户端驱动: 客户端驱动会自动将新的读写请求路由到集群中其他健康的、拥有目标数据副本的节点上。
负载均衡器: 如果有负载均衡器位于数据库集群前端,它会根据健康检查结果停止向故障节点发送流量。
数据可用性保障:
数据复制因子 (Replication Factor, RF): 每份数据都 波斯尼亚和黑塞哥维那 whatsapp 数据库 有多个副本(例如 RF=3),这些副本分布在不同的节点、机架或数据中心。
一致性级别 (Consistency Level, CL): 应用程序 在读写数据时选择一致性级别(例如 QUORUM,即大多数副本)。只要集群中剩余的健康副本数量能够满足这个一致性级别,读写操作就可以继续进行,用户不会察觉到服务中断。
提示移交 (Hinted Handoff):
如果故障节点负责接收某个写入操作的副本,协调器节点不会立即放弃,而是会为该故障节点存储一份写入的“提示”(hint)。
这个提示会被保存在协调器节点的磁盘上,等待故障节点恢复后进行交付。这确保了在节点临时宕机期间的数据写入不会丢失。
2. 节点重启(Restart)和恢复(Recovery)
当宕机的节点被修复(例如,解决软件问题、重启服务)并重新上线时,系统会将其重新整合回集群。

a. 节点重新加入集群
启动与Gossip通信: 节点启动其数据库服务,并重新加入 Gossip 网络,向集群中的其他节点广播其在线状态。
健康检查: 外部监控系统和客户端驱动开始再次对该节点进行健康检查。
b. 数据同步 (Data Synchronization)
这是恢复阶段最关键的部分,确保重启后的节点与其他副本的数据保持一致。

提示移交交付:
集群中存储了针对该节点的“提示”的其他节点(即在该节点宕机期间发生了写入的协调器节点)会主动将这些提示交付给刚刚恢复的节点。这是修复宕机期间数据差异的主要机制。
读修复 (Read Repair):
当客户端发起读取操作时,如果请求涉及到了刚刚恢复的节点(以及其他健康副本),数据库会对比这些副本的数据。如果发现不一致,它会将最新的数据(根据时间戳)推送到恢复的节点上,从而在读操作时触发数据修复。
反熵 (Anti-Entropy) / 手动修复操作 (Repair Operations):
数据库集群会定期或通过运维触发(例如 nodetool repair 命令在 Cassandra 中)运行后台修复进程。
这些进程通过比较数据的 Merkle Trees(一种哈希树结构),可以高效地找出不同副本之间的数据差异,并进行同步,确保所有副本最终达到一致。这是保证长期数据一致性的重要手段。
c. 流量重新引入 (Traffic Re-introduction - Failback)
渐进式引入: 一旦节点被视为健康并已经完成了大部分数据同步(特别是提示移交),负载均衡器和客户端驱动会逐渐开始将流量重新路由到该节点。
受控过程: 这个过程通常是受控的,以避免新恢复的节点立即被过大的流量冲击而再次崩溃。系统会监控新节点的负载和性能,确保其稳定运行后再完全接管流量。
通过这一系列自动化和受控的机制,WhatsApp 能够高效、透明地处理数据库节点的宕机和重启,最大程度地保证了服务的连续性和数据的最终一致性。
Post Reply