← 返回信息流
AI 资讯Hacker News·2 小时前

Cloudflare Meerkat - Globally distributed consensus

AI 深度解读

背景

Cloudflare 在全球运营着超过 330 个数据中心,许多内部服务需要跨这些数据中心读取和修改同一份控制平面状态。这些服务必须保证:不同读取者永远不会看到不一致的状态,并且在部分数据中心或网络链路故障时,系统仍能接受写入操作。

然而,Cloudflare 的网络运行在互联网之上,而互联网是一个不可预测的环境。服务器和数据中心可能宕机,队列可能填满,链路和光缆可能被切断。这些恶劣条件使得构建一个保证强一致性(例如,所有读取者都能读到所有先前的写入)的全局可用数据系统变得非常困难,因为网络故障会阻碍分布式系统副本之间可靠地同步数据。

一种在不利网络条件下安全同步数据的方法是使用共识算法。共识算法允许一组机器就相同的值序列达成一致(例如键值存储的 put 和 get 操作),只要多数机器保持存活并能相互通信。但不幸的是,像 Raft 这样广泛部署的共识算法在 Cloudflare 这样的广域网中表现不佳,因为它们依赖领导和超时机制。领导是唯一允许执行写入的副本,如果领导因崩溃或网络退化而失效,系统将变得不可用,直到其他副本超时并选举出新的领导。而在延迟不可预测的网络中,这些超时值很难配置。Cloudflare 曾经历过多次因共识驱动系统中的领导不可用而导致的事故。

因此,在过去一年里,Cloudflare 研究团队构建了一个名为 Meerkat 的新型分布式共识服务,其底层使用由 EPFL 研究人员在 2023 年发布的 QuePaxa 共识算法。QuePaxa 与 Raft 的不同之处在于:所有副本随时都可以执行写入,并且不会因为超时而停止进展,这使其非常适合 Cloudflare 的网络。Meerkat 在共识日志之上层叠了事务性键值存储和租约系统等应用。据 Cloudflare 所知,这将是 QuePaxa 首次在全球范围内的工业部署。

Meerkat 目前仍处于开发阶段,是一个实验性共识服务。它最初的设计目标是管理小规模的控制平面状态(例如,复制数据库的领导权),因此在短期内将仅限内部使用。本文旨在介绍 Meerkat,并为后续相关博客文章奠定基础。

核心内容

全局控制平面数据系统的需求

Cloudflare 的许多服务需要从分布在全球各地的多台机器上读写控制平面数据——这些数据帮助服务正确运行。控制平面数据的例子包括:放置信息(如某 AI 模型实例存储在何处)和领导信息(当前允许对数据库执行写入的机器)。控制平面数据必须同时满足强一致性和在特定故障下的可访问性。

强一致性

分布式数据系统的一致性级别描述了系统在收到并发读写时允许表现出的异常行为。例如,考虑一个分布式键值存储,它在多个节点上存储单一数值 x = 6,并依次提交以下写入操作(这些写入可能被发送到不同节点,且到达顺序不定):

  • x = x + 1
  • x = x / 2

一致性级别决定了客户端在这些写入后读取 x 时可能看到的值。在弱一致性下,写入可以重排序;在更强的一致性模型下,写入不能重排序,但读取可以;在最强的线性化(linearizability)一致性下,操作严格按照实时时间顺序执行。Cloudflare 的许多服务希望得到线性化保证。与弱一致性相比,线性化让程序员无需考虑数据系统可能表现出的各种奇怪行为,他们可以像在单线程机器上推理本地内存一样推理分布式系统:写入之后的所有读取都会看到该写入。

(Meerkat 的键值存储还提供了可串行化(serializability),这将在未来的文章中讨论。)

容错性

系统的容错级别描述了在发生灾难性故障之前系统能够处理哪些故障。灾难通常指系统试图维护的属性被违反,例如:同一键在没有写入的情况下两次连续读取看到不同值,或者系统不再能接受写入。故障包括网络故障/延迟、机器崩溃和机器重启。系统通常会显式处理某些故障,而忽略其他故障。

Cloudflare 期望的容错属性如下:

  1. 可用性:只要系统中有多数机器存活并能相互通信,并且客户端可以联系到系统中任何一台与多数存活机器相连的机器,那么从任何数据中心发出的客户端读写请求都应被处理。这意味着单台机器故障或单条链路退化不会影响系统可用性。Raft 系统无法提供这一属性。
  2. 正确性:只要系统内没有恶意行为者(且没有软件 bug),系统就保持正确。正确性基于共识安全定义,大致意味着没有两个最新的机器会对世界状态产生分歧(例如,一台认为 key1=1,另一台认为 key1=2)。

总结:系统必须在机器崩溃、重启、网络故障或退化、数据中心宕机等情况下保持正确(但像 Raft 系统一样,Meerkat 不处理拜占庭故障)。

Meerkat 介绍

Meerkat 是一个共识服务,可在其上构建具备上述属性(强一致性和容错性)的应用,例如键值存储。Meerkat 的工作方式如下:

  • 使用 Meerkat 的服务开发者请求一个 Meerkat 副本集群。每个副本与其他所有副本相连。
  • 每个副本都参与共识算法,并且可以接收读写请求。
  • 开发者可以指定允许托管其副本的数据中心,Meerkat 会自动放置副本。
  • 开发者客户端向集群中任意副本发送应用特定的请求(例如键值存储的 put/get)。每个副本可以托管多种应用,但最简单的应用是键值存储。

Meerkat 的核心创新在于其底层的 QuePaxa 共识算法。与 Raft 依赖领导和超时不同,QuePaxa 允许所有副本在任何时候都执行写入,且进展永远不会因超时而停止。这使得 Meerkat 在广域网中能够保持高可用性,避免了 Raft 因领导不可用而导致的长时间不可用问题。

关键要点

  • Raft 等传统共识算法在广域网中因依赖领导和超时机制,领导故障会导致系统不可用,且超时参数难以配置。
  • Cloudflare 曾多次遭遇因共识驱动系统中领导不可用导致的事故,因此研究团队构建了 Meerkat。
  • Meerkat
查看原文 →blog.cloudflare.com