原始网页:https://www.cockroachlabs.com/docs/stable/frequently-asked-questions.html


产品相关常见问题

什么是CockroachDB?

CockroachDB是一个分布式的SQL数据库。它建立在支持事务且具有强一致性的KV存储引擎的基础之上;能够进行水平拓展;能够在不需要人工干预的情况下,以最小的中断延迟来恢复硬盘、机器、机架乃至数据中心级别的故障;能够支持强一致性的ACID事务;能够提供一套用户熟悉的SQL API来组织、管理和查询数据。

CockroachDB灵感来源于Google的SpannerF1技术,是一个完全开源的技术实现方案。

什么场景下选择CockroachDB是一个更好的选择?

CockroachDB适合需要在任何规模下数据都具备可靠性、可用性和正确性的应用程序。它实现了自动数据冗余、重平衡、在最小配置和操作开销下的故障恢复。适合场景包括:

CockroachDB单行读的时延在2ms以内,单行写的时延在4ms以内,支持通过不同的SQL和调优方式进行查询性能优化。即使如此,CockroachDB仍然不适合大量的分析的OLAP场景。

CockroachDB安装的难度如何?

在OS X或是Linux上,用户只需要下载一个安装程序完成安装,而在Windows上只需要运行官方的Docker镜像。还有其他一些简单的安装方式,例如在OS X上运行我们的Homebrew recipe,或是在OS X和Linux上直接编译源码文件。详见安装CockroachDB

CockroachDB如何进行拓展?

CockroachDB支持最小操作开销的水平拓展。该功能可以适用于本地机器、单个服务器、专用的部署集群、专有或公有云环境。通过添加一个新的节点到运行中的集群,用户可以很容易地扩容集群。

在KV层面,CockroachDB内部开始于一个单独的、空的Range。随着数据插入到Range中,这个Range最终会达到阈值大小(默认64MB)。此时数据会切分到两个Range,每个Range存储整个KV空间下的一个连续的片段。这个过程会不断进行下去,随着新数据的到来,已有的Ranges会不断地切分成新的Ranges,这样做的目的是保持一个相对小且大小一致的Range。

当你的集群跨越多个节点(物理机器、虚拟机器或是容器),新的切分出来的Ranges会自动重新平衡到拥有更多空间的节点。CockroachDB使用端对端的Gossip协议,通过交换网络地址、存储空间大小和其他信息去协调数据的重平衡。

CockroachDB如何恢复故障?

CockroachDB设计用于自动从软硬件的故障中快速恢复(从服务器重启到数据中心停电都能应对)的场景。在CockroachDB中,使用了强一致性副本和故障后自动修复,不会出现其他分布式系统的缺陷(例如:过期数据读取)。

复制

CockroachDB通过复制数据保障可用性,并通过Raft一致性协议Paxos之外的另一种流行的一致性协议)保证副本之间的一致性。用户可以使用多种方式定义副本的位置,取决于用户需要防范的故障类型以及网络拓扑结构。用户可以存储副本到:

若进行跨数据中心的副本复制,用户需要注意数据中心之间网络上的往返时延对数据库性能的直接影响。相比于将所有节点部署在相互之间距离近的集群部署方式,跨大陆的集群部署方式在时延上表现得更糟糕。

自动恢复

对于短时间的故障(例如服务器重启),CockroachDB通过Raft保持绝大多副本可用,来实现无缝服务。Raft保证了每组副本在前任Leader故障的时候能够选举出新的Leader,使得事务能够继续进行,而受影响的副本再次上线的时候能够再次加入到副本组。

对于长时间的故障(例如服务器或机架长时间故障或是数据中心停运),CockroachDB能够使用不受故障影响的副本作为数据源,恢复并自动重新平衡丢失节点上的副本。集群能够通过Gossip网络提供的存储空间信息,识别新的节点。然后使用所有的可用节点、硬盘和网络的带宽,以分布式的方式重新复制出丢失的副本。

CockroachDB如何保证强一致性?

