Fauna Deep Dive:构建分布式无服务器数据库
#serverless #database #体系结构 #distributedsystems

Fauna数据库体系结构的分布式无服务器性质说明了良好的合成性使现代系统复杂性成为可管理的努力。

今天的无服务器应用程序开发人员从过去的复杂整体系统中学到了许多课程,推动了由微服务构建的可组合系统的普及。这一现实进一步验证了Gall定律,该定律被认为是系统设计的经验法则,由John Gall在1986年的《 Systemantics:系统如何真正工作和失败》中制定。该法律规定:``一个复杂的系统都被发现从一个有效的简单系统中发展出来。的确,当这些无服务器系统组件实现得很好时,它们以一种使人抽象和委派复杂性,以使它们是现代应用体系结构的理想构建块,其中不断发展的复杂性比巨石更容易管理。

始终发现一个复杂的工作系统是从一个有效的简单系统中演变而来的。

当我最近回顾了我们在动物区系的工程师撰写的建筑概述时,我想到了gall的法律。动物区系是一个分布式的无服务器文档关系数据库,作为全局API端点提供,符合简单和复杂的现代应用程序的要求。 here可用的建筑概述概述了其设计的多功能性。工程团队在建设和运营动物领域的工作基于数据库和操作系统的最先进的研究和行业进步,除了多年来获得了丰富的动手运营经验。

随着时间的推移,FAUNA数据库服务进行了严格的战斗测试 - 成千上万的客户创建了数十万个数据库,存储了数十种数据库,并在生产中向该服务发送了数十亿个请求。考虑到多年来在传统操作数据库中分发数据的困难,我相信体系结构概述说明了Fauna的核心体系结构层如何能够创建大规模缩放,复杂和性能的数据库应用程序,同时从有效地从开发人员。

作为一项完全特色的通用数据库服务,动物群的特征平衡了最苛刻的数据库应用程序开发人员所期望的收益,而不会损害传统数据库系统的核心好处。在深入研究其架构之前,我们将简要总结这些特征,以更好地理解基础建筑赋予能力的广泛特征。


FAUNA无服务器数据库:3分钟的底漆

在动物区系的核心是文档相关的数据模型,将JSON文档的灵活性和熟悉度与传统关系数据库的关系和查询能力相结合。动物区系的基本数据构建块是在集合中分组的结构化文档。与传统的关系数据库相比,这些文档等同于行,而集合等同于表。

开发人员可以使用对其他文档的引用来执行跨文档集合的加入。动物索引的行为就像SQL的视图。他们支持在一个或多个文档字段上进行搜索,并定义匹配文档的返回值。返回值可用于执行唯一性约束和匹配文档的顺序。索引可以定义绑定以在索引期间对字段值执行逻辑。像SQL索引一样,动物索引索引比表扫描更好地执行查询。所有查询都明确使用命名索引,而不是在微妙的数据集或查询更改下与可能成为不可预测的优化器进行战斗。

Fauna具有GraphQl端点,该端点提供了执行GraphQl查询的简单方法。 GraphQL模式解析器可以用户定义的功能(UDFS)实现。任何自定义的复杂查询和UDF都可以在本机,功能和图灵完整的FQL(Fauna查询语言)中构造。 FQL的功能性质非常适合构建组合查询;认为这种合成性与将管道用于链接Linux shell命令一样强大。

fauna提供了优雅的选项来保护数据,包括基于用户身份和正在访问的属性(即字段或列)限制访问权限,同时允许将层次结构数据库结构用作额外的许可边界。基本的时间文档版本可以保留在配置的保留期内所有内容。


提供一致性,可用性,耐用性和性能

Calvin交易协议的启发,Fauna与大多数分布式数据库不同,从世界任何地方提供严格的序列化交易。提供严格序列化的交易被广泛认为是数据库的最佳一致性模型,确保所有交易操作(包括子操作)都在原子上进行,并且此特定保证适用于整个系统的背景。

>

>

Fauna一致性模型旨在在全球分布的群集中跨交易的严格序列化,而无需损害可扩展性,吞吐量或读取延迟。所有读写交易都是根据其在全局交易日志中的位置而严格序列化的,因为该顺序反映了实时处理顺序。仅阅读交易是可序列化的,并具有额外的读取您自己的写入(RYOW)保证,这是由驾驶员维持在任何先前交易中观察到的最新逻辑交易时间的高水标记所促进的。

