10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

快速搭建 Cloud Spanner DevOps 环境

郭斌

2020 年 11 月 03 日

快速搭建Cloud Spanner DevOps环境

Cloud Spanner 作为一种云原生数据库,是没有本地部署的版本的;如何在本地部署中获得 Cloud Spanner 开发测试环境,并融于 DevOps 的持续集成中,是很多开发的同学思考的问题。那么究竟 Cloud Spanner 是如何帮助开发者快速搭建 DevOps 环境的呢?请不妨读完这篇文章。


Cloud Spanner 模拟器

Cloud Spanner 提供了一个本地内存模拟器,可以运行在容器环境中,你可以使用该模拟器来免费开发和测试应用,而无需创建 GCP 项目或帐号。由于模拟器仅将数据存储在内存中,数据在各次运行之间不会保留。模拟器提供与 Cloud Spanner 生产服务相同的 API,用于本地开发和测试,而不是用于生产部署。模拟器支持除 C#(即将支持)以外的所有客户端库语言。你还可以将模拟器与 gcloud 命令行工具以及 REST API 结合使用。该模拟器还是 GitHub 中的开源项目。


使用 Cloud Spanner 模拟器

容器环境的模拟器跑起来

% gcloud components update% gcloud beta emulators spanner startExecuting: docker run -p 127.0.0.1:9010:9010 -p 127.0.0.1:9020:9020 gcr.io/cloud-spanner-emulator/emulator:1.0.0[cloud-spanner-emulator] Unable to find image 'gcr.io/cloud-spanner-emulator/emulator:1.0.0' locally[cloud-spanner-emulator] 1.0.0: Pulling from cloud-spanner-emulator/emulator
复制代码


最简单的方法就是使用 gcloud 命令行工具将 Cloud Spanner 模拟器拉起来,从上面的命令行的输出你可以发现,其实 gcloud 命令行工具是启动的 Cloud Spanner 模拟器的容器(通常来说,请确保你的系统里面已经安装了 Docker 的环境),所以你也可以直接使用 Docker 命令行工具来运行模拟器。


docker pull gcr.io/cloud-spanner-emulator/emulatordocker run -p 9010:9010 -p 9020:9020 gcr.io/cloud-spanner-emulator/emulator
复制代码


使用 gcloud 命令行工具访问模拟器

  gcloud config configurations create emulator  gcloud config set auth/disable_credentials true  gcloud config set project your-project-id  gcloud config set api_endpoint_overrides/spanner http://localhost:9020/gcloud config configurations activate [emulator | default]
gcloud spanner instances create test-instance \ --config=emulator-config --description="Test Instance" --nodes=1gcloud spanner instances list
gcloud spanner databases create mydb --instance=test-instance
gcloud spanner databases ddl update mydb --instance=test-instance --ddl='CREATE TABLE test_table(id string(max),city string(max)) primary key(id)'gcloud spanner databases ddl describe mydb --instance=test-instance
gcloud spanner databases execute-sql mydb --instance=test-instance --sql="insert into test_table(id,city) values('1','Beijing')";gcloud spanner databases execute-sql mydb --instance=test-instance --sql="select * from test_table";
复制代码


使用客户端来访问模拟器

客户端通过 Cloud Spanner 的驱动来访问模拟器的时候,只需要做如下的环境变量的设置。


export SPANNER_EMULATOR_HOST=localhost:9010
复制代码


通过简单的配置,就可以开始使用 Cloud Spanner 模拟器开始开发啦,并下一步将 Cloud Spanner 模拟器的容器镜像部署在 DevOps 环境中。


模式管理

查看当前的模式

开发的同学经常需要导出整个数据库的模式,Cloud Spanner 提供 gcloud 命令行工具满足这个需求。


gcloud spanner databases ddl describe \    --instance="${SPANNER_INSTANCE}" "${SPANNER_DATABASE}" \    --format='value(format("{0};\    "))' > /tmp/schema.ddl
复制代码


当然,你也可以使用 DBeaver、Spanner-cli 等工具软件来查看模式,其中 DBeaver 提供了图形化操作界面,Spanner-cli 提供了类似于 MySQL 客户端的终端访问。


发布更新的模式


实施 DevOps,需要实现发布数据库模式变更的自动化,这其中就包括了如何获取历史的和当前的模式,并能够比较和识别模式的变更,最终发布更新的模式。Cloud Spanner 提供了开源的模式变更的工具软件 Spanner schema diff tool 来实现比较和识别模式的变更。


举例如下:


#!/bin/bash# Replace placeholders in these variable definitions.SPANNER_INSTANCE="my-instance"SPANNER_DATABASE="my-database"UPDATED_SCHEMA_FILE="updated.ddl"# Exit immediately on command failure.set -e# Read schema into a file, removing comments and adding semicolons between the statements.gcloud spanner databases ddl describe \    --instance="${SPANNER_INSTANCE}" "${SPANNER_DATABASE}" \    --format='value(format("{0};\    "))' > /tmp/original.ddl# Generate ALTER statements.java -jar target/spanner-ddl-diff-*-jar-with-dependencies.jar \      --allowRecreateIndexes \      --allowRecreateForeignKeys \      --originalDdlFile /tmp/original.ddl \      --newDdlFile "${UPDATED_SCHEMA_FILE}" \      --outputDdlFile /tmp/alter.ddl# Apply alter statements to the database.gcloud spanner databases ddl update "${SPANNER_DATABASE}" --instance="${SPANNER_INSTANCE}" \    --ddl="$(cat /tmp/alter.ddl)"
复制代码


从 MySQL 迁移到 Spanner

很多开发的同学使用 MySQL 和 Postgres 很长时间了,想很快上手使用 Cloud Spanner。有没有什么办法,可以将 MySQL 和 Postgres 的开发测试的数据库模式和数据转化到 Cloud Spanner,然后很快就可以开始进一步的开发了。


答案是有的。Cloud Spanner 提供了开源的工具 Harbourbridge; 利用这个工具,可以实现主要的库表的模式转换和开发测试数据的导出/导入。而且,Harbourbridge 支持 Cloud Spanner 模拟器,可以很方便地将 MySQL / Posgres 的库表转化到 Cloud Spanner 模拟器中。


下面以 MySQL 为例:


#使用mysqldump导出,并导入到Cloud Spanner,必要时增加user,password等命令行参数mysqldump mydb | harbourbridge -driver=mysqldump#直接从dump文件导入到Cloud Spanner;dump文件通常几十GB以内;harbourbridge -driver=mysqldump < my_mysqldump_file#指定导入的Cloud Spanner的实例信息mysqldump mydb | harbourbridge -driver=mysqldump -instance my-spanner-instance#指定导入的Cloud Spanner的数据库信息mysqldump mydb | harbourbridge -driver=mysqldump -dbname my-spanner-database-name#指定生成的文件的信息,这些文件包括日志、模式文件、错误日志等mysqldump mydb | harbourbridge -prefix mydb. -driver=mysqldump
复制代码


从 MySQL / Postgres 到 Cloud Spanner 的数据库模式转换可能还存在不完善的地方,通常在 Harbourbridge 的日志中可以看到,并通过手工修改的方式来完善数据库模式的转换。


参考文档


1.https://cloud.google.com/spanner/docs/emulator


2.https://github.com/GoogleCloudPlatform/cloud-spanner-emulator


3.https://github.com/GoogleCloudPlatform/spanner-schema-diff-tool


4.https://github.com/cloudspannerecosystem/harbourbridge


2020 年 11 月 03 日 14:29622

评论

发布
暂无评论
发现更多内容

学完定级P7!阿里内部10W字性能优化实战手册太强了!上线3天Github获赞68.9K

程序员小毕

Java 程序员 架构 面试 性能优化

架构师实战营模块五

ifc177

【Flutter 专题】119 图解简易 ACEFrameAnimated 帧动画

阿策小和尚

5月日更 Flutter 小菜 0 基础学习 Flutter Android 小菜鸟

人生算法:复利,营造长期的局部垄断

石云升

读书笔记 思维模型 5月日更 人生算法

基于ECS搭建FTP服务

若尘

阿里云 服务器 5月日更

阿里巴巴2021年最新最全500道Java后端面试大全(值得收藏)

Crud的程序员

Java 架构 编程语言 Java工程师

Redis - 持久化

旺仔大菜包

redis

Spark如何进行动态资源分配

数据社

spark 5月日更

已经成功拿到字节offer,阿里内部二十三万字 Java 面试题总结

云流

Java 程序员 架构 面试

HashMap源码分析(一)

泽睿

源码分析 hashmap

这是我在银四拿到的第6个offer!分享我的成功秘籍:阿里巴巴 Java 面试参考指南(2021 最新版)

云流

Java 程序员 架构 面试

网友:这个开源操作系统超现实就算了,还霸榜 GitHub 两天了!(附视频)

马小晴

Java 开源 编程 程序员 游戏

Java也太卷了,应届生找工作都需要准备这些知识点了!

Java架构师迁哥

ubuntu64 位搭建 OpenVINO 系统(下篇)

IT蜗壳-Tango

5月日更

LogBack 日志等级设置无效,原因竟然是因为这个

楼下小黑哥

spring springboot logback

有点东西,GC与内存泄漏之间的联系分不清,居然也可以进微软?

Java架构师迁哥

爆赞!GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

Java 编程 程序员 架构师 IntelliJ IDEA

随机数在区块链中的应用

CECBC区块链专委会

女裤裤兜如何影响工业设计?

脑极体

Redis集群JedisCluster的pipeline自定义实现

叫我阿柒啊

redis cluster pipeline JedisCluster lettuce redission

SM和PO如何参与Daily Scrum——《Scrum指南》重读有感(3)

Bruce Talk

Scrum 敏捷 随笔 Agile

原来真的有外卖员转行学Java,还三面“拿下”拼多多offer!

Java架构师迁哥

消息队列并不能解耦

Xargin

阿里内部面试手册,Github 上获赞 80K,无论工作几年都可以看看

云流

Java 编程 架构 面试

小王毕业两年转行学Java,现在过得比科班生过得还好?

Java架构师迁哥

2021年最新阿里、腾讯、华为、京东300+道面试题,掌握80%进大厂

Crud的程序员

Java 编程 程序员 架构

华为内部论坛爆火的一份:Java面试培训笔记,秒变资深面试官

Java架构师迁哥

21岁就走了“狗屎运”(4面拿字节跳动offer Java岗)

Java架构师迁哥

21分钟 MySQL 入门教程

???

MySQL 编程

限时分享:Alibaba技术官整理出来的Java零基础学习笔记

Java架构师迁哥

通过混沌测试发现 HTTP/2 缺陷

卫智雄

快速搭建Cloud Spanner DevOps环境-InfoQ