译者|陈军点评|孙淑娟过去十年,分布式系统遍布全球。他们使用跨区域的编排技术来实现跨多个云服务提供商和本地基础设施的混合云部署、负载平衡和高可用性。在此基础上,数据库领域也在不断迭代发展。近年来,业界涌现出一大批为分布式数据库部署而设计的新型数据库系统。当然,有些数据库在原有设计的基础上加入了分布式架构组件。DB-Engines.com排名前100的数据库知名网站DB-engines.com使用加权算法跟踪各种数据库在各个平台上的提及次数、Google的搜索趋势、StackOverflow上的讨论频率、tweets的工作数量发布的技能,以及LinkedIn个人资料出现的次数。下图是截至2022年5月上榜的394个数据库中市场份额排名前100的数据库分布情况。截至2022年5月,在DB-Engines.com排名前100的数据库中,作为传统的SQL系统,关系型数据库管理系统(RDBMS)仍然占比最大,高达47%。25%是NoSQL系统,涵盖类型广泛,包括:MongoDB等文档数据库,Redis等键值系统,ScyllaDB等宽列数据库,Neo4j数据库等图数据库。而11%的“多模型”数据库包括支持同一系统混合使用SQL和NoSQL的数据库(如:微软的CosmosDB和ArangoDB),或者支持多种NoSQL数据模型的数据库(如:DynamoDB、它将自己列为NoSQL键值系统和文件存储的集合)。什么是分布式数据库?人们对如何构建一个符合SQL(正式标准化自ANSI/ISO/IEC9075:2016)的分布式RDBMS系统有不同的理解。目前,ANSI、ISO、IETF或W3C都没有对“NoSQL数据库”做出明确的定义。在我看来,分布式数据库的基本特征是:首先,定义一个集群,不同的数据分布在其中;然后,定义每个节点在集群中的角色。每个节点要么是对等节点,要么部分节点处于领导地位,而其他节点则扮演追随者的角色。然后,这些角色能够相互进行故障转移。最后,他们能够尽可能均匀地复制和分片数据。在此基础上,我们可以从上述top100的数据库中选出5个典型的数据库,将其分为以下两大类:SQL+NewSQLNoSQLPostgreSQLMongoDBCockroachDBRedisScyllaDB(Cassandra)上表左侧,Postgres和CockroachDB代表分布式SQL。其中,被称为“NewSQL”的CockroachDB是为分布式数据库而设计的。上表右侧的MongoDB、Redis、ScyllaDB都是分布式NoSQL。一般来说,如果需要表联合(JOIN)操作,可以继续使用SQL和RDBMS。如果您需要对数据进行非规范化,NoSQL是您的选择。多数据中心集群前面提到了集群的概念。早在多数据中心设计架构提出之前,PostgreSQL、MongoDB、Redis都被设计为单数据中心的本地集群。如上表所示,1986年首次推出的Postgres,完全早于云计算的概念。但随着时间的推移,它在设计和功能方面经历了相当多的改进。作为NewSQL的代表,CockroachDB在设计之初就考虑了全局分布。公有云诞生之初就发布了MongoDB。它最初的设计只考虑了单个数据中心集群,现在它增加了对各种拓扑结构的支持。使用MongoDBAtlas,您可以非常轻松地在多个区域部署它。根据低延迟的设计理念,Redis通常部署在单个数据中心。同时,它还提供允许部署多个数据中心的企业特性。ScyllaDB与Cassandra一样,在设计之初就考虑到了多数据中心部署。集群在分布式数据库的概念中,我们提到了复制和分片。这完全取决于您的数据库模式的层次结构或同构程度。比如MongoDB只有一个master节点,其余都是master节点的副本(称为副本集)。您只能写入主节点上的数据库。并且因为副本是只读的,你不能直接更新它们,master必须更新其他副本。显然,这些节点是异构的,而不是同质的。这种类型的主副本架构有助于在读取密集型工作负载之间分配流量。在混合或写入繁重的工作负载中,主节点成为瓶颈。也就是说,当主节点发生故障时,数据库将不得不暂停写入操作,因为集群需要临时选举一个新的主节点。这就是所谓的单点故障。相比之下,ScyllaDB和Cassandra是“无领导”的P2P双活(Active-Active)系统。由于客户端可以读取或写入任何同类节点,因此避免了单点故障。也就是说,每个节点都可以更新集群中任何其他副本的数据。可以看出,虽然多活会带来更多的计算量,但是解决了服务器之间保持同步的问题。用户最终会得到一个适合重写的负载均衡系统,毕竟每个节点都可以提供读写服务。下面我们来看看以上五种数据库在主副本和P2P多活方面的表现:CockroachDB和ScyllaDB(还有Cassandra)都是按照多活模式设计的。Postgres需要一些外部方法来实现多活,而不是内置的。MongoDB不支持多活。在Redis企业版中,我们可以使用无冲突复制数据类型(CRDT)来实现多活模式。注意,Postgres、MongoDB、Redis都默认使用主副本的数据分布方式。复制分布式系统设计还会影响数据在已部署的不同机架或数据中心之间的分布方式。例如,在给定的主副本系统中,只有拥有主节点的数据中心才能提供任何写入负载。其他数据中心只能作为只读副本。在支持多数据中心集群的对等系统中,整个集群中的每个节点都可以接受读取或写入负载。显然,这使得跨多个地理位置分布工作负载变得更加容易。例如,通过使用ScyllaDB,您可以确定每个站点具有相同甚至不同的复制因子。在上图的右侧,我们展示了一种情况,我们在一个数据中心有三份数据,在另一个数据中心有两份数据。不同级别的操作将具有一致性。您可能在具有三个节点的数据中心中进行本地“仲裁”读取或写入(即:三个节点中的哪两个需要通过本地仲裁进行更新)。当然,您也可以有一个集群范围的仲裁来决定一个或两个数据中心中的任何三个节点需要更新。拓扑感知我们已经研究了分布式数据库的本地集群方法,它有效地允许多个系统分担负载。您还可以跨多个地理节点对数据库进行分片,或者通过确保相同数据在多个节点上的高可用性来确保数据复制。接下来我们假设一个场景:如果你所有的节点都安装在同一个机架上,整个机架出现故障怎么办?这时候,我们就需要在同一个数据中心利用机架拓扑感知,保证数据分布到数据中心的多个机架上,从而最大限度地减少整个机架因断电或网络中断而造成的损失。失去与另一个机架的连接。在分布式数据库中,我们需要数据库的多个副本运行在不同的数据中心,以实现跨集群的更新机制。每个单独的数据库都可以自主运行,它们的同步机制可以是单向的(数据中心更新下游副本)、双向或多向的。这种地理分布允许尽可能靠近用户连接,从而最大限度地减少延迟,从而确保用户在发生单个数据中心灾难时不会丢失部分或全部数据。下面我们来看看以上五种数据库在拓扑感知方面的表现:CockroachDB和ScyllaDB都内置了拓扑感知特性。MongoDB自2015年以来引入了拓扑感知。Postgres和Redis最初设计为单数据中心解决方案。虽然它不是开箱即用的,但您可以手动添加拓扑感知服务,例如添加多活动功能。下面,我们根据上述分布式特点,对五种数据库的属性进行总结和比较。PostgreSQLPostgres是当今最流行的SQL实现之一。它提供开箱即用的本地集群。但是,由于Postgres仍在努力完善其多数据中心集群,因此您需要进行额外的配置和开发才能实现。由于SQL建立在高度一致的事务模式之上,因此它不适合广泛跨越地理区域的集群。所有相关数据中心之间的长时间延迟都会放大每个查询。同时,Postgres依赖于主副本模型。集群中的主节点和副本节点之间存在关系。您还可以添加额外的负载平衡器或多活动附加组件。此外,Postgres虽然在自动分片方面取得了一些进步,但仍然需要用户手动分片数据。作为“NewSQL”的CockroachDBCockroachDB不仅使用Postgres有线协议,而且还大量借鉴了Postgres首创的许多概念。当然,它不限于Postgres架构。例如:内置多数据中心集群和点对点无领导拓扑。此外,CockroachDB不仅具有自动分片和数据复制功能,还内置数据中心感知能力,您可以添加机架感知根据需要发挥作用。值得注意的是,由于CockroachDB要求所有事务高度一致,用户失去了最终一致性或可调一致性(TunableConsistency)的灵活性。这不仅会降低吞吐量,还会在跨数据中心的任何部署中造成高基线延迟。MongoDB作为NoSQL的典型代表,开发了很多分布式数据库功能。例如,它已经具备集群多个数据中心的能力。虽然MongoDB在大多数情况下仍然需要遵循主从模式,但部分用户可以通过第三方工具实现P2P多活模式。Redis作为典型的“键值对”存储的数据库,旨在实现内存缓存或数据存储。虽然它可以持久化数据,但是如果数据集放不下内存,会大大降低性能。Redis在设计时默认考虑了本地集群。这导致,例如:一旦你无法在5毫秒内从SSD获取数据,你就无法在145毫秒内完成从旧金山到伦敦的网络传输往返时间。当然,对于那些真正需要多区域分布式存储的企业,还是会在多数据中心搭建Redis集群。同时,由于Redis倾向于以主副本模式运行,因此更适用于读取量大的缓存服务器。也就是说,它需要先写入数据,然后分布在副本之间以平衡它们的缓存负载。Redis的企业功能可以实现P2P多活集群。同时,Redis可以自动对数据进行分片和复制。然而,其拓扑感知仅限于具有企业特性的机架感知。ScyllaDBScyllaDB是根据ApacheCassandra的分布式数据库模型设计的。默认情况下,它带有一个无领导的全活动拓扑中的多数据中心集群。ScyllaDB自动分片并为每个操作提供可调的一致性。如果您想要更强的一致性,它还支持轻量级事务并提供写入的线性化能力。在拓扑感知方面,ScyllaDB支持机架感知和数据中心感知。它甚至支持令牌感知和分片感知。ScyllaDB不仅可以知道将数据存储在哪个节点上,还可以获知与数据相关的CPU信息。小结上面我们分析了五个著名的分布式数据库系统。其中,CockroachDB为SQL数据库提供了开箱即用的特性和属性的综合组合,而ScyllaDB为NoSQL系统提供了全面的功能。目前,分布式数据库还在迭代和完善中。它们变得更加灵活、更具可扩展性和性能。译者介绍51CTO社区编辑JulianChen。他在实施IT项目方面拥有超过十年的经验。善于控制内外部资源和风险。他专注于传播网络和信息安全方面的知识和经验。翻译等形式分享前沿技术和新知识;经常在线上和线下开展信息安全培训和讲座。原标题:ComparingDistributedDatabases,作者:PeterCorless
