分布式NewSQL/HTAP数据库——Cockroach

       CockroachDB是一个分布式关系型数据库,它的主要设计目标是可扩展性强一致性高可靠性。CockroachDB能够在无人为干预情况下,以极短的中断时间容忍磁盘主机机架甚至整个数据中心的故障。CockroachDB采用完全去中心化架构,集群中各个节点的地位完全相同,同时所有功能封装在一个二进制可执行程序文件中,可以做到最小化设置和没有外部依赖的直接部署。

       CockroachDB对数据库客户端提供标准SQL接口(兼容PostgreSQL),集群中任意节点都可以作为接入节点处理用户的SQL请求。接入节点把SQL请求转换为一组KV操作,并且在必要时将这些操作发送至集群中其它节点进行处理,完成后将结果返回给客户端。CockroachDB底层将数据组织成由有序的Key-Value对组成的一个巨大的KV Map,其中Key和Value均为字节串(byte strings)。也就是说,CockroachDB底层将数据组织成一个巨大的有序Map,这个Map由一个一个Key-Value对组成,按照Key值单调有序存放,key和value都以字节串的形式存储。

       这个巨大的有序KV Map逻辑上被切分成很多较小的段,每一个这样的小段叫做范围(Range,Google的Spanner也叫Range,PingCap的TiDB叫做Region)。每个Range中的数据由本地KV存储引擎(RocksDB,是LevelDB的变体)存储。每个Range被复制多份分布到集群中多个不同的CockroachDB节点上,Range副本数量是可动静态配置的。每个Range默认大小为64M(Range能够合并或着劈开以维护这个尺寸),合理的Range大小有利于加速节点故障恢复、扩容、以及均衡读写负载。Range大小应该根据系统压力进行设置,以便管理更多Range。

      CockroachDB支持水平扩展

  1. 添加更多节点可以提升整个集群的存储容量,理论上最大可以支撑4EB的数据存储。
  2. 客户端的查询请求可以发送到集群任意节点,且每个查询可独立并发执行(无论有无冲突),这意味着集群的吞吐能力可以随着节点数的增加线性提升。
  3. 查询以分布式任务的方式在各个数据节点并发执行,可以通过增加节点数来提升单个查询的性能

     CockroachDB支持强一致性

  1. Range的多个副本之间使用分布式一致性协议——Raft同步数据,所有一致性状态都存储在RocksDB中。
  2. 对同一个Range内数据的单一或批量修改,由Raft保证Range操作的ACID语义。
  3. 涉及跨多个Range的操作,CockroachDB使用一种高效的无锁分布式提交协议保障事务的ACID语义。

     CockroachDB支持高可用性

  1. 将Range副本分布在一个数据中心内,可以确保低延迟复制,同时能容忍磁盘或机器故障。如果将副本分布在不同机架,即使某些网络交换机故障,CockroachDB仍可提供服务。
  2. Range副本可以跨数据中心和跨地域分布,以应对来自数据中心电源中断或网络中断,以及区域电力故障等问题。多数据中心跨地域的例子:{ US-East-1a, US-East-1b, US-East-1c }, {US-East, US-West, Japan }, { Ireland, US-East, US-West}, { Ireland, US-East,US-West, Japan, Australia }

      CockroachDB 提供快照隔离 (SI) 和 串行快照隔离 (SSI) 两种隔离级别;基于历史快照时间和当前时间,提供外部一致的无锁读写。SI提供无锁读写,但是存在写偏序问题(write skew); SSI消除了写偏序,但在竞争激烈的系统中会存在性能问题。SSI是默认的隔离级别,用户须根据实际性能情况,选择合适的隔离级别。
      类似于Spanner的Directory,CockroachDB允许根据复制策略、存储设备类型或者数据中心位置把集群划分成任意个数据区域(Zone),以提升集群性能和可用性。与Spanner不同的是,区域是一个整体,不存在子区域。

猜你喜欢

转载自blog.csdn.net/u011782423/article/details/82882598