cockroachDB,yugabyteDB,kudu, TIDB 这些都是 参考了google spanner 论文 的开源实现.

这些开源实现,包括mongodb 都看过源码架构,看过很多相关的paper,以及重点看了分布式事务的实现: 原子性,隔离性, linearizability(外部一致性). 注:mongodb 虽然起源于no-sql , 但是mongodb4.0 之后的版本 已经不是no-sql 了, 可以与以上任何一位new-sql 代表PK.

这里重点说下cockroachDB 与yugabyteDB 这两款比较喜欢.

先统一下概念:1. table 中的数据 不管是是以 hash 方式还是以range 方式切分,切分之后的单位叫tablet(cockroachdb 里叫range , TIDB 叫partion, yugabyteDB 与kudu 里叫 tablet, mongodb 里叫chunk).

2. serializability& linearizability :这是分布式数据库的黄金标准,也就是google spanner paper 里说的外部一致性. 这里的serializability 是事务隔离的最强保证, linearizability 是CAP 领域 对于C 的最强保证. 这两个概念是正交的,linearizability 在分布式领域中更加关注single-operation,single-object, real-time order ; 而在分布式数据库中, 每个事务的提交可能会修改多个数据对象, 这些数据对象有统一的版本号,如果我们把这些数据对象看成一个整体且是原子的,然后再对这个整体 施加 linearizability 约束就达到了 serializability & linearizability 标准.

3. CAP-consistency : 这里指CAP 领域中的一致性, 不是ACID 中的C。

4. node : 物理机器,容器或者一个进程。

对于serializability & linearizability 标准, 目前这些开源实现里面 一个也没有达到, 只有cockroachDB 在没有 google spanner 原子钟的情况下,是最接近这个黄金标准的. 随着云硬件基础设施的完善,相信会提供出像google 的原子钟及true time api, cockroachDB 也无缝支持. 刚开始我对cockroachDB 的CAP-consistency 有很大误解,认为在没有原子钟及TSO 中心授时 下,会出很多问题, 会有stale-read , 会有性能问题,会破环serializability , 其实不然. 目前cockroachDB 目前在这方面的实现已经足够健壮,具体细节后面再讲.

从架构上讲:

共同点 :

大致都可以分为两层,上层是SQL,下层是 KVStore(支持事务API) . 所有table 数据划分为tablet(比较喜欢这个命名,没有歧义)存储在KVStore 层. 每个tablet 会有一个独立的raft group 来保证 各个replica 的数据一致. 每个raft goup 会有一个leader lease 负责这个tablet 数据的读写.

上面的设计思想应该都是inspired by google spanner . 除了上面这点相同之处, 其余的部分的设计有很多不一样.

cockroachDB 的设计:

1. cocokroachDB 设计之初就是需要Geo-Distributed 的,整个系统没有任何单点, 没有TSO ,都不存在一个单点来检测死锁. 另外table 的scheme 信息 以及tablet 的路由信息都会放到KVStore 上. tablet 的路由信息靠Gossip 同步. cockroachDB 的时间戳服务由 每个node 上的HLC 提供.

cockroachDB 只有一个进程, 但是其SQL 层与KVStore层分界清晰,完全可以把KVStore 独立出来, 这样上层就是一个Dist SQL 层,下层就是支持分布式事务的KVStore层,在cockroachDB 的源码里叫KV-DB. 所以cockroachDB 的部署非常简单.

cockroachDB 里的 KVStore 层提供了一个支持分布式事务的API 接口给SQL 层, 让SQL层感觉下面是一个单机的存储引擎. 所以 cockroachDB 完全可以单机部署, 副本集部署,很好的适配了不同规模的企业.

另外cockroachDB 开发了自己的存储引擎Pebble, 会替换掉RocksDB, 后面可以基于这个Pebble 做很多优化.

2. 每个tablet 的数据及其raft log 在 cockroachDB 中虽然是逻辑上独立的, 但物理上并不独立, 在一个node 上的所有tablet 数据 及raft-log 都是放在一个rocksDB 实例上的,这样弊大于利,不过有提到将这些数据独立的计划.

TIDB 是 所有tablet 的raft-log 放到一个rocksDB 实例,所有tablet 数据放到另一个rocksDB 实例. kudu 是每个tablet 的raft-log 独立,放在不同的文件中,kudu 有自己的存储引擎.

