CockroachDB被设计用于创建开发者想用的源码可用的数据:集扩展性与一致性一体的数据库。开发者经常问到我们是如何实现的,该指南详细说明了CockroachDB进程的内部工作原理。
然而,使用CockroachDB您肯定不需要理解底层架构。这些内容为认真的用户和数据库爱好者提供了一个高级框架来解释底层发生了什么。
一.指南使用
该指南分为多部分来详细说明CockroachDB的每一层。推荐按顺序阅读这些层,以该概览开始,接着阅读SQL层。
如果您正寻找CockroachDB的高级理解,您能只阅读每层的概览部分。更多的技术细节,例如:如果您对该项目感兴趣——您也应该阅读组件部分。
--注意:
1)该指南详细说明了如何构建了CockroachDB,但并未您应该如何用CockroachDB构建一个应用。为了帮助您用CockroachDB构建自己的应用,请查看我们的用户文档。
二.CockroachDB的目标
CockroachDB设计用于服务如下目标:
1.让人们生活更加容易。这意味着对操作员来说其是低接触高自动化且对开发人员来讲很简单。
2.提供行业领先的一致性,即使是大规模部署。这意味着具备分布式事务能力,并且消除了最终一致问题和陈旧读取的痛苦。
3.创建一个可在所有节点上进行读写且不会产生冲突的一直可用的数据库。
4.允许在环境中进行灵活部署,而不会将您与任何平台或开发商进行捆绑。
5.支持关系数据库常用工具(即,SQL)。
拥有这些特性,我们希望CockroachDB能让团队容易的构建全局、可扩展、弹性的云服务。
三.术语表
1.术语
阅读我们的架构文当前,理解一些术语是有帮助的。
1)簇(Cluster):您的CockroachDB部署,其作为单个逻辑应用。
2)节点(Node):运行CockroachDB的单台机器。多个节点连接在一起创建一个簇。
3)范围(Range):CockroachDB存储所有的用户数据(表,索引,等。)和一个巨大键值对排序映射的几乎所有系统数据。这些键空间被划分为范围("ranges"),键空间的连续块,以便每个键值总是能在单个范围内发现。
从SQL角度看,一张表及其二级索引最初映射到单个范围,该范围内的键值对表示表(因为表按照主键排序,所以,也将表称为主键索引)中的一行数据或二级索引中的一行数据。范围大小一旦达到512M,就将其拆分为两个范围。表和索引继续增长,新的范围也会继续按照这个过程继续产生。
4)副本(Replica):CockroachDB对每个范围进行复制(默认为三份)并将每个副本存储到不同节点上。
5)租约持有者(Leaseholder):对每个范围,其中一个副本持有"范围租约(range lease)"。这个副本,称为"租约持有者(leaseholder)",其接收和协调该范围上所有的读写请求。
不像写,读请求访问租约持有者并将结果送至客户端,而无需与其他范围副本协调。这减少了相关和可能的网络往返,因为所有的写请求都是到租约持有者,所以,其保证数据是最新的。
6)Raft领导者(Raft Leader):对每个范围,其中一个副本是写请求的"领导者"。通过Raft共识协议,基于其Raft日志,写提交前该副本确保大部分副本(领导者和足够的跟随者)一致。Raft领导者和租约持有者几乎总是同一副本。
7)Raft日志(Raft Log):对每个范围,其副本与其一致的该范围上的写的按时间排序的日志。该日志与其每个副本一起存在于磁盘上,且为该范围的一致复制事实的源。
2.概念
CockroachDB严重依赖下列概念,因此,熟悉这些概念将有助于您理解我们的架构实现了什么。
1)一致性(Consistency):CockroachDB在ACID语义和CAP原理意义上使用"一致性",尽管比不上两个定义那么正式。我们用这个术语说明的是您的数据应该是无异常的。
2)共识(Consensus):当范围收到一个写操作时,包含该范围副本的法定节点确认该写操作。这意味着您的数据被安全存储且大部分节点一致处于数据库目前状态,即使一些节点已离线。
当一个写操作为达成共识时,暂时停止以维护簇一致性。
3)复制:复制涉及数据拷贝的创建和分布,也确保拷贝保持一致。然而,有多种类型的复制:即,同步和异步。
同步复制需要所有的写操作被认为提交前要广播到数据的法定拷贝数。为了确保您数据的一致性,CochroachDB使用这种类型的复制。
异步复制在写操作被认为提交前仅需要单个节点收到该写操作;此后再将其广播到数据的每个拷贝。这多少与"最终一致(eventual consistency)"相同,这点在NoSQL数据库中比较普及。这种复制方法可能会引起
数据异常和丢失。
4)事务(Transactions):数据库上执行的、满足ACID语义要求的一套操作。对确保开发者能信任数据库中数据的一致性系统来说,这是一个重要的组件。
5)多活可用性(Multi-Active Availablity):让簇中每个节点处理对存储数据(以每个范围为基础)的子集进行读写的、我们基于共识的高可用概念。与活动节点接受100%请求的主备复制,及所有节点接受请求但通常不能保证读数据最新且最快的主主复制相反。
四.概览
CockroachDB在机器上用两个命令启动:
1.簇中所有节点上运行带--join标志的cockroach start,因此,该进程知道能与其进行通信的所有其他机器。
2.cockroach init对簇进行一次性初始化。
一旦cockroach进程运行,开发者通过我们按照PostgreSQL建模的SQL API与CockroachDB进行交互。因为所有节点的对称行为,您可以将SQL请求发送到簇中的任何节点上;这使CockroachDB真正容易与负载均衡器集成。
接收SQL RPC后,节点将它们转换成能与我们的分布式键值存储工作的操作。当这些RPC开始向您的簇中填充数据时,CockroachDB通过算法开始将您的数据分布到您的节点上,将数据分解为我们称为范围的512MiB的块。
每个范围被复制到至少三个节点以确保数据的存活能力。这种方式,如果节点宕机,您将还有能用于读写的拷贝,同时,也会将这些数据复制到其他节点。
如果一个节点接收到不能直接服务的读写请求,它仅仅发现能服务该请求的节点并与其进行通信。这种方式下,您不必知道您的数据在哪里,CockroachDB为您跟踪这些信息,并开启每个节点的对称行为。
范围中任何数据的修改依赖于共识算法以确保其大部分副本一致提交该改变,确保行业领先的隔离及为您的应用提供一致性读,而无论您与那个节点进行通信。
最终,数据通过高效存储引擎被写到磁盘和从磁盘上读取,并能保持数据的时间戳轨迹。这为我们提供支持SQL 标准的AS OF SYSTEM TIME子句,并允许您发现一段时间历史数据。
但是,当该高级概览给您一个CockroachDB做什么的概念时,关注cockroach进程如何操作这些需求将让您更好的理解我们的架构。
五.层
最高级别上,CockroachDB将客户端的SQL语句转换成键值(key-value(KV))数据,其被分散到各节点并被写入磁盘。我们的架构是完成这些工作的进程,其被一些直接与其上下作为不透明服务进行交互的层表示。
下面描述每个层执行的功能,但几乎忽略了其他层的细节。这种描述对各层本身的体验时对的,其通常将其他层当做黑盒子API。没有明确关联的层间会有交互,并需要理解每个层的功能以理解整个进程。
1.SQL:将客户端SQL查询转换成KV操作。
2.事务(Transactional):允许对多个KV项进行原子改变。
3.分布(Distribution):作为单个实体提供复制KV范围。
4.复制(Replication):跨节点一致和同步复制KV范围。该层也通过租约实现一致性读。
5.存储(Storage):写和读磁盘上的KV数据。
六.个人观点
1.CockroachDB具备完备的分布式架构,当今NEWSQL产品中,个人认为其分布式架构更加纯粹、科学与合理。