前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Google Cloud Spanner的实践经验

Google Cloud Spanner的实践经验

作者头像
ThoughtWorks
发布于 2022-08-26 06:20:11
发布于 2022-08-26 06:20:11
1.7K0
举报
文章被收录于专栏:ThoughtWorksThoughtWorks

Cloud Spanner是Google Megastore系统的继承者,Spanner表现出远超前辈的能力。Spanner首次是在Google内部数据中心中出现,而在2017年才对外发布测试版并加入了SQL能力。如今已经在Google云平台上架并拥有大量各个行业的用户。Cloud Spanner数据库是全球范围分布式关系型/事务数据库,并且Google承诺Cloud Spanner拥有高吞吐量、低延迟和99.999%的高可用性。

接触Cloud Spanner

第一次接触到Google Cloud Spanner是因为客户对于新技术的追求与尝试,将我们基本完成的APIs从原先的Google Cloud Sql迁移到Cloud Spanner数据库上。在做这个决定的时候,客户考虑到当时公司用户数量处于激增的阶段,业务也在不断进行更改,所以需要对表结构也进行更改来满足业务的需求。于是便决定使用Google Cloud Spanner来保证数据的ACID(原子性、一致性、隔离性和持久性)的前提下仍然可以对数据库进行水平拓展和分布式操作。

选择Cloud Spanner

和主流的云服务关系数据库相比,例如AWS的Aurora、GCP的Cloud SQL和Azure的SQLDB,这些数据库并没有实现在多节点上进行扩展的功能,只能在单个节点上进行垂直扩容(增加RAM或CPU数量)。

如果想要实现水平扩容,可以使用NoSQL数据库,例如HBaseMongoDB、DynamoDB或BigTable。但是这些数据库很难做到事务的特性,并且不能支持关系型数据库所支持的功能,例如连表等。并且因为NoSQL的查询语句和关系型数据库的语句区别很大,会导致应用中大量的查询语句和表结构需要重写。

而Cloud Spanner区别于这些数据库服务,是一种独特的数据库。它将事务,SQL查询和关系结构与NoSQL数据库的可伸缩性相结合。因此Cloud Spanner同时具备SQL和NoSQL数据库结构的优点。在最初的时候,Cloud Spanner是被设计为NoSQL的键值对的方式存储,但随着其对关系模型的需求被添加后,Cloud Spanner逐渐打破了NoSQL和SQL数据库之间的壁垒。

特性

作为分布式数据库

每一个Spanner的实例都是在不同数量的节点上运行的,每一个节点都是由Google云平台服务去自动管理的。因此,Cloud Spanner拥有很高的可扩展性,并且可根据请求负载和数据的大小进行自动分片(splits),为系统提供了更多的弹性空间。

作为关系型数据库

Cloud Spanner支持关系型数据库所有的功能,但Cloud Spanner不完全是关系型数据库,尽管Spanner的数据模型与任何其他关系数据库的数据模型基本相似,有预定义的数据元组,可以存储在关系(表)中并进行查询,但它缺乏约束。

Cloud Spanner拥有主键概念,并且必须为每个表定义主键,而且该主键是强制唯一性的。然而它没有foreign key的概念,取而代之的是interleave。在关系型数据库中,我们期望数据的强完整性,以确保能满足预定义的约束。Cloud Spanner在该方面的能力有所限制。

事务支持(ACID)

Cloud Spanner在事务上提供了最严格的并发控制,实现全球事务对外强一致性。在外部一致性的保证下,即使Cloud Spanner的实例位于多个数据中心上运行,事务也能在高性能和高可用性的前提下按顺序执行。Cloud Spanner能够实现外部一致性得益于TrueTime的功能特性。TureTime是Google为所有Google服务提供的高可用分布式的时钟。该时钟为应用提供单调递增的时间戳。Cloud Spanner 使用 TrueTime 的这一特性为事务分配时间戳。具体而言,每个事务都分配有一个时间戳,它为Cloud Spanner提供事务发生的时间。

其他特性

Cloud Spanner还有很多其他的特性,包括单区域和多区域配置、多语言支持等。

数据结构

Cloud Spanner和传统RDBMS的数据模型基本一致,都是由行、列和值组成,并且含有主键。Cloud Spanner中的数据是强类型,每个表需要定义一个架构,并且每一列的数据都需要制定数据类型。

其中,主键(PRIMARY KEY)被定义在表架构外。

数据的分布是通过主键实现的,因此在选择主键的时候需要尽量防止Cloud Spanner服务的热点(Hotspots),时间戳或者自增的序列数字都会造成热点问题出现,Cloud Spanner推荐使用随机(用户名等)的信息或者UUIDs作为主键。