CockroachDB支持可串行化的SQL隔离级别,这是SQL标准里定义的最高等级。针对写实现了Raft一致性算法,针对读实现了基于时间同步的通用算法,这两者保证了可串行化的隔离级别。 更多细节可查看强一致性

CockroachDB如何同时实现高可用性和强一致性?

CAP理论表明了对于一个分布式的系统在以下3种保证中同时实现超过两种是不可能的:

CockroachDB是一个CP系统(支持一致性和分区容错性)。这意味着在分区缺失的情况下系统会进入不可用状态,而不会做任何导致结果不一致的行为。例如,写操作需要得到绝大多数副本的认同,读操作需要持有租约(Lease)。租约只会赋予给能够进行写操作的节点。

此外,CockroachDB也能够提供高可用性,虽然这里的可用性跟CAP理论里使用的概念有一些不同。在CAP理论里,可用性是二元属性,而我们使用频谱(spectrum)描述可用性(例如使用5个9这样的措辞去描述系统在99.999%的运行时间内是可用的)。

同时具备CP和HA,意味着绝大多数副本在相互之间能够保持通信的时候,能够保证系统正常运行。例如,如果用户将CockroachDB部署在3个数据中心,其中一个在网络连接上出现了故障,剩下的两个数据中心能够在几秒种的中断后恢复可用。实现这个功能,需要系统能够快速高效地检测到集群分离和故障,将领导权转交给能够跟绝大多数节点保持通信的可用节点,同时避免负载路由到丢失节点。

为什么是CockroachDB SQL?

在最底层,CockroachDB是一个分布式、强一致性、支持事务的KV存储引擎,而对外的API则是拓展的标准SQL。拓展的标准SQL为用户提供了熟悉的关系模型(例如schemas、表、列、索引)以及能够使用成熟且经过时间验证的工具和流程去组织、管理、查询数据库的能力。此外由于CockroachDB支持PostgreSQL通信协议,用户的应用程序跟CockroachDB进行通信变得很简单,只需要集成特定语言下PostgreSQL驱动,编写代码。

更多细节可以阅读基础的CockroachDB SQL语句或是完整的SQL语法,可以通过内置的SQL客户端尝试使用SQL语句。此外关于CockroachDB如何将SQL表数据映射到KV存储,以及如何为一个运行中的查询选择最适合索引,可以查看SQL in CockroachDBIndex Selection in CockroachDB

CockroachDB支持分布式事务吗?

是的,CockroachDB将事务分配到集群节点(该集群可以是部署在单一位置的少量服务器,或是部署在跨数据中心的多服务器)。不同于配置分片的数据库系统,用户不需要知道数据的具体位置,只需要通过集群中任意节点发起事务操作之后,CockroachDB自动会将事务分配到正确的位置。在数据重平衡进行的时候,分布式事务不会停止或是添加额外的延迟。用户甚至可以在集群运行过程当中跨越不同数据中心或云服务提供商,去移动表甚至整个数据库。

CockroachDB中的事务是否保证ACID语义?

是的。CockroachDB尽管分布式存储数据,但是对于每个跨越表和行的事务都能够保持ACID语义。

CockroachDB灵感来自于Spanner,它都否需要使用原子钟进行时钟同步?

不需要。CockroachDB设计时没有考虑使用原子钟和GPS时钟。从企业部署集群中的物理服务器到使用虚拟层的公有云设备,CockroachDB都可以运行。所以,对于在时钟同步上需要依赖于外部专用设备的产品来说是一个有力的竞争者。

值得注意的是,CockroachDB需要中等程度的时钟同步保证正确性。如果时钟偏移超过最大的阈值,节点会强制下线。因此我们强力推荐在每个节点上运行NTP或是其他时钟同步软件。 关于CockroachDB如何处理非同步的时钟,可以查看时钟同步。而更加详细的时钟相关讲解,以及Spanner和CockroachDB时钟上的区别,可以查看Living Without Atomic Clocks

CockroachDB的使用支持哪些编程语言?