Consistency Models in Databases - provided by Jepsen.io
图。 1。始终如一的分布式数据库系统模型。资料来源:Jepsen.io

所有云提供商都提供可用性区域和区域,使它们能够包含服务中断的爆炸半径。 Fauna在一个地区,一个地区群体以及世界各地的各个区域中复制跨单个区域的数据。无论其他区域还是区域是否可以访问,都可以提供阅读请求。写请求需要大多数区域或部署区域之间的通信才能成功,可以通过区域组中的增加区域进行扩展。

由于计算工作负载越来越多地朝边缘服务器移动,因此应用程序需要访问跨潜伏期较低的广泛地理位置。动物区系通过在多个可用性区域或区域复制数据来实现这一目标。 Fauna的Edge的智能路由层将已发送到API的请求转移到最接近的区域,在该区域无需任何客户端配置即可提供请求。 Fauna通过单个全局API端点公开数据,并由边缘计算提供商固定支持。

根据CAP Theorem中提出的标准,在技术上是一种CP系统,因为在网络分区的情况下,它可以保证以可用性为代价的整个系统的一致性,但它实现了可靠的复制,以最大程度地减少这种效果。在当今的冗余云网络拓扑中,网络分区故障非常罕见,这些网络可确保许多9 s的可用性。由于其能够在区域和地区组之间进行协调,但动物区系不容易受到单个失败的影响。它旨在耐受临时或永久节点不可用,增加节点延迟或隔离区域或区域的网络分区,与其他分布式数据库实现相比,它使其独一无二。

这是通过在区域内或跨区域内复制数据来实现的,以使其更靠近最终用户,并通过最佳路由将请求从入口到数据。即使在完全区域或区域故障的情况下,请求被路由到默认情况下默认情况下的最接近区域或区域。在发送响应之前,必须将写请求复制到日志段中的大多数日志领导者。 Fauna的公共区域组通常显示单位毫秒的延迟,用于基本写入的读取和双位数毫秒延迟。

Fauna的设计具有无状态的计算层,可以在任何时候水平和垂直缩放,而没有故障点。任何区域中的任何查询协调员都可以接收任何请求,并且协调器节点可以与任何其他区域中的日志和数据节点进行通信。公共区域组通常每分钟处理数十万个请求,并在当前硬件上每分钟达到数百万个请求。查询协调层可以迅速缩放以根据需求处理数量级。

Fauna存储引擎实现为压缩log-structured merge (LSM) tree,类似于Bigtable的主要存储引擎。交易分批用于全局交易日志。副本处理日志并在批量上施加相关的写作效果。该模型保持很高的吞吐量,并避免需要积累和分类传入的写作效果。维持原子性,即使在少数族裔节点或复制损失的情况下也保留了数据。由于动物群时间数据模型由不可变的版本组成,因此没有问题的同步覆盖。数据存储中的逻辑布局均在所有节点上分区。文档及其历史记录由主键分区,而索引则由查找术语分区。数据存储中的逻辑布局均在所有节点上分区。文档及其历史记录由主键分区,而索引则由查找术语分区。


动物区系的核心建筑层

Fauna实施Calvin来安排交易并以最小化争议成本以及其他层来协调和实施数据库操作的方式复制数据。保证每个副本都可以看到相同的交易日志,其最终状态是由一一执行所有交易而产生的,最终状态与其他每个复制品相等。动物群的核心功能由四个主要层实现:路由层,查询协调层,事务记录层和数据存储层。在部署的每个区域或区域内,所有层中的所有节点都了解完整的部署拓扑,如果本地节点不响应,则可以将请求转发到其他区域或区域中的节点。下图总结了典型的查询路径,以下段落总结了高级别的请求任务。

How Fauna's architecture handles database requests
图2。 Fauna的建筑层如何处理和/或写数据库请求。

查询和键或令牌是通过客户端的单个全局端点发送的。首先通过高度可用的DNS服务和利用基于延迟的转发来将其接收到最接近区域或区域的节点。路由节点使用密钥路由到正确的区域组。它还可以通过确定大量请求是否需要限制或任何操作超过防御率限制来保护响应时间。