交错表(Interleaved tables)

在Cloud Spanner中,是没有办法去定义两表之间外键(FOREIGN KEY)关系的。但是Cloud Spanner引入了一个类似的概念--交错表。

以上架构中表示为customers表创建accounts子表或“交错”表。其中需要注意的事项:

  • customer_id是子表accounts的主键之一,也是父表的customers的主键。在accounts声明为customers子表时,该主键是必须添加的,并且要保证命名、类型、限制等都必须一致。
  • 当插入子表时需要确保父表有对应的行(即以相同父表主键开头的行)。
  • 删除父表行需要满足其中两点之一:
    • 在子表中没有对应的行。
    • 声明ON DELETE CASCADE
  • ON DELETE CASCADE 声明表示,当父表中的某一行被删除时,子表中对应的行也会被自动删除。如果没有该声明,或声明为ON DELETE NO ACTION,则必须先删除子行,才能删除父行。
  • 交错行首先按父表的行进行排序,然后在父表共享主键的基础上,对子表进行再排序。
  • 在对数据库进行分片操作的时候,只要父表行以及子表行的大小在8GB以内,并且在子表行中没有热点,则每个父表以及子表的数据的存放区域关系会一同保留下来。

交错表的主要目的是为了加快某些查询操作,尤其是包含JOIN的操作。因为交错表直接改变了数据在云上的布局方式,确保在执行JOIN操作的时候不会访问集群的每个节点(Nodes)。

二级索引(Secondary indexes)

在Cloud Spanner中,主键会被自动设置为表的索引,Cloud Spanner也同时支持将其他非主键字段设置为二级索引。

其中UNIQUE INDEX关键字表示,该索引会强制该字段在插入时需要不重复。并且在极少情况下,Cloud Spanner可能会自动选择让查询延迟增加的索引,此时可以使用FORCE_INDEX关键字提供指定索引进行查询操作。

数据库分片(split)

在表之间,Cloud Spanner支持最多7层的父子关系,也就是可以将7个逻辑独立的表的行物理地存储在一起。当相关表数据不断增长,达到单个Cloud Spanner服务器的资源限制时,作为分布式数据库的Cloud Spanner会将数据划分为各个“split”区块,每个分片都可以被独立移动并分配给不同物理位置的多个服务器

分片包含一系列连续的行,这些行的开始和结束键称为“分片边界”(split boundaries)。Cloud Spanner 会根据大小和/或负载自动添加和移除分片边界,这样做会改变数据库中的分片数量。

基于负载进行分片

当数据库中的一个表上的10行数据的读取频率高于表中所有其他的行,Cloud Spanner就会为这10行中的每一行添加分片边界,以便于每一行是由不同的服务器处理,以此来避免这10行数据的读写操作只消耗单台服务器的资源(避免热点)。

表结构的更新

Cloud spanner支持对现有的数据库架构执行以下更新操作:

  • 新建表。新表格中的列可以为 NOT NULL。
  • 删除一个表,前提是该表内没有交错其他表,并且没有二级索引。
  • 将一个非主键列添加到任何表,新的非主键列不能为 NOT NULL。
  • 将 NOT NULL 添加到非主键列,不包括 ARRAY 列。
  • 从非主键列中移除 NOT NULL。
  • 从任何表中删除非主键列,前提是二级索引未在使用该列。
  • 将 STRING 列更改为 BYTES 列,或将 BYTES 列更改为 STRING 列。
  • 增加或减少 STRING 或 BYTES 类型的长度限制,前提是它不是由一个或多个子表继承的主键列。
  • 在值和主键列中启用或停用提交时间戳。
  • 添加或移除任何二级索引。

未来的趋势

基于Cloud Spanner独特的结构,它能确保客户在以较小的用户群和业务量为起点时,不必过多担心在未来数据量和业务量增长后需要对数据库进行迁移或重新编写的问题。Cloud Spanner在保证关系型数据库管理系统的特性前提下,同时提供数据库的超强延展性,并且可以在特定情况下对已存在的表的表结构进行结构更新。

因此,无论应用程序规模如何,Cloud Spanner都会是不错的选择,它能为应用提供包括事务支持、高可用性保证、只读副本以及轻松可伸缩性。

