CockroachDB旨在创建开发人员想要使用的的一种开源数据库,该数据库具有可扩展性和一致性。开发者对我们是如何实现这一目标存在疑惑,这篇指南将描述cockroach内部工作细节。

不过,使用CockroachDB不需要理解底层的架构。这些文档为深度用户和数据库爱好者提供了一个更高层次的框架来解释更多细节。

使用本篇指南

在本篇指南中,对CockroachDB的每一层分别使用一篇文档来讲解,建议按顺序阅读各层的指南,从概述开始,然后再到SQL层。

如果你希望对CockroachDB有更高度概括的理解,你只需阅读每层的概览部分。如果希望了解更多技术方面的细节---例如,如果你希望为该项目做出贡献,你可以阅读Components章节。

本指南详细介绍了如何构建CockroachDB,但没有说明如何使用CockroachDB构建应用程序。 有关使用CockroachDB的应用程序架构的帮助,请查看我们的用户文档

CockroachDB的目标

CockroachDB的设计目的是为了实现以下目标:

随着这些功能的融合,我们希望CockroachDB可以让团队轻松构建全球化的、可扩展的、灵活的云服务。

词汇表

术语

在阅读我们的架构文档之前,了解以下术语很有帮助。

术语 定义
Cluster(集群) 你部署的CockroachDB集群,它包含一个或多个数据库,对外则像一个逻辑应用程序一样提供服务。
Node(节点) 运行CockroachDB的单个机器。 许多节点连接在一起以创建你的集群。
Range 集群中一组连续的已排序的数据。
Replicas(副本) range的副本,存储在至少3个节点上,以确保可用性。
Range Lease(range租约) 对于每个range,其中的一个replicas持有“range lease“,该replicas(称为leaseholder)是接收和协调该range的所有读写请求的replicas。

概念

CockroachDB依赖于以下概念,因此熟悉它们将有助于了解我们的架构实现。

术语 定义
Consistency(一致性) CockroachDB使用ACID语义和CAP理论基础上的“consistency“(一致性),尽管不像理论定义的那样正式,我们使用这个术语来表达你的数据应该是无异常的。
Consensus (共识) 当range接收到写入请求时,包含该range的replicas的法定数量的节点(a quorum of nodes)确认写入。这意味着你的数据安全存储,并且大多数节点都同意数据库的当前状态,即使某些节点处于离线状态。

当写入未达成共识时,转发程序将停止以保持集群内的一致性。
Replication(复制) 复制涉及创建和分发数据副本,以及确保副本保持一致。 有多种类型的复制:即同步和异步。

同步复制要求所有写入传播到法定数量的数据副本之后,才能提交。 为了确保与数据的一致性,这是CockroachDB使用的复制类型。

异步复制只需要一个节点来接收写入来被认为已提交; 之后它会传播到每个数据副本。 这或多或少等同于NoSQL数据库推广的“最终一致性”。 这种复制方法可能会导致异常和数据丢失。
Transactions(事务) 在数据库上执行的一组操作,满足ACID语义的要求。 这是系统一致性的关键组成部分,可确保开发人员可以信任其数据库中的数据。
Multi-Active Availability (多活可用性) 我们基于共识的高可用性概念,允许集群中的每个节点处理对存储数据子集的读写(基于每个range)。 这与active-passive复制形成对比,在active-passive复制中,active节点接收100%的请求流量,以及active-active复制,其中所有节点都接受请求,但通常无法保证读取都是最新的和快速的。

概览

CockroachDB 在机器上使用两个命令开始启动:

一旦cockroach进程运行,开发人员就能通过SQL API与CockroachDB进行交互,我们已经在PostgreSQL之后建模。 由于所有节点的对称行为,你可以向任何节点发送SQL请求; 这使得CockroachDB非常容易与负载均衡器集成。

收到SQL RPC后,节点会将它们转换为在我们的分布式kv存储上使用的操作。 当这些RPC开始用数据填充集群时,CockroachDB会根据特定算法开始在节点之间分配数据,将数据分解为64MiB的块,我们称之为range。 每个range都被复制到至少3个节点,以确保可用。 这样,如果节点发生故障,你仍然可以获得可用于读取和写入的数据副本,以及将数据复制到其他节点。

如果一个节点接收到一个它无法直接服务的读或写请求,它会找到能够处理该请求的节点,并与它进行通信。这样你不需要知道数据位于哪里,CockroachDB会为你跟踪数据,并为每个节点启用对称行为(symmetric behavior)。

对range内的数据所做的任何更改都依赖于一致性算法,以确保其大多数副本同意提交更改,确保业界内领先的隔离保证并为你的应用程序提供一致的读取,无论你与哪个节点进行通信。

最后,使用高效的存储引擎将数据写入磁盘并从磁盘读取数据,该引擎能够跟踪数据的时间戳。这样做的好处是允许我们支持SQL标准AS OF SYSTEM TIME子句,允许你找到某段时间的历史数据。

然而,虽然overview部分向你提供了Cockroach数据库所做工作的概述,但是查看cockroach进程是如何处理每一个请求,将让你对我们的体系结构有更多理解。

Layers(层)

在最高层上,CockroachDB将客户端的SQL语句转换为键值(KV)数据,该数据分布在节点之间并写入磁盘。我们的架构表现为许多层,这些层直接与在它上面和下面的层交互,提供相对不透明的服务。

下面的页面描述了每个层执行的功能,但忽略了其他层的细节。只描述该层发生的过程,而将其他层作为黑盒API。各层之间发生交互没有明确描述,需要了解每一层的功能以理解整个过程。

顺序 目的
SQL 1 将客户端SQL查询转换为KV操作。
Transactional 2 允许对多个KV条目进行原子性改变。
Distribution 3 将复制的KV range作为单个实体。
Replication 4 跨越多节点的一致性和同步复制KV range。此层还允许通过租约实现一致的读取。
Storage 5 在磁盘上写入和读取KV数据。

What's Next?

通过了解CockroachDB如何在SQL层中如何处理应用程序,开始理解我们的体系结构