过去十年见证了完全分布式数据库的兴起。不仅仅是本地集群来实现基本负载平衡和提供高可用性——具有数据中心内的机架感知等属性。真正的分布式系统,可以跨越全球,设计用于在公共云中工作——跨可用区、区域,并使用编排技术,甚至跨多个云提供商和本地混合云部署。
同样,在过去的十年中,出现了大量专为分布式数据库部署而设计的新数据库系统,以及在其原始设计中添加了分布式架构组件的其他数据库系统。
DB-Engines.com 100 强数据库
对于从未访问过该站点的每个人,我想提请您注意 DB-engines.com 。它是数据库的“广告牌图表”。它保留了您可以想象的所有数据库的粗略流行指数,使用一种算法进行加权,该算法跟踪网站上的提及次数和 Google 搜索趋势、Stack Overflow 上的讨论或推文中的提及、要求的职位发布这些技术技能,以及在他们的 LinkedIn 个人资料中按名称提及这些技术的个人资料的数量。
截至 2022 年 5 月,DB-Engines.com 上排名前 100 的数据库
虽然它跟踪了数百个不同的数据库(截至 2022 年 5 月共有 394 个),但让我们缩小范围,只查看前 100 个列表。它揭示了很多关于当前市场状况的信息。
关系数据库管理系统 (RDBMS),传统的 SQL 系统,仍然是最大的类别:47% 的列表。
另外 25% 是 NoSQL 系统,涵盖多种不同类型:像 MongoDB 这样的文档数据库、像 Redis 这样的键值系统、像 ScyllaDB 这样的宽列数据库以及像 Neo4j 这样的图形数据库。
还有一个相当大的数据库块 (11%) 被列为“多模型”。其中包括在同一系统中同时支持 SQL 和 NoSQL 的混合体(例如 Microsoft Cosmos DB 或 ArangoDB)或支持多种 NoSQL 数据模型的数据库,例如 DynamoDB,它将自己列为 NoSQL 键值系统和一个文件存储。
最后,还有一些由各种专用数据库组成的饼图,从搜索引擎到时间序列数据库,还有一些不容易归入简单的“SQL 与 NoSQL”划分的部分。
但是所有这些顶级数据库都是“分布式”数据库吗?这个词到底是什么意思?
什么定义了分布式数据库?
SQL 根据 ANSI/ISO/IEC 9075:2016 正式标准化。六年没变。但随着时间的推移,人们如何构建符合 SQL 的分布式 RDBMS 系统发生了变化。那些继续发展。分布式 SQL,例如 PostgreSQL。或“NewSQL”系统,例如 CockroachDB。
相反,没有 ANSI、ISO、IETF 或 W3C 对“NoSQL 数据库”的定义。每个都是专有的,或者充其量使用一些事实上的标准,例如用于宽列 NoSQL 数据库的 Cassandra 查询语言 (CQL),或者说,用于图形数据库的 Gremlin/Tinkerpop 查询方法。
然而,这些只是查询协议。他们没有定义数据如何在这些数据库中分布。这是一个架构问题,查询语言不会也不会解决。
因此,无论是 SQL 还是 NoSQL,对于什么是“分布式数据库”都没有标准、协议或共识。
因此我花了一些时间来写下我自己的定义。我会坦率地承认,这更像是外行的务实观点,而不是计算机科学教授的观点。
简而言之,您必须决定如何定义集群,并在其中分布数据。
接下来,您必须确定集群中每个节点的角色。是每个节点都是对等节点,还是一些节点处于更优越的领导位置而其他节点是更多的追随者。
然后,基于这些角色,你如何处理故障转移?
最后,您必须在此基础上弄清楚如何尽可能均匀、轻松地复制和分片数据。
这并不是要详尽无遗。您可以添加自己的特定标准。
短名单:感兴趣的系统
因此,考虑到所有这些,让我们进入我们的前 100 名并找到五个示例,看看它们在与这些属性进行衡量时的比较情况。我选择了两个 SQL 系统和三个 NoSQL 系统。
SQL + 新SQL | NoSQL |
PostgreSQL | MongoDB |
CockroachDB | Redis |
ScyllaDB(卡桑德拉) |
Postgres 和 CockroachDB 代表了最好的分布式 SQL。CockroachDB 被称为“NewSQL”——专为分布式数据库世界而设计。
MongoDB、Redis 和 ScyllaDB 是我对分布式 NoSQL 的选择。首先以文档数据库为例。第二个作为键值存储,ScyllaDB 作为宽列数据库——也称为“键-键-值”数据库。
另请注意,在大多数情况下,对于 ScyllaDB 而言,在许多情况下,对于Apache Cassandra和其他与 Cassandra 兼容的系统也是如此。
我向所有没有选择最喜欢的系统的人道歉。但是我希望,如果您有另一个系统,您可以将我们对这些系统的说法与您想到的其他系统进行比较。
现在,我假设您已经有专业经验,并且您对SQL 与 NoSQL的区别有所了解。基本上,如果您需要一个表 JOIN,请坚持使用 SQL 和 RDBMS。如果您可以对数据进行非规范化,那么 NoSQL 可能是一个不错的选择。我们不会争论作为一种数据结构或查询语言是否“更好”。我们在这里看看这些中的任何一个作为分布式数据库是否更好。
多数据中心集群
让我们看看我们的选项在聚类方面的比较。现在,它们都能够进行集群甚至多数据中心操作。但在 PostgreSQL、MongoDB 和 Redis 的情况下——这些设计早于多数据中心设计作为架构要求。它们最初是在单数据中心本地集群的世界中设计的。
Postgres 于 1986 年首次发布,完全早于云计算的概念。但随着时间的推移,它演变为允许将这些进步和功能固定在其设计中。
CockroachDB 是 NewSQL 革命的一部分,在设计之初就考虑到了全球分布。
MongoDB 是在公有云诞生之初发布的,最初设计时考虑了单个数据中心集群,但现在增加了对相当多不同拓扑的支持。使用 MongoDB Atlas,您可以非常轻松地部署到多个区域。
Redis,由于其低延迟的设计假设,通常部署在单个数据中心上。但它具有允许多数据中心部署的企业功能。
ScyllaDB 和 Cassandra 一样,从一开始就在设计时考虑了多数据中心部署。
聚类
您如何进行复制和分片还取决于您的数据库架构的分层或同构程度。
例如,在 MongoDB 中,只有一个主服务器;其余的是该主节点的副本。这被称为副本集。您只能写入数据库的这个主副本。副本是只读的。您不能直接更新它们。相反,您写入主数据库,它会更新副本。所以节点是异构的;不是同质的。
这有助于在读取繁重的工作负载中分配流量,但在混合或写入繁重的工作负载中,它对您一点好处都没有。主节点可能会成为瓶颈。
同样,如果主节点出现故障会发生什么?在集群选出一个新的主节点之前,您必须完全暂停写操作,然后将写操作分流给它。这是一个令人担忧的单点故障。
相反,如果您查看 ScyllaDB、Cassandra 或任何其他无领导的点对点系统——这些被称为“主动-主动”,因为客户端可以读取或写入任何节点。没有单点故障。节点更加同质。
每个节点都可以并且将更新集群中数据的任何其他副本。因此,如果您的复制因子为 3 和三个节点,则每个节点都将根据对其他两个节点的任何写入进行更新。
主动-主动在计算上更难进行,但是一旦你解决了服务器如何保持彼此同步的问题,你最终会得到一个可以更好地平衡混合或写入繁重工作负载的系统,因为每个节点都可以提供读取服务或写。
那么,关于主副本或主动-主动点对点,我们的各种示例如何叠加?
CockroachDB 和 ScyllaDB(以及 Cassandra)从对等主动-主动设计开始。
而在 Postgres 中有一些可选的方法可以做到这一点,但它不是内置的。
此外,MongoDB 不正式支持主动-主动,但在如何做到这一点上有一些尝试。
借助 Redis,可以在 Redis Enterprise 中使用无冲突的复制数据类型(CRDT)实现主动-主动模型。
否则,Postgres、MongoDB 和 Redis 都默认使用主副本数据分布模型。
复制
分布式系统设计还会影响您在已部署到的不同机架或数据中心之间分配数据的方式。例如,给定一个主副本系统,只有具有主副本的数据中心才能服务于任何写入工作负载。其他数据中心只能作为只读副本。
在支持多数据中心集群的对等系统中,整个集群中的每个节点都可以接受读取或写入。这允许更好的地理工作负载分布。
例如,使用 ScyllaDB,您可以决定每个站点具有相同甚至不同的复制因子。在这里,我展示了在一个数据中心拥有三个数据副本并在另一个数据中心拥有两个副本的可能性。
然后操作可以具有不同级别的一致性。您可能在三节点数据中心进行本地仲裁读取或写入 - 需要为本地仲裁更新三个节点中的两个。或者,您可能有一个集群范围的仲裁,需要更新一个或两个数据中心中的任意三个节点才能成功执行操作。可调一致性与多数据中心拓扑感知相结合,基本上为您提供了更大的灵活性来自定义工作负载。
拓扑感知
本地集群是分布式数据库开始的方式,允许多个系统分担负载。如果您想允许跨多个节点对数据库进行分片,或者如果您想通过确保相同数据在多个节点上可用来获得高可用性来复制数据,这一点很重要。
但是,如果您的所有节点都安装在同一个机架中,并且如果该机架出现故障,那就不好了。因此添加了拓扑感知,以便您可以感知同一数据中心内的机架。这可确保您将数据分布在该数据中心的多个机架中,从而最大限度地减少电源或连接中断到一个机架或另一个机架时的中断。这是您想要的最简单的拓扑感知形式。
一些数据库做得比这更好,并允许数据库的多个副本在不同的数据中心运行,并具有某种跨集群更新机制。这些数据库中的每一个都是自主运行的。它们的同步机制可以是单向的——一个数据中心更新下游副本——也可以是双向的或多向的。
这种地理分布可以通过允许更靠近用户的连接来最小化延迟。跨可用区或区域跨越数据库还可以确保没有单个数据中心灾难意味着您丢失了部分或全部数据库。这实际上发生在去年我们的一位客户身上,但由于他们部署在三个不同的数据中心,他们丢失了零数据。
跨集群更新最初是在一种粗略的批量级别上实现的。确保您的数据中心每天至少同步一次。啊。这并没有削减它很长时间。因此人们开始确保更活跃的事务级更新。
问题是,如果你运行的是强一致性数据库,你会受到光速实时传播延迟的限制。因此,实现了最终一致性以允许多数据中心、每个操作更新,同时理解和权衡在短期内,您的数据可能需要一段时间才能在所有数据中心之间保持一致。
那么我们的样本在拓扑意识方面是如何叠加的呢?
因此,CockroachDB 和 ScyllaDB 是内置的。
拓扑意识也从大约 2015 年开始成为 MongoDB 的一部分。所以,不是自 2009 年推出以来,但他们肯定有多年的经验。
Postgres 和 Redis 最初被设计为单数据中心解决方案,因此处理多数据中心延迟对于两者来说都是一种反模式。现在,您可以添加拓扑感知,就像您可以添加主动-主动系统功能一样,但它并不是开箱即用的。
因此,让我们通过单独查看这些数据库与这些属性来回顾我们已经讨论过的内容。
PostgreSQL
“Postgres”是当今最流行的 SQL 实现之一。它提供开箱即用的本地集群。
但是,据我所知,Postgres 仍在致力于其跨集群和多数据中心集群。您可能需要付出一些努力才能使其正常工作。
由于 SQL 建立在高度一致的事务性思维模式之上,因此它不适合跨越广泛地理区域的集群。每个查询都会被所有相关数据中心之间的长延迟延迟所阻碍。
此外,Postgres 依赖于主副本模型。集群中的一个节点是领导者,其他节点是副本。虽然它有负载均衡器,或者主动-主动附加组件,但它们也超出了基本产品的范围。
最后,Postgres 中的分片在很大程度上仍然是手动的,尽管他们在开发自动分片方面取得了进展,这再次超出了基础产品。
CockroachDB
CockroachDB 自称是“NewSQL”——一个专为分发而设计的 SQL 数据库。这是一个设计为可生存的 SQL。由此得名。
请注意,CockroachDB 使用 Postgres 有线协议,并大量借鉴了 Postgres 开创的许多概念。然而,它并不局限于 Postgres 架构。
多数据中心集群和对等无领导拓扑从一开始就内置。
自动分片和数据复制也是如此。
它内置了数据中心感知功能,您也可以添加机架感知功能。
CockroachDB 的唯一警告——你可能将其视为优势或劣势——是它需要所有事务的高度一致性。您没有最终一致性或可调一致性的灵活性。这将降低吞吐量并在任何跨数据中心部署中需要高基线延迟。
MongoDB
MongoDB 是 NoSQL 包中令人尊敬的领导者。因此,随着时间的推移,它开发了许多分布式数据库功能。它距离它的起源还有很长的路要走。现在 MongoDB 能够进行多数据中心集群。它在大多数情况下仍然遵循主副本模型,但有一些方法可以使其成为点对点主动-主动。
Redis
接下来是 Redis,一种键值对存储,旨在充当内存缓存或数据存储。虽然它可以持久化数据,但如果数据集不适合 RAM,它会遭受巨大的性能损失。
因此,它的设计考虑了本地集群。因为如果您无法等待 5 毫秒从 SSD 获取数据,您可能无法等待 145 毫秒来完成从旧金山到伦敦的网络往返时间。
但是,对于那些确实需要地理分布的人来说,有些企业功能确实允许多数据中心 Redis 集群。
Redis 在很大程度上作为主副本模型运行。这适用于读取繁重的缓存服务器。但这意味着主要是需要首先写入数据的位置,然后将其扇出到副本以帮助平衡它们的缓存负载。
有一个企业功能允许点对点主动-主动集群。
Redis 会自动分片和复制数据,但它的拓扑感知仅限于作为企业特性的机架感知。
ScyllaDB
最后我们来到了 ScyllaDB。它是按照 Apache Cassandra 中的分布式数据库模型设计的。因此,默认情况下,它带有多数据中心集群。无领导的主动-主动拓扑。
它会自动分片并为每个操作提供可调的一致性,如果您想要更强的一致性,它甚至支持轻量级事务以提供写入的线性化。
就拓扑感知而言,ScyllaDB 当然支持机架感知和数据中心感知。它甚至支持令牌感知和分片感知,不仅可以知道将存储哪个节点数据,还可以知道与该数据关联的 CPU。
结论
虽然没有关于什么是分布式数据库的行业标准,但我们可以看到许多领先的 SQL 和 NoSQL 数据库在某种程度上支持一组核心特性或属性。其中一些功能是内置的,还有一些被认为是增值包或第三方选项。
在本文分析的五个示例分布式数据库系统中,CockroachDB 为 SQL 数据库提供了开箱即用的特性和属性的最全面组合,而 ScyllaDB 为 NoSQL 系统提供了最全面的组合。
该分析应被视为时间点调查。鉴于下一个技术周期的无情需求,这些系统中的每一个都在不断发展。数据库即服务产品。无服务器选项。弹性。该行业并未停滞不前。
对用户来说,好消息是,分布式数据库每年都在取得更多进步,使它们变得更加灵活、性能更高、弹性和可扩展性更高。
文章来源:https://dzone.com/articles/comparing-distributed-databases