怎样打造一个分布式数据库——rocksDB, raft, mvcc,本质上是为了解决跨数据中心的复制

摘自:http://www.infoq.com/cn/articles/how-to-build-a-distributed-database?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text

为何咱们要建立另一个数据库?

在前面三十年基本上是关系数据库的时代,那个时代建立了不少伟大的公司,好比说 IBM、Oracle、微软也有本身的数据库,早期还有一个公司叫 Sybase,有一部分特别老的程序员同窗在当年的教程里面还能够找到这些东西,可是如今基本上看不到了。另外是 NoSQL。NoSQL 也是一度很是火,像 Cassandra、MongoDB 等等,这些都属于在互联网快速发展的时候建立这些可以 scale 的方案,但 Redis scale 出来比较晚,因此不少时候你们把 Redis 当成一个 Cache,如今慢慢你们把它当成存储不那么重要的数据的数据库。由于它有了 scale 支持之后,你们会把更多的数据放在里面。程序员

而后到了 2015,严格来说是到 2014 年到 2015 年之间,Raft 论文发表之后,真正的 NewSQL 的理论基础终于完成了。我以为 NewSQL 这个理论基础,最重要的划时代的几篇论文,一个是谷歌的 Spanner,是在 2013 年初发布的;再就是 Raft 是在 2014 年上半年发布的。这几篇至关于打下了分布式数据库 NewSQL 的理论基础,这个模型是很是重要的,若是没有模型在上面是堆不起来东西的。说到如今,你们可能对于模型仍是能够理解的,可是对于它的实现难度很难想象。算法

将来的高可用必定是系统出了问题立刻能够自动恢复,立刻能够变成可用。好比说一个机房挂掉了,十秒钟不能支付,十秒钟以后系统自动恢复了变得能够支付,即便这个数据中心不再起来我整个系统仍然是能够支付的。Auto-Failover 的重要性就在这里。你们不但愿在睡觉的时候被一个报警给拉起来,我相信你们之后具有这样一个能力,5 分钟之内的报警不用理会,挂掉一个机房,又挂掉一个机房,这种连续报警才会理。咱们内部开玩笑说,但愿你们都能睡个好觉,很重要的事情就是这个。数据库

Google Spanner / F1

说一下 Google 的 Spanner 和 F1,这是我很是喜欢的论文,也是我最近几年看过不少遍的论文。 Google Spanner 已经强大到什么程度呢?Google Spanner 是全球分布的数据库,在国内目前广泛作法叫作同城两地三中心,它们的差异是什么呢?以 Google 的数据来说,谷歌比较高的级别是他们有 7 个副本,一般是美国保存 3 个副本,再在另外 2 个国家能够保存 2 个副本,这样的好处是万一美国两个数据中心出了问题,那整个系统还能继续可用,这个概念就是好比美国 3 个副本全挂了,整个数据都还在,这个数据安全级别比不少国家的安全级别还要高,这是 Google 目前作到的,这是全球分布的好处。安全

如今国内主流的作法是两地三中心,但如今基本上都不能自动切换。你们能够看到不少号称实现了两地三中心或者异地多活,可是一出现问题都说很差意思这段时间我不能提供服务了。你们无数次的见到这种 case, 我就不列举了。架构

Spanner 如今也提供一部分 SQL 特性。在之前,大部分 SQL 特性是在 F1 里面提供的,如今 Spanner 也在逐步丰富它的功能,Google 是全球第一个作到这个规模或者是作到这个级别的数据库。事务支持里面 Google 有点黑科技(其实也没有那么黑),就是它有GPS 时钟和原子钟。你们知道在分布式系统里面,好比说数千台机器,两个事务启动前后顺序,这个顺序怎么界定(事务外部一致性)。这个时候 Google 内部使用了 GPS 时钟和原子钟,正常状况下它会使用一个GPS 时钟的一个集群,就是说我拿的一个时间戳,并非从一个 GPS 上来拿的时间戳,由于你们知道全部的硬件都会有偏差。若是这时候我从一个上拿到的 GPS 自己有点问题,那么你拿到的这个时钟是不精确的。而 Google 它其实是在一批 GPS 时钟上去拿了可以知足 majority 的精度,再用时间的算法,获得一个比较精确的时间。你们知道 GPS 也不太安全,由于它是美国军方的,对于 Google 来说要实现比国家安全级别更高的数据库,而 GPS 是可能受到干扰的,由于 GPS 信号是能够调整的,这在军事用途上面很典型的,你们知道导弹的制导须要依赖 GPS,若是调整了 GPS 精度,那么导弹精度就废了。因此他们还用原子钟去校订 GPS,若是 GPS 忽然跳跃了,原子钟上是能够检测到 GPS 跳跃的,这部分相对有一点黑科技,可是从原理上来说仍是比较简单,比较好理解的。分布式

最开始它 Spanner 最大的用户就是 Google 的 Adwords,这是 Google 最赚钱的业务,Google 就是靠广告生存的,咱们一直以为 Google 是科技公司,可是他的钱是从广告那来的,因此必定程度来说 Google 是一个广告公司。Google 内部的方向先有了 Big table ,而后有了 MegaStore ,MegaStore 的下一代是 Spanner ,F1 是在 Spanner 上面构建的。优化

TiDB and TiKV

TiKV 和 TiDB 基本上对应 Google Spanner 和 Google F1,用 Open Source 方式重建。目前这两个项目都开放在 GitHub 上面,两个项目都比较火爆,TiDB 是更早一点开源的, 目前 TiDB 在 GitHub 上 有 4300 多个 Star,天天都在增加。ui

TiDB 和 TiKV 为何是两个项目,由于它和 Google 的内部架构对比差很少是这样的:TiKV 对应的是 Spanner,TiDB 对应的是 F1 。F1 里面更强调上层的分布式的 SQL 层到底怎么作,分布式的 Plan 应该怎么作,分布式的 Plan 应该怎么去作优化。同时 TiDB 有一点作的比较好的是,它兼容了 MySQL 协议,当你出现了一个新型的数据库的时候,用户使用它是有成本的。你们都知道做为开发很讨厌的一个事情就是,我要每一个语言都写一个 Driver,好比说你要支持 C++、你要支持 Java、你要支持 Go 等等,这个太累了,并且用户还得改他的程序,因此咱们选择了一个更加好的东西兼容 MySQL 协议,让用户能够不用改。一会我会用一个视频来演示一下,为何一行代码不改就能够用,用户就能体会到 TiDB 带来的全部的好处。spa

这个图其实是整个协议栈或者是整个软件栈的实现。你们能够看到整个系统是高度分层的,从最底下开始是 RocksDB ,而后再上面用 Raft 构建一层能够被复制的 RocksDB ,在这一层的时候它尚未 Transaction,可是整个系统如今的状态是全部写入的数据必定要保证它复制到了足够多的副本。也就是说只要我写进来的数据必定有足够多的副本去 cover 它,这样才比较安全,在一个比较安全的 Key-value store 上面, 再去构建它的多版本,再去构建它的分布式事务,而后在分布式事务构建完成以后,就能够轻松的加上 SQL 层,再轻松的加上MySQL 协议的支持。而后,这两天我比较好奇,本身写了 MongoDB 协议的支持,而后咱们能够用 MongoDB 的客户端来玩,就是说协议这一层是高度可插拔的。TiDB 上能够在上面构建一个 MongoDB 的协议,至关于这个是构建一个 SQL 的协议,能够构建一个 NoSQL 的协议。这一点主要是用来验证 TiKV 在模型上面的支持能力。视频

 。。。

相关文章
相关标签/搜索