CockroachDB支持PostgreSQL通信协议,用户可以选择对应编程语言可用的PostgreSQL客户端驱动,目前已经经过验证能够使用CockroachDB的编程语言包括:

更多细节可以查看安装客户端驱动

为什么CockroachDB使用PostgreSQL通信协议而不是MySQL协议?

CockroachDB使用PostgreSQL协议,因为相比于MySQL协议,PostgreSQL协议有更好的文档支持。此外PostgreSQL协议有更加自由的开源License,类似BSD或MIT Licenses,而MySQL协议的GNU通用公开License则更加严格。

然而使用的协议并不会严重影响切换数据库的简易程度,切换SQL网络驱动对于几乎每种语言都是相当简单的事情。真正使得切换数据库变得困难的是使用的SQL语言之间些许的差别。

CockroachDB SQL语言则是拓展自PostgreSQL。

什么是CockroachDB安全模型?

用户可以运行一个安全模式或非安全模式的CockroachDB集群。若是安全模式,客户端/节点和节点之间的通信是加密的。SSL证书将验证节点和客户端的身份。若是非安全模式,则没有任何加密和验证。

此外,CockroachDB支持通用的数据库和表级别的SQL权限,root用户拥有数据库的所有权限,通过特定的SQL语句,其他用户可以被授予特定数据库和表级别的SQL权限。

更多细节,可以查看权限GRANT语句

跟MySQL或PostgreSQL对比,CockroachDB表现如何?

以上所有的数据库都支持SQL语法,而CockroachDB是唯一一个的能够很便捷地进行水平拓展(不需要人工配置分片)、重平衡、自动故障修复、跨集群执行分布式事务的数据库。

更多细节,可以查看CockroachDB对比

跟Cassandra、Hbase、MongoDB或Riak相比,CockroachDB表现如何?

以上所有数据库都是分布式数据库,而CockroachDB是唯一的支持分布式事务、提供强一致性的数据库。此外,其他数据库提供的是特定的APIs,而CockroachDB提供的是拓展的标准SQL API。

更多细节,可以查看CockroachDB对比

PostgreSQL或是MySQL应用能够迁移到CockroachDB上?

是的,尽管CockroachDB目前无法做到插入式地替换。考虑到可用功能和语法上的不同,从这些数据库迁移数据到CockroachDB需要一些手动的工作。

第一步就是根据应用程序的高级SQL需求,查看CockroachDB的SQL功能支持页面。如果缺失必要的SQL功能,考虑绕过或是通过我们的论坛或"sales@cockroachlabs.com"联系我们。

一旦你决定迁移,我们推荐通过CSV格式导入数据。这种方式能够查看到哪些数据需要作出兼容性的调整。在迁移PostgreSQL到CockroachDB的时候,请通过查看known differences for identical input列表,进行必要的检查。

Cockroach Labs是否提供云数据库的服务?

是的,我们目前提供数量有限的托管的CockroachDB服务,接受客户满足其基本的需求。该服务根据客户需求提供客户一个运行的CockroachDB集群,运行在AWS或GCP上,全权由CockroachDB Labs运维。

该服务的好处包括:

详细细节可以查看托管的CockroachDB文档。

是否能够使用CockroachDB作为KV存储?

CockroachDB是一个分布式的开源数据库,构建在一个支持事务和强一致性的KV存储层之上。用户尽管无法直接访问KV存储层,但仍然可以简单地使用一个只有2个属性列(其中一列作为主键)的表来实现类似的直接访问。

CREATE TABLE kv (k INT PRIMARY KEY, v BYTES);

上述表在没有外键的情况下,CockroachDB将会以最小的代价(个位数百分比的开销)将INSERT/UPSERT/UPDATE/DELETE语句转换成KV操作。例如,上述UPSERT语句用于添加或替换表中一行,将转换成一个KV的PUT操作。

UPSERT INTO kv VALUES (1, b'hello');

这种SQL模式为用户提供了一种定义明确的查询语言,提供了一个明确的事务模型,还提供了根据需求变更添加更多列的灵活性。

其他未解答的问题