随着请求将其归于查询协调员,因此出现了加尔文协议实施的一些关键好处。该协议通过提前预先计算每个交易的输入和效果来消除对每交易锁的需求。所有协调器节点都是无状态的,并且可以轻松地水平缩放。选择快照时间,是当前时间或请求中指定的时间。通过数据存储节点的值,它可以乐观地执行所有事务操作而无需进行写入。该执行的输出是一组扁平的读取和一组写作,如果没有争议,则应提交。如果没有写信,则目前该请求已完成,通常在非常低的双数毫秒内,整个请求都在非常低的两位数毫秒内完成。

如果要处理撰写文字,则交易记录层会参与顺序并提交它们。如果在本地区域或区域中不可用日志或存储节点,则协调器在其他区域或区域中找到适当的节点。它充当写入日志,是唯一需要交叉补充协调的地方。该日志分为多个跨越复制品的段,并且可以很容易地增加段以加快吞吐量。

每个片段运行Raft共有算法的优化版本。节点被选为领导者,所有非领导节点都向其转发交易。如果目前的领导者无法获得,则会触发新的领导者选举。领导者定期将接收到的交易组装成批处理,以根据可配置的时间间隔称为“时期间隔”提交。领导者与筏环中的其他领导者进行交流,以同意时期的整个交易,批次用筏复制,并且该系统具有足够的信息和副本来声明其交易在乐观的上进行。但是,此时尚未最终应用写作效果。一旦所有日志段都对给定时期进行了各自的交易批次,所有时期的交易都可以用于下游数据存储节点。

应该注意的是,在动物群中不需要实时全局时钟同步来保证正确性。日志节点是唯一生成时期的节点,是唯一发生时钟同步的节点,因此大约在同一时间生成时代。基于Epoch其他,将时间戳应用于每个交易中,该交易反映了实时的毫秒内,及其在其他交易方面的逻辑,严格序列化顺序。

数据存储节点与每个本地日志节点保持持久连接,并在其涵盖的关键范围内收听交易。每个节点都分配了一系列要监视的键。所有数据都存储在每个区域或区域中,每个文档至少存储在三个节点中。存储节点验证交易执行过程中没有值读取的值在执行快照时间和最终提交时间之间发生了变化。他们使用对等节点核对并获得其不涵盖的值状态。如果没有冲突,它涵盖的值将更新;如果有冲突,它将删除交易写作。对数据集有一系列确定性检查,因此所有节点都应用了交易,要么没有任何节点。

应用交易中的书面文档没有被覆盖。取而代之的是,将当前交易时间戳上的新文档版本插入文档历史记录中,以作为创建,更新或删除事件。 Fauna的存储系统支持时间查询,因此所有交易都可以在过去的任何时候始终执行。这对于审核,回滚,缓存相干性和同步与其他系统很有用,并构成了动物隔离模型的基本组成部分。该存储系统还促进了事件流,该活动允许客户在更新文档或集合时订阅通知。

除了这些核心层之外,还存在针对指标,计费,备份/还原,用户身份验证和授权等活动的其他服务,以及类似于Hadoop YARN的通用,拓扑感知的,拓扑感知的,已期刊的任务调度程序。


加起来

当我第一次阅读并理解动物区域的性质时,我立即被这些层的组合(本身都是在经过验证的技术和严格测试的算法和协议之上构建的)所震惊的,仍然可以使整体系统能够使整体系统能够能够能够得以实现。可延展。节点的簇可以在当前云中相对易于缩放,当前提供商的有效网络路径被最大化,并且其许多组件可以以最小的状态至无状态运行,并在适当的内存中进行了优化。它们可以优雅地过渡以利用新的硬件改进。随着这些网络的发展,它们可以利用内容交付网络的新出现点(POP)。

但是,所有这些都被称为无服务器API端点,除了应用程序密钥外,不需要持续的配置即可指示数据库,副本,碎片或任何其他有关数据库分布方式的位置。这种抽象水平使当今的开发人员保持了可组合系统的希望,从而使长期适应,重构和避免技术架构债务变得更加容易。

关于作者

Luis Colon是一位数据科学家,专注于现代数据库应用程序和最佳实践以及其他无服务器,云和相关技术。他目前在Fauna,Inc。担任高级技术传教士。您可以在TwitterReddit@luiscolon1与他联系。