在《Google Cloud Spanner经济性分析》的文章中介绍到,Cloud Spanner的总花费比本地数据库服务花费低78%,比其他云平台数据库服务价格低37%。这得益于Cloud Spanner不需要用户为额外副本服务支出费用,就能确保数据库的高可用性。并且因为Cloud Spanner支持用户在不停机的情况下对数据库进行水平或垂直的缩放(由Cloud Spanner自动管理数据切片和数据复制)或对表结构进行更新例如添加索引等操作。

同时说明Cloud Spanner在使用经济上也提供了比自己维护的数据库服务更低的成本。

参考

  1. 外部一致性:https://cloud.google.com/spanner/docs/true-time-external-consistency#external_consistency
  2. Cloud Spanner所有特性:https://cloud.google.com/spanner#section-8
  3. Cloud Spanner数据类型:https://cloud.google.com/spanner/docs/data-types
  4. 提交时间戳:https://cloud.google.com/spanner/docs/commit-timestamp

本文版权属Thoughtworks公司所有,如需转载请在后台留言联系。

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

本文分享自 ThoughtWorks洞见 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Github星标百万而霸榜的大厂面试避坑指南,成功帮我规避“毁约”
可现实的求职情况却是一片困境:从中小微到“大厂”,应届生被毁约屡屡发生,“岗位面着面着就没有了”、“签了三方都能被毁约”,这些情况中还不乏985名校生。
愿天堂没有BUG
2022/09/07
4110
Github星标百万而霸榜的大厂面试避坑指南,成功帮我规避“毁约”
整理了2019年上千道Java面试题,近500页文档,用了1个月时间!
2.6、区分 BeanFactory 和 ApplicationContext。.
程序员追风
2019/11/25
1K0
整理了2019年上千道Java面试题,近500页文档,用了1个月时间!
2021 Java面试题大全(整理版)1000+面试题附答案详解,最全面详细,看完稳了!
进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全,其中概括的知识点有:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、
全栈程序员站长
2022/06/24
2.9K0
2021 Java面试题大全(整理版)1000+面试题附答案详解,最全面详细,看完稳了!
互联网大厂年度总结1000+道高频面试题(附答案解析)冲刺2021
进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全,其中概括的知识点有:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈共有1000+道面试题。
程序员白楠楠
2020/12/25
5.1K0
2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程
如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
欧阳愠斐
2019/02/20
1K0
2021春招Java后端开发面试总结【25个技术专题】超详细!
本文档是从阿里面试官整理的Java面试题;包含了Java基础、Java集合容器、Java异常、并发编程、JVM、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、Redis、MySQL数据库、消息中间件MQ与RabbitMQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty、 架构设计&分布式&数据结构与算法等等,都是互联网大厂的面试真题,已经有粉丝靠这份PDF拿下众多大厂的offer。每一份面试文档的左侧都有文档大纲,这也是为了方便大家阅读,特别整理的;文章限于篇幅,故这里只是部分面试题展示,详细的答案解析可以关注一下公众号:麒麟改bug,获取,编程的世界永远向所有热爱编程的人开放,这是一个自由,平等,共享的世界,我始终是这样坚信的。
Java程序猿
2021/01/15
2.7K0
2021春招Java后端开发面试总结【25个技术专题】超详细!
2021年春招,Java后端最全面试攻略,吃透25个技术栈
小编分享的这份春招Java后端开发面试总结包含了JavaOOP、Java集合容器、Java异常、并发编程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL数据库、消息中间件MQ、Dubbo、Linux、ZooKeeper、 分布式&数据结构与算法等25个专题技术点,都是小编在各个大厂总结出来的面试真题,已经有很多粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到大家!
Java程序猿
2021/01/21
2.2K0
2021年春招,Java后端最全面试攻略,吃透25个技术栈
2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程
如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
慕容千语
2019/06/11
9440
2021金三银四,啃完这35个Java技术栈,冲刺年薪百万!
2021金三银四,年假准备跳槽的小伙伴注意了,小编在这里为你们准备了Java后端必备的35个专题面试技术栈!都是小编在各个大厂总结出来的面试真题,小编这次分享涵盖了Java后端面试必问的35个技术点:JVM、Linux、MyBatista、Spring Boot、Spring、SQL优化、Tomcat、Zookeeper、消息中间件、Dubbo、MongoDB、MySQL、RabbitMQ、Redis、Spring Cloud、并发编程、开源框架、ActiveMQ、等35个专题技术栈分享给到大家,希望年后能助大家一臂之力,挺进一线互联网大厂,冲刺年薪百万!
Java程序猿
2021/01/27
1.9K0
2021金三银四,啃完这35个Java技术栈,冲刺年薪百万!
2021年突破年薪百万难关!吃透这套Java真题合集
我相信大多 Java 开发的程序员或多或少经历过BAT一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析,阐述下如何去准备,去回答面试官的提问,可以和面试官有个愉快的交谈。
Java程序猿
2021/02/28
8240
2021年突破年薪百万难关!吃透这套Java真题合集
吃透 BATJ JAVA 面试精选 1000题,拿大厂offer 好像也没想象中那么难!
本文收集整理了各大厂常见面试题N道,你想要的这里都有内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,希望大家都能找到适合自己的公司,开开心心的撸代码。
用户5546570
2021/01/13
5710
吃透 BATJ JAVA 面试精选 1000题,拿大厂offer 好像也没想象中那么难!
5月,必须跳槽
今年以来,经过了疫情、裁员、铜三铁四,互联网大厂终于迎来了应届生集中求职的5、6月。 对于想跳槽的职场人来说,绝对是个找工作的好时机。这时候,很多高薪技术岗、管理岗的缺口和市场需求就出来了。 这类岗位,一般对工作经验要求较高,也很少有企业愿意降低要求录用毕业生,所以3~5年左右工作经验的职场人,此时跳槽,优势更加明显。 大家要好好把握上半年最后的机会啊,经历过裁员阵痛,中国互联网已经进入了下半场,而对于每一个从事IT行业的人来说,拥有更强的职业技能和技术能力已成为了必备的条件。 所以在面试跳槽前,给大家整理
Java3y
2022/05/18
7240
5月,必须跳槽
这也许是22年国内最牛的Java面试八股文合集(全彩版),不接受反驳
金三银四虽然早就结束,但想找工作的小伙伴依旧很多,很对小伙伴已经开始储备技术,准备秋招面试了。 为了帮助小伙伴更好的应对面试,我拉来十几个大佬,汇总一线大厂的情况,给你整了一套超全的面试资料: 1658页Java面试突击核心讲包含的知识点也是比较广比较多的:java基础、JVM、多线程、MySQL、spring、springboot、springcloud、dubbo、mybatis、redis、网络IO、Linux、MQ、zookeeper、netty、大数据、算法、项目、设计模式等等;刷完这一套高质量题集,下一个金九银十妥妥的~
java小乐
2022/08/03
2.6K0
秋招,涵盖Java全栈面试八股文,让面试手到擒来
今天带来的是2022全新升级的 《Java岗面试核心MCA版》 ,这个版本里面不仅仅包含了面试题,还有更多的技术难点、 大厂算法、实战项目、简历模板 等等, 全册接近1700页 !相比上一个版本的287页,升级了多少内容可想而知!!!
java小乐
2022/07/30
1.9K0
秋招,涵盖Java全栈面试八股文,让面试手到擒来
2020最常见的200+Java面试题汇总(含答案解析)
2020年快要结束了,很多朋友问题,有没有整理今年的一些面试题,最近抽时间整理了一份Java面试题。或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。
程序员追风
2020/11/07
10.5K8
Java微服务面试题(2021最新版)
Spring 作为一个轻量级的 Java 开发框架,将面向接口的编程思想贯穿整个 Java 系统应用,因此在 Java 面试中常被提。本次介绍的主要是解析面试过程中如果从源码角度分析常见的问题,为了方便大家阅读,小编这里还整理了一份微服务方面的思维导图,分享给到大家。
Java程序猿
2021/04/09
9.9K0
Java自动化测试,必备知识梳理及面试题分享
Hi,大家好。在此之前投送过Python知识梳理:8张思维导图,梳理Python知识体系。以及Java知识梳理:28张思维导图,梳理Java知识体系。
可可的测试小栈
2021/12/05
1.9K0
Java自动化测试,必备知识梳理及面试题分享
面试必备:Java 面试最常见的 200+ 题
说了这么多,直奔主题,这套面试必备的《Java 最常见 200+ 面试题全解析》到底优质在哪?
CSDN技术头条
2020/03/16
1K0
2022年Java秋招面试,程序员求职必看的Dubbo面试题
网上很多Dubbo面试题都没有答案,所以花了很长时间搜集,本套Dubbo面试题大全,汇总了大量经典的Dubbo程序员面试题以及答案,包含Dubbo语言常见面试题、Dubbo工程师高级面试题及一些大厂Dubbo开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习!
Java程序猿
2022/06/26
7520
如果没准备这些面试题,找工作还是先缓缓吧
Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux等技术栈……
JAVA葵花宝典
2020/02/27
7300
推荐阅读
相关推荐
Github星标百万而霸榜的大厂面试避坑指南,成功帮我规避“毁约”
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档