比较CockroachDB和PostgreSQL的架构差异

902 阅读6分钟

如果不首先承认PostgreSQL是软件历史上最可靠和最广泛使用的数据库之一,那么开始一篇关于PostgreSQL的对比博文是错误的。世界对在过去30年中建立和支持这个重要项目的开源社区表示感谢。

在这篇文章中,我们简单地解读了PostgreSQL和CockroachDB之间的一些架构差异。在这个过程中,我们将指出单服务器、单实例架构的局限性可能会给现代云计算基础设施带来的挑战。

云意味着规模

云基础设施承诺,只要按一下按钮,我们的应用程序和服务就可以轻松扩展。无论我们需要更多的计算还是更多的存储,这些资源已经成为商品;然而,为了利用它们看似无限的可用性,我们使用的软件必须正确使用它们。

通常情况下,PostgreSQL数据库的规模包括将其部署在你能负担得起的最大实例上。然后,当你接近这个实例的容量时,你就升级到更大的计算。你已经增加了容量,但这本质上只是垂直扩展,你将达到它的极限。

一旦你的垂直规模达到了极限,你就必须转向水平规模,这意味着手动分片。使用分片键或散列或任何适合你的东西,你需要把数据库分成小块,并在多个不同的计算实例上运行。有很多不同的方法来分片,但是最终所有的手动分片都会导致复杂的实现,以及实际实现过程中相当多的开销(无论是从操作的角度,还是从开发的角度)。

CockroachDB中的Scale则有点不同。它是一种原生的能力,以最基本的形式提供了横向扩展,而没有任何操作上的开销。它是一个分布式数据库,每个节点都可以为所有参与节点的读写提供服务。因此,只要在集群中增加一个新的节点,你就可以扩展存储容量和交易容量。此外,数据在各节点之间并不同步。相反,集群使用分布式共识,在几个成员节点上以一式三份的方式写入数据。无论数据在哪里,每个节点都可以访问集群中任何地方的数据。除了在集群中启动一个新的节点之外,所有这些都没有任何操作上的开销。

主动/被动系统的工作,在一定程度上

高可用性(HA)是很重要的,因为它确保你可以访问数据,并且在发生故障时有备份。对于传统的数据库,如PostgreSQL,你通常会通过部署主动/被动拓扑结构来获得HA。在这种配置中,你有一个数据库的主实例和一个次实例,你在两个实例之间进行某种同步,以确保它们是同步的。因此,当主实例发生故障时,次实例可以上线。然后,当危机得到解决时,你让主数据库重新上线,并返回到原始配置。

这种方法已经工作了一段时间,然而,它充满了问题。首先,主系统和辅助系统之间的同步可能很复杂,而且可能会出现两个系统之间的对齐问题。其次,在发生故障后,辅助系统上线所需的时间可能很长,而且在这个过程中你可能会丢失数据或交易。但真正可怕的是当两个数据库在生产中没有同步在一起时的补救措施。你怎么知道这些数据中哪些是正确的?

同样,CockroachDB自然地提供了高可用性,而且不需要任何复杂或昂贵的操作。如上所述,数据是以一式三份的形式写在数据库的几个成员节点上的,因此,如果一个单独的节点发生故障,你仍然有两份数据的副本。数据库甚至聪明到可以注意到一个副本的缺失,并会在另一个节点上重新创建它,所以它确保了副本的完整性。

地理上的规模:扩大你的业务

另一种看待规模的方式是将你的存在扩展到新的地理区域的能力。对于像PostgreSQL这样的传统数据库,你通常会通过设置一个镜像实例来实现,然后在每个地区分别运行每个数据库。你通常会有两个活动系统来管理和操作。对齐数据,或收集数据进行分析,将依赖于某种复杂的同步。

这里的问题很多。整个区域数据库的数据可能是冲突或重复的。管理两个系统的运营开销使管理你的整体服务的成本和复杂性增加了一倍。最后,你还得承担两个系统的全部费用。基本上,它是昂贵和复杂的。

CockroachDB不仅可以在你增加节点时进行扩展,而且还可以在多个地区甚至主要地域提供单一的逻辑数据库。它还可以做到这一点,同时确保你在任何地方都有永远一致的(可序列化的)交易。甚至有一些功能还允许你将数据与特定的地理环境联系起来,以确保无论你的客户在哪里都能低延迟地访问数据。

CockroachDB:PostgreSQL但更好?

基于以上的几个基本考虑,CockroachDB可以为开发者和运营商提供更好的体验,因为他们不再需要处理规模、弹性和地理扩张的复杂性。它既适合复杂的全球服务,也适合单一实例、单一地区的应用。

最重要的是,CockroachDB与PostgreSQL兼容,因此,你通常在PostgreSQL上使用的工具和服务都可以在Cockroach上使用。两者都提供了一个完整的、功能丰富的、具有强大SQL语法的关系数据库。

开始使用CockroachDB

想自己尝试一下吗?你现在就可以在cockroachlabs.cloud上建立一个CockroachDB的集群,并可以即时访问。只需点击几下,你就可以拥有一个简单的、可扩展的、有弹性的关系数据库实例,它提供了PostgreSQL的大部分功能。