前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谷歌的 Spanner 数据库是如何一步步支持 SQL 语法的

谷歌的 Spanner 数据库是如何一步步支持 SQL 语法的

作者头像
哒呵呵
发布2020-08-05 14:53:46
1.2K0
发布2020-08-05 14:53:46
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

闲来无事翻译一篇文章,是关于谷歌的全球分布式数据库 Spanners 的 SQL 的故事,作者 Jaana Dogan 是谷歌的一名工程师。关于 Spanner 的介绍可以参考前文:分析 Google Cloud Spanner 的架构

Spanner 之前是一个键值数据库,与现在谈论的 Spanner 是完全不同的东西。在设计之初,Spanner 就支持事务、外部一致性和透明的故障转移。到后面,Spanner 开始支持带类型的数据库表结构和其它的一些关系型数据库功能,以及支持了 SQL 功能。而现在我们正在努力改进 SQL 语法的兼容性和关系型数据库功能。

  • 事务:访问并可能更新数据库中各种数据项的一个程序执行单元(unit),详细的解释可以参考:https://stackoverflow.com/questions/974596/what-is-a-database-transaction
  • 外部一致性:由 google 提出用于解决数据库事务时间先后顺序的问题。详细的解释参考:https://www.zhihu.com/question/56073588
  • 透明的故障转移:当初始化连接出现问题无法连接时,透明的故障转移可以保证应用程序重新连接到可用服务。详细的解释可以参考:https://blog.csdn.net/cuiyan1982/article/details/80268183
早期

Spanner 刚开始是为了内部的工作场景而设计的,并没有考虑对外开放或者是做成云服务。而且由于谷歌内部使用的工具往往与外界使用的不同,是自成体系的。比如在谷歌内部的存储系统和数据库服务都有着自己的专属 API 或者是客户端。如果想要用自己喜欢的 ORM 库,抱歉,谷歌不支持,只有自己开发的 Stubby/gRPC API 和客户端。可能这会影响某些人的开发,但是,谷歌自信于能提供更好的 API 和客户端服务。

其实这段话代表着谷歌对于技术自信的态度,也解释了为什么 Spanner 在刚开始时为什么不会选择 SQL 语言,而是选择了自己独特的 API。后文则是详细描述了,为什么在谷歌使用 API 的形式开发要比使用 SQL 语言更好的理由,感兴趣的话可以阅读原文,就不翻译了。就我本人来看,不是所有的技术人才都能像谷歌那样优秀,易用性在某种程度上要比所谓的技术领先更重要,这也是为什么 MapReduce 的开发方式最终败给了 Spark,败给了 Hive。

开始了 SQL 的实验

F1 是 Spanner 开始 SQL 实验的第一步。F1 是 Google 开发的基于 Spanner 的分布式数据库。与 Spanner 不同的是,F1 支持:

  • 分布式SQL查询
  • 事务一致的二级索引
  • 可更改的历史记录和信息流

F1 是在 Spanner 之上的协调层中实现了这些功能,并将其他功能交给给 Spanner。

F1 的目的是为了支持广告产品。考虑到广告业务的性质和广告产品的复杂性,能够方便的编写和运行复杂的查询要比其它的特性更重要(因为使用 API 的方式不容易实现复杂的查询)。Spanner 在 F1 的加持下,更适用于重业务逻辑的系统。

  • 关于 F1 的论文可以参考:https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/41344.pdf
  • 这段话证明了 SQL 的表达能力要远远超过 API 的形式。
作为云服务的 Spanner

谷歌云将 Spanner 作为云服务之一提供给外部客户使用。在首次发布时,Spanner 支持用 SQL 查询数据库,而不支持 INSERT,UPDATE和 DELETE 对数据库的修改。

又因为 Spanner 本身还不是完整的可以使用的 SQL 数据库,导致了它缺少类似于 JDBC、database/sql 的驱动。只有作为云服务的 Spanner ,开始支持 SQL 的 INSERT,UPDATE和 DELETE 操作时,技术人员才会考虑去实现这些驱动。

开发人员常用的 JDBC 连接数据库的方式居然都不可用。

现在的话,Cloud Spanner 支持完整的 DDL 和 DML 语法,但是 SQL 的语法依然不是标准的 SQL 语法,类似于方言。ZetaSQL 是 Cloud Spanner 使用的 SQL 解析器和编译器(现已开源)。不仅如此,Cloud Spanner 还提供了 SQL 语句的分析工具。

  • ZetaSQL:https://github.com/google/zetasql
  • 还是那句话,不是所有的公司都是谷歌,要想自己的产品被绝大数人使用,那么就得选择能被大多数人接受的方式,比如 SQL,坚持自己的技术不放弃的话,虽一时领先,但最终只能像 MapReduce 沦为历史的淘汰品。
下一步

下一步 Spanner 会持续改进 SQL 的语法,以与标准的 SQL 语法兼容。通过使用标准的 SQL 语法,也可以帮助 Spanner 兼容大多数 ORM 框架。

除此以外,Spanner 还会努力弥补上相比传统关系型数据库缺失的功能,比如建表时支持默认值和自增 ID 等。

最终,Spanner 选择了妥协。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 早期
  • 开始了 SQL 的实验
  • 作为云服务的 Spanner
  • 下一步
相关产品与服务
TDSQL MySQL 版
TDSQL MySQL 版(TDSQL for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档