专栏首页鸿的学习笔记谈谈 Spanner 和 NewSQL

谈谈 Spanner 和 NewSQL

关于昨天 Spanner 的文字,有人问 NewSQL 为什么会起名为 New,Spanner 的应用场景又是怎样的?那么这篇就顺着大数据的历史继续聊。

要聊 NewSQL 问什么要称为 NewSQL,它与之前的 SQL 和 NoSQL 有什么不同呢?要回答这个问题,必须要先了解数据库和大数据的发展历史。

数据库从1988年 IBM 发明第一代关系型数据库 SystemR 开始,到目前为止关系型数据库已经过去三四十年了。所谓关系型数据,指的是其数学理论基础-关系代数(不懂关系代数,或者说集合论的,自己回去翻教科书)中的关系二字。基于关系代数,衍生出来的语言是 SQL 。在这里要重点提一下,1990年代,当今最重要的两个开源关系数据库诞生了。1995年在瑞典,基于 ISAM 的 mSQL 系统诞生了 MySQL。而在1994年,两个伯克利大学的研究生在 QUEL 的 Postgres 的代码上添加了 SQL 支持诞生了 PostreSQL 。

关系型数据库最为核心的一点就是事务。由于系统经常会发生各种意外,比如:

  1. 数据写入到数据库时,突然因为网络、硬件故障等原因中断
  2. 应用程序由于某个 Bug 的存在,崩溃
  3. 多个客户端同时写入数据库,数据可能出现丢失
  4. 。。。

因此,数据库使用了事务去解决这些问题,保证执行数据库的一系列操作要么同时成功,要么同时失败。失败后,应用程序可以安全的进行重试,无需担心部分失败的问题。在某些情况下,这个也被称为一致性。

另外再简单的介绍下 CAP 定理,下面来自于维基百科:

对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

可以这么理解,在 NewSQL 之前,传统的关系型数据库选择了强 CP ,放弃 A ,因此被局限于一个单机系统。

数据库的历史先放到一边,先来回顾下大数据的历史。前面提到过谷歌发明了 BigTable ,BigTable 虽然挂着一个 Table 的名头,但是 BigTable 本质上还是一个 Key-Value 存储,只不过使用了数据库里的 Table 、Row、 Column 的概念而已。(你可以把它的 key 简单理解为 row + column + timestamp 的集合体)

BigTable 开启了 NoSQL 的潮流,从某些角度来说,BigTable 给当时的业界一盏明灯,告诉业界,数据存储系统还有另一种实现方式,只要放弃强一致性,就能获得大规模高并发、高可用性和可扩展性。于是,NoSQL 的潮流来了。

坦白来讲,BigTable 的开源实现 Hbase 的查询功能并不好用,关于数据库的复杂逻辑都交给了应用程序去实现,例如要跑一个数据聚合查询,SQL 可能就一条语句实现了(select count(*)),但是 Hbase 则要专门程序去实现这事(例如写 for 循环)。此外,如果批量更新数据,也需要应用程序保证数据不会被部分更新,恰当地处理各种报错。显然,这大大的增加了应用程序的复杂性,把应该属于数据库完成的事交给了应用程序去做,用户体验相当不好。

NoSQL 虽有很多不足,但是随着2000年后互联网业务的大发展,它们面临着大规模的用户数量和并发操作,并且要保证 7*24 小时在线。传统的关系型数据库要支持这样的业务只能不断地升级内存、CPU和硬盘,显然到最后,硬件的成本会高到企业无法承受。互联网业务大部分对于事务也不是那么强要求,BigTable 等支持高并发、水平可扩展的 NoSQL 数据库成了很好地选择。另外,如果业务对数据库事务有要求,需要“对原有的单节点数据库进行数据分片,并存放到由廉价机器组成的分布式的集群里。对于应用程序来说,数据库中间件是一个逻辑上的单节点数据库,但实际上它的存储横跨了多台物理机器。当应用向数据库发起操作时,数据库中间件会自动将操作指令发送到集群中的一个或多个节点来执行。节点执行之后将结果发送回中间件,再由中间件反馈给应用。”使用数据库中间件,业务就需要自己管理数据分片和数据再平衡,嗯,做过这事的都知道,这有多痛苦。

遇到这问题并给出第一个解决方案的是谷歌。谷歌的搜索系统使用的是GFS 、MapReduce 和 BigTable ,但是广告部门一直使用的是 MySQL 集群。在前一篇文章也聊过谷歌广告部门的需求,它们需要 SQL 语言,需要高并发,需要可水平扩展,需要满足 ACID,但是又不需要自己管理数据分片和机器数量变化后的数据再平衡。总的来说,新的数据库既要有关系型数据库的优点,又要兼顾 NoSQL 的优点。这就是 Spanner 。

大数据的下半场开始了,也就是现在很火的 NewSQL 世界。Spanner 的诞生向业界证明了底层使用类似 NoSQL 的数据库存储数据,把计算上推以实现事务和 SQL 是可以兼得关系型数据库和 NoSQL 双方的优点。

