当前位置: 首页 > 科技观察

几种分布式数据库的比较

时间:2023-03-13 23:57:28 科技观察

过去十年见证了分布式数据库的兴起。它不仅通过本地集群实现负载均衡,提供高可用性,还具有数据中心机架感知等属性。专为云设计的分布式数据库可以跨可用区,通过编排技术支持公有云、私有云和混合云部署。近年来,专为分布式数据库部署而设计的新数据库系统不断涌现,而其他系统则在其初始设计中添加了分布式架构组件。DB-Engines.comTop100DatabasesDB-Engines.com是数据库领域的权威排行榜,它为所有数据库保留一个流行指数,使用算法加权,监控网站和谷歌搜索中的提及次数趋势、StackOverflow上的讨论或Twitter上的评论、职位所需的技术技能,以及LinkedIn个人资料中提及这些技术的次数。截至2022年5月,DB-Engines.com上的前100个数据库而DB-Engines收集了数百个不同的数据库(截至2022年5月,总共394个)。但在本文中我们缩小范围,只观察前100个数据库。在很大程度上,它反映了当前的市场状况。关系数据库管理系统(RDBMS),传统的SQL系统,仍然是最大的类别,占列表的47%。此外,25%的榜单是NoSQL系统,涵盖了MongoDB文档数据库、Redis键值系统、ScyllaDB宽列数据库、Neo4j图数据库等多种不同类型的数据库。另有11%被归类为多模型数据库,包括在同一系统中同时支持SQL和NoSQL的混合数据库,例如Microsoft的CosmosDB或ArangoDB,或支持多种NoSQL数据模型的数据库,例如DynamoDB,其中Columns是NoSQL键值系统和文档存储。最后,还有一些由各种专用数据库组成,从搜索引擎到时间序列数据库,还有一些不容易落入简单的“SQL与NoSQL”区域。但是这些数据库都是分布式数据库吗?这个词到底是什么意思?分布式数据库定义2016年12月14日,ISO/IEC发布了最新版数据库语言SQL标准(ISO/IEC9075:2016)。随着时间的推移,如何构建与SQL兼容的分布式RDBMS系统已经发生了变化。分布式SQL,例如PostgreSQL或CockroachDBNewSQL系统。相比之下,没有关于什么是NoSQL数据库的ANSI、ISO、IETF或W3C定义。每个数据库都使用自己专有的查询语言,例如用于宽列NoSQL数据库的Cassandra查询语言(CQL),以及用于图数据库的Gremlin/Tinkerpop查询方法。然而,它们并没有定义数据在这些数据库中是如何分布的,查询语言也没有解决架构问题。因此,无论是SQL还是NoSQL,对于什么是分布式数据库,都没有标准、约定或共识。所以,我花了一些时间写下我自己的定义。坦率地说,这更像是外行人的实用主义观点,而不是计算机科学教授的观点。简而言之,您必须决定如何定义集群以及如何跨集群分布数据。接下来,您必须确定集群中每个节点的角色。是不是每个节点都是peer,或者是有的节点处于上级leader位置,有的节点是follower。然后,基于这些角色,您如何处理故障转移?最后,您必须以此为基础,弄清楚如何尽可能均匀、轻松地复制和分片数据。虽然这并非详尽无遗,但您可以添加自己的特定条件。候选名单:感兴趣的系统考虑到这一点,我在排名前100的数据库中找到了五个示例,并查看了它们在测量属性时的比较情况。有两个SQL系统和三个NoSQL系统。Postgres和CockroachDB代表了最好的分布式SQL。CockroachDB称为NewSQL,专为分布式数据库而设计。MongoDB、Redis、ScyllaDB是分布式NoSQL,是文档数据库、key-value存储、宽列数据库(也叫key-value数据库)。在大多数情况下,适用于ScyllaDB的东西也适用于ApacheCassandra和其他Cassandra兼容系统。假定您具有专业经验并且对SQL和NoSQL之间的区别有相对的了解。基本上,如果您需要表JOIN,请坚持使用SQL和RDBMS。如果您可以对数据进行反规范化,那么NoSQL可能是一个不错的选择。我们不打算讨论作为数据结构或查询语言哪个“更好”。相反,讨论哪个作为分布式数据库更好。多数据中心集群我们的选项在集群方面如何比较?现在,它们都能够进行集群,甚至是多数据中心操作。但在最初为单数据中心本地集群设计的PostgreSQL、MongoDB和Redis中,它早在多数据中心设计之前就成为了架构需求。Postgres于1986年首次发布,远早于云计算的概念。后来,它允许将这些技术和功能纳入其设计中。作为NewSQL革命的一部分,CockroachDB从一开始就考虑到全球分布。MongoDB在公共云初期发布,最初设计时考虑的是单数据中心集群,但现在增加了对许多不同拓扑的支持。借助MongoDBAtlas,可以轻松部署到多个区域。Redis由于其低延迟设计,通常部署在单个数据中心,但它具有允许多数据中心部署的企业特性。与Cassandra一样,ScyllaDB是从头开始构建的,考虑了多数据中心部署。集群管理如何执行复制和分片取决于数据库架构的分层或同质性程度。比如在MongoDB中,只有一个master,其余都是master的副本。副本是只读的,只能写入数据库的主副本,不能直接更新。相反,您写入主服务器并更新副本。因此,节点是异构的,而不是同质的。这有助于在读取繁重的工作负载中分配流量,但在混合或写入工作负载中,它对您没有任何好处,主服务器可能成为瓶颈。同样,如果master失败了怎么办?您必须完全停止写入,直到集群选出一个新的主服务器并卸载对其的写入。相反,如果是ScyllaDB或Cassandra,或任何其他非双活系统,客户端可以从任何节点读取或写入。没有单点故障,节点更加均匀。每个节点都可以更新集群中的任何数据副本。因此,如果您有三个节点,则每个节点都将根据来自其他两个节点的任何写入进行更新。active-active本质上在计算上更困难,但是一旦你解决了服务器保持彼此同步的问题,你就会得到一个更好地平衡混合或写入繁重工作负载的系统,因为每个节点都可以为服务提供读取或写入服务。那么我们的各种示例在主副本或主动-主动对等方方面如何叠加?CockroachDB和ScyllaDB,以及Cassandra从一开始就在设计时考虑到了主动-主动。在Postgres中,有一些可选的方法可以做到这一点,但它不是内置的。此外,MongoDB并未正式支持主动-主动,但已经有人试图弄清楚如何做到这一点。对于Redis,主动-主动模型是通过无冲突复制数据类型(CRDT)在RedisEnterprise中实现的。Postgres、MongoDB和Redis都默认使用master-copy数据分布模型。复制分布式系统设计还会影响数据如何跨部署分布到不同的机架或数据中心。例如,给定一个主副本系统,只有主数据中心的数据中心可以处理任何写入工作负载,而其他数据中心只能作为只读副本。在支持多数据中心集群的对等系统中,整个集群中的每个节点都可以接受读或写操作。使用ScyllaDB,您可以决定为每个站点设置相同甚至不同的复制因子。在这里,我展示了在一个数据中心拥有三个副本,在另一个数据中心拥有两个副本的可能性。操作可以具有不同级别的一致性。您可能正在三节点数据中心进行本地数据读取或写入,您需要更新任何数据中心的节点才能成功执行操作。可调整的一致性与多数据中心拓扑感知相结合,为工作负载提供了更大的灵活性。拓扑感知本地集群是分布式数据库的启动方式,允许多个系统共享负载。如果您希望数据库跨多个节点进行分片,或者通过确保相同数据在多个节点上可用来实现高可用性,这一点很重要。如果所有节点都安装在同一个机架上,那么如果那个机架出现故障,那就很棘手了。因此,添加拓扑意识,以便您可以了解同一数据中心内的机架。确保数据分布在数据中心的多个机架中,最大限度地减少电源中断或与一个或另一个机架的连接丢失。一些数据库在允许数据库的多个副本在不同的数据中心运行并使用某种跨集群更新机制方面做得很好。每个数据库自主运行,它们的同步机制可以是单向的,一个数据中心更新下游副本,也可以是双向或多向的。这种地理分布可以通过让连接更靠近用户来减少延迟。跨可用性区域或区域的数据库还可以确保单个数据中心灾难不会导致数据库部分或完全丢失。去年我们的一位客户发生了这种情况,但由于他们部署在三个不同的数据中心,因此数据丢失为零。跨集群更新最初是在批处理级别实现的。确保您的数据中心每天至少同步一次。这并没有持续多久,后来人们开始确保更活跃的事务级更新。如果您运行的是高度一致的数据库,您将受到基于光速的实时传播延迟的限制。因此,实现最终一致性是为了允许每个操作更新使用多个数据中心,考虑到在短期内,数据可能需要时间才能跨所有数据中心保持一致。那么它在拓扑感知方面是如何叠加的呢?因此,CockroachDB和ScyllaDB也内置了。自2015年以来,拓扑感知也成为MongoDB的一部分,并且他们在这方面有多年的经验。Postgres和Redis最初被设计为单数据中心解决方案,因此处理多个数据中心的延迟对两者来说都不是一件容易的事。现在,您可以添加拓扑感知,就像您可以添加双活系统功能一样,但它不是开箱即用的。让我们回到我们所讨论的内容,并分别查看每个数据库的属性。PostgreSQLPostgreSQL是世界上最流行的开源数据库之一。它以可靠性和稳定性着称,在处理复杂的SQL方面也表现出绝对的优势。然而,Postgres仍在致力于跨集群和多数据中心的集群化。SQL由于是基于强一致的事务模式,所以不能很好的跨地域、跨集群。由于所有相关数据中心之间的长时间延迟,每个查询都将停止。此外,Postgres依赖于主副本模型。集群中的一个节点是领导者,而其他节点是副本。虽然有负载平衡器或主动-主动插件,但这些也超出了基本服务的范围。最后,Postgres的分片仍然主要是手动的,虽然他们在开发自动分片方面取得了进展,但它也超出了基础产品的范围。CockroachDBCockroachDB自称是“NewSQL”,一个为分发而设计的SQL数据库。它可以水平扩展,在磁盘、机器、机架甚至数据中心故障中幸存下来,延迟最小且无需人工干预。值得一提的是,CockroachDB使用Postgres有线协议,大量借鉴了Postgres开创的许多概念,并不局限于Postgres架构。多数据中心集群和对等拓扑是从头开始构建的。自动分片和数据复制也是如此。它还内置了数据中心感知功能,也可以添加机架感知功能。对于CockroachDB来说,它要求所有的事务都具有强一致性,你可以把这个看成是优点也可以是缺点。既没有最终一致性的灵活性,也没有可调一致性。这将降低吞吐量,并且在任何跨数据中心部署中都需要高基线延迟。MongoDBMongoDB是NoSQL领域的领导者。随着它的发展,添加了大量的分布式数据库特性。今天,MongoDB可以支持多数据中心集群。它在很大程度上仍然遵循主从模式,也有办法让它成为点对点的主动-主动模式。Redis接下来是Redis,它是一种旨在用作内存缓存或数据存储的键值存储。所有Redis数据都存储在内存中。如果突然停机,所有数据都将丢失。因此,必须有一种机制来保证Redis的数据不会因为故障而丢失。这种机制就是Redis的持久化机制。在持久化数据时,如果数据集不适合RAM,它会遭受巨大的性能损失。因此,它在设计时就考虑了本地集群。如果您不能等待5毫秒来从SSD获取数据,那么您可能也不能为从旧金山到伦敦的网络往返等待145毫秒。但是,存在允许多数据中心Redis集群的企业功能。大多数情况下,Redis以主从模式运行。这适用于读取密集型缓存服务器。但这意味着主节点是需要首先写入数据的地方,然后该数据分布在多个副本中以帮助平衡其缓存负载。有一项企业功能允许点对点主动-主动集群。Redis可以自动分片和复制数据,但其拓扑感知仅限于机架感知作为企业特性。ScyllaDBScyllaDB是根据ApacheCassandra中的分布式数据库模型设计的。因此,它默认为多数据中心集群。它可以自动分片,并且每个操作的一致性可调,如果你想要更强的一致性,它甚至支持轻量级事务来提供写入的线性化。就拓扑感知而言,ScyllaDB支持机架感知和数据中心感知,甚至支持标签感知和分片感知,不仅知道数据存储在哪个节点上,甚至还知道数据关联的CPU。结论虽然对于什么构成分布式数据库没有行业标准,但我们可以看到许多领先的SQL和NoSQL数据库在某种程度上支持一组核心功能或属性。其中一些功能是内置的,一些被视为增值包或第三方选项。在本文分析的五个典型分布式数据库系统中,CockroachDB为SQL数据库提供了最全面的功能和特性,ScyllaDB为NoSQL系统提供了最全面的功能。分析应被视为对特定时间段的调查。考虑到下一个技术周期的需求,每个数据库系统都在不断发展,而且这个行业并没有停滞不前。对于用户来说,分布式数据库每年都在进步,变得更灵活、更强大、更有弹性、更可扩展。

猜你喜欢