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 emulatorgcloud config set auth/disable_credentials truegcloud config set project your-project-idgcloud 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 listgcloud spanner databases create mydb --instance=test-instancegcloud 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-instancegcloud 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


相关推荐