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 start
Executing: 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/emulator
docker 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=1
gcloud 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
评论