而yugabyteDB 的KVStore层源自kudu ,但在上面做了大量优化, yugabyteDB 中每个tablet 的 raft-log 放在独立的文件中,可以hash 到不同disk 上, 每个tablet 的数据有一个独立的rocksDB 实例,这样直接把rocksDB 的 wal 关掉,避免了 wal-log 的两次flush disk ,这样每个tablet 数据其实是物理隔离的,这样在很多方面都有性能优势. 就是程序变复杂了,比如:在tablet split 和merge 时候需要做的更多. 当然这种物理隔离会带来更多的想象空间, 以后一个table 可以是行存也可以是列存, 支持多个存储引擎.

多说一句:yugabyteDB的设计也很优秀,主要是C++,比较喜欢. 其TSO 与cockroachDB 一样也是用的HLC ,mongodb 也是, HLC 是大趋势。另外yugabyteDB 的SQL 层是直接在postgreSQL 上直接改的, 下层KVStore 层 源于kudu,在源码里叫TServer. TServer 启动时,会去加载postgreSQL 程序作为一个子进程启动, 这样 SQL 层运行在一个子进程里,TServer也是一个进程,他们之间通过local socket 通信. 会有另外一个Tmaster 会存储tablet 的路由信息,表的scheme , 统计上报信息 等. Tmaster 也是tablet 调度的发起者, 但其并不提供TSO 服务.

cockroachDB 分布式事务: 分布式事务的实现是整个系统中最复杂的,也是必须要保证数据库正确性的.

1. 原子性: 其他开源实现原子性的保证都是基于2PC,看Percolator 的论文就非常清楚了,都大同小异, 但是cockroachDB 做了大量优化,引入了并行提交,让一次分布式事务的延迟优化到了理论上最小值,也就是一次raft consensus 的延迟.另外对于交互式事务,或者说一个事务由多条DML语句的事务,引入了pipeline ,实现了asynchronous raft consensus.

引入了这两个特性后,我们做了测试,极大降低了事务的延迟,比其他几个开源实现性能都要好.

2. 隔离性 :cockroachDB 实现了serializability . 也是其默认级别,以前的版本实现了SI,但在

新的版本中删除了,因为SI 会有Write-skew 问题,在客户那里出过问题. 其SSI 的实现其实是MVTO 的变种,然后inspired by Write-SI (论文:A Critique of Snapshot Isolation),虽然MVTO 属于乐观并发控制,但是cockroachDB 为了防止事务不断的restart , 加入了等待机制. 具体的性能数据可以参考其官网数据.

注意的是: cockroachDB 的DML 操作并不会缓存在buffer 里,等 commit 时候 再 laid-down到KVStore 上, 而是事务只要发起DML,就会将相关数据laid-down 到KVStore 上,这点不同于TIDB 与yugabyteDB 。另外 cockroachDB 的分布式事务的协调者 在源码里叫做TxnCoordinator。每次事务都是生成一个TxnCoordinator 对象 来发起2PC, 而TxnCoodinator 其实是在KVStore层.

3. CAP-consistency :

cockroachDB 的一致性保证基本接近 linearizability .

cockroachDB 采用了HLC 来为 其各种读写事件定序,HLC 本质上是lamport logical clock ,且 HLC 是严格单调递增的, 所以很容易对那些由内部因果关系的事件定序。

对于外部因果关系的追踪就需要靠HLC 的 physical clock 部分. 而这个HLC 的physical clock 部分来源于 机器的wall-time。 由于各个机器的物理时钟(物理时钟一般会通过NTP 校准) 是不准的,会有clock-skew , 但cockroachDB 会假设各个 clock 之间 存在一个max clock offset bounds.

如果各个机器的物理时钟在这个max clock offset bounds 内,则cockraochDB 就是可以保证serializability & linearizability, 达到与google spanner 一样的标准, 除了在一些极端情况下,会出现causal reverse, 不满足linearizability, 对于绝大多少应用,这种情况基本不会出现.

如果这个条件不满足,可能会出现stale-read , 但是其serializability 是依然可以保证的.

总之: 即使在机器物理时钟异常情况下,cockroachDB 也是至少可以保证serializability 与内部因果一致的, 其实这已经是非常强的保证了. 另外GPS 原子钟 将来云上应该会提供.

cockroachdb 和mysql_TiDB和CockroachDB同为Spanner/F1的开源实现,有哪些重大差异?相关推荐

  1. 从SQL到NoSQL再到NewSQL

    为什么80%的码农都做不了架构师?>>>    开源 RDBMS 与互联网的崛起 很长时间以来,关系型数据库一直是大公司的专利,市场被 Oracle / DB2 等企业数据库牢牢把持 ...

  2. 是时候选择NewSQL数据库了

    开源 RDBMS 与互联网的崛起 很长时间以来,关系型数据库一直是大公司的专利,市场被 Oracle / DB2 等企业数据库牢牢把持.但是随着互联网的崛起.开源社区的发展,上世纪九十年代 MySQL ...

  3. TiDB-vs-CockroachDB

    CockroachDB 去中心化设计, 数据可以直接存放到本地磁盘 水平弹性扩容,可自动 Rebalancing 各个节点之间完全对等,前端可挂负载均衡 高可用遵循多数原则,默认数据保存三份副本(至少 ...

  4. 一篇文章,掌握所有开源数据库的现状

    数据库作为业务的核心,在整个基础软件栈中是非常重要的一环.近几年社区也是新的方案和思想层出不穷,接下来我将总结一下近几年一些主流的开源数据库方案,其背后的设计思想以及适用场景.本人才疏学浅如有遗漏或者 ...

  5. Go社区的2017回顾

    今天是2017年的最后一天,首先感谢屏幕前的你,感谢一路来对于我们Go社区的支持,让我们Go中国社区成为国际上最活跃的社区,今天放假和大家一起回顾一下我们社区这一年来的发展. 首先我们看一下目前中国社 ...

  6. 开源NewSQL – CockroachDB在百度内部的应用与实践

    内容来源:2017 年 11 月 18 日,百度数据库架构师严龙在"第七届数据技术嘉年华"进行<百度NewSQL-CockroachDB>演讲分享.IT 大咖说(微信i ...

  7. CockroachDB架构浅析

    本文源自:http://www.cockroachchina.cn/?p=685 这篇文档介绍和说明了cockroachdb的架构,简单明了. 作为Spanner的开源实现,CockroachDB具有 ...

  8. cockroachdb mysql_CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储...

    CockroachDB学习笔记--[译]CockroachDB中的SQL:映射表中数据到键值存储 原文标题:SQL in CockroachDB: Mapping Table Data to Key- ...

  9. cockroachdb 替换mysql_CockroachDB集群部署及常见问题

    CockroachDB支持secure和insecure两种集群部署方式,本文重点介绍secure模式下CockroachDB集群的搭建过程.集群的状态查看方法.集群重启.CockroachDB版本升 ...

最新文章

  1. 先安装证书服务(CA),再安装IIS,导致默认certsrv站点不能访问
  2. 【聊一聊】css中的经典布局——圣杯布局
  3. Tomcat提示“XDB 的服务器 localhost 要求用户名和密码”
  4. IOS 控制器View的创建方式(方式的优先级 、view的延迟加载)
  5. 下载VCForPython27.msi
  6. sentry-前端应用监控工具
  7. AlphaGo算法论文 神经网络加树搜索击败李世石
  8. Java中IO演练之银行账号校验
  9. EXCILE 电子表格常见公式
  10. jzoj3027. 【NOIP2011DAY2】计算系数(math)
  11. ruby_Ruby简介
  12. 分数阶混沌系统李雅普指数和分岔图
  13. JS 遍历对象 jQuery遍历对象
  14. intell IDE初始用
  15. 傅里叶变换基函数可视化
  16. JForum论坛添加UEditor文本编辑器
  17. Dell G3-3579 安装 Ubuntu16.04 并安装显卡驱动
  18. JS前端去掉emoji表情和Java后台处理emoji表情方法
  19. Xcode 4.5 支持 amv6
  20. 虚拟化技术 — QEMU-KVM 基于内核的虚拟机

热门文章

  1. 没有整理选项,新版谷歌浏览器如何导出书签
  2. 大秀直播间打赏系统付费观看网站源码
  3. 大气颗粒物PMF源解析实用干货
  4. 大直播时代,P2P才是降低成本的必杀技 1
  5. Dynamic Datasource
  6. 设计一个矩形类,完成计算矩形面积和显示矩形属性的功能。
  7. 自执行函数以及它的this指向
  8. 宿舍存在3大管理难题,你属于哪一种?
  9. C++(输入一个圆形游泳池的半径,游泳池外需要修建一个三米的路,算一下路两边的栅栏和修路要花多少钱)
  10. TPOT自动机器学习参数详解