现在 NewSQL 为什么 New 呢?读到这里,读者应该有了初步的答案,现在再小结一下:

  1. NewSQL 采用了全新的架构,例如存储层使用 NoSQL 存储数据,计算层实现事务和 SQL 语言。
  2. NewSQL 相比于 NoSQL 有完善的事务,支持强一致性,事务级别一般都到了可线性化。
  3. NewSQL 相比于传统的关系型数据库,它可以分布式水平扩展,上层无需关心底层的数据分片和再平衡逻辑。
  4. 得益于硬件技术的发展,极大地减少了 CAP 理论中的 P(分区容错性)的可能性,使得 C(一致性) 和 A(可用性) 可以兼得。
  5. 由于 Raft 算法等分布式一致性和共识算法的发展,相比于传统数据库的集群模式,NewSQL 实现了真正的高可用、高可靠(不用再担心单机的宕机而导致整个系统不可用)。

最后再简单评价下 Spanner ,谷歌目前把 Spanner 放在了它的云上提供服务,据说价格比较昂贵。Spanner 最大的“黑科技”在于使用了原子钟和 GPS 服务的 TrueTime API,由于 TrueTime 的存在,Spanner 解决了分布式系统中最重要的时间问题,实现了真正的全球的事务,换句话说,无论你在亚洲还是北美,看到的底层数据库中的数据都是一致的。

我想 Spanner 相对于谷歌这种跨国企业是有必要的,再比如亚马逊、微软(只不过一直都没有爆出来有相似的实现)。并且,对于很多银行和金融相关的企业,有了 Spanner ,再也不需要高端机器去保证两地三中心的数据一致性。除此以外,对于大部分企业,可能就是一个好看不好用的花架子吧。

除了使用 Spanner 以外,Spanner 独特的架构也启发了 TiDB 、CockcoarhDB 等一系列数据库的发展,虽然这些新的数据库没有 TrueTime 这样的黑科技,但是使用 NTP 协议来实现单机房下的可扩展性和事务,绰绰有余了。

本文分享自微信公众号 - 鸿的笔记(goodreadman),作者:鸿影洲冷

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 漫谈数据库模型

    数据库是软件世界里的基础。它是现实世界的投射,反应了开发者对现实世界的思考以及对其的抽象;一旦决定了数据库选型,数据库便会对软件/应用造成深远影响,它决定了开发...

    哒呵呵
  • 推荐一个学习和了解数据库知识的网站

    最近发现一个有趣的网站,是专门收集世界上所有的数据库信息的网站,类似于维基百科性质的,名字也很有趣叫做Database of Databases,翻译成中文也就...

    哒呵呵
  • 大数据技术发展简史(第一篇万字长文)

    在写这篇文章之前,断断续续地写过一些大数据组件的历史和它的一些评价,但是感觉不过瘾,历史本来就应该是连续的、有其内在的规律,便想写一篇文章总结大数据技术发展的历...

    哒呵呵
  • 【DB笔试面试507】基于数据库的数据复制技术构建灾备方案有哪些?

    基于数据库的数据复制技术大体上可分为两类:数据库自己提供的数据容灾模块和第三方厂商提供的数据库复制技术。以最常见的Oracle数据库为例,Oracle自己的数据...

    小麦苗DBA宝典
  • 关系型数据库和非关系型数据

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    chenchenchen
  • 聊聊Java数据库开发的那点事儿

    无论你开发的是一款PC端的Web应用,还是一款移动端的app,都需要一个数据库来存储你的业务数据(包括电商的商品信息、游戏的道具信息、社交的人员信息等等)。可以...

    企鹅号小编
  • 这是篇Java数据库开发的干货,你确定不收藏吗?

    无论你开发的是一款PC端的Web应用,还是一款移动端的app,都需要一个数据库来存储你的业务数据(包括电商的商品信息、游戏的道具信息、社交的人员信息等等)。可以...

    老九君
  • Java Redis系列1 关系型数据库与非关系型数据库的优缺点及概念

    在学习redis之前我们先来学习两个概念,即什么是关系型数据库什么是非关系型数据库,二者的区别是什么,二者的关系又是什么?

    一只胡说八道的猴子
  • 连载 | 深入浅出理解云数据库,年薪百万DBA之路 · 第二回

    为帮助开发者更好的了解和运用数据库,腾讯云数据库团队特出品《深入浅出理解云数据库》系列文章,从数据库的基本概念到云数据库特性及应用,从数据库基础原理知识到腾讯...

    腾讯云数据库 TencentDB
  • 使用VS2010的Database 项目模板统一管理数据库对象

    Visual Studio 2010 有一个数据库项目模板:Visual Studio Database Project(以下简称VSDP),VS 2003/2...

    张善友

扫码关注云+社区

领取腾讯云代金券