元数据备份恢复和 DistSQL 转换功能解读
背景
DistSQL(Distributed SQL)是 Apache ShardingSphere 特有的操作语言,它让用户可以像操作数据库一样操作 ShardingSphere,带来了方便又强大的动态管理能力。
有了 DistSQL [1] 之后,我们能够在线定义各种资源和规则,再也不必面对「修改 YAML 文件 + 重启系统」的压力了。
Q & A
随着 DistSQL 能力的增强,用户使用越来越多,也提出了一些关于 DistSQL 的疑问。其中一部分与今天的主题有关,归纳如下:
🔍 DistSQL 定义的规则保存在哪里?
✍️ DistSQL 定义的规则保存在治理中心。在集群模式下,治理中心可以是 ZooKeeper 或者 etcd;在单机模式下,用户也可以指定持久化方式,缺省值是 H2 非持久化模式。推荐用户使用集群模式。
🔍 当有多个测试环境时,怎么把 DistSQL 定义的配置转移到新的环境?
✍️ 无论是单机还是集群模式,将治理中心的数据备份转移到新的环境是比较麻烦的。DistSQL 提供 EXPORT
语法,能够将逻辑库配置导出为 YAML 格式,方便用户迁移。
🔍 我们有定时备份数据的要求,请问逻辑库的配置怎么备份?我是用 DistSQL 定义的。
✍️ 与前一问相同,用 EXPORT
导出为 YAML 文件即可作为备份。
🔍 YAML 格式放到新的 ShardingSphere 实例下,要重启生效吗?
✍️ EXPORT
语句导出的 YAML 文件可以直接放在 Proxy 的 conf 目录下,如果 Proxy 正在运行,则需要重启才能生效。更方便的方式是通过执行 IMPORT
语句,让 Proxy 从 YAML 加载数据后写入治理中心,这种方式是动态生效的,无需重启。
🔍 我配置了分片和读写分离规则,查询的时候只能分别 show [2][3] 吗?有办法一起展示出来吗?
✍️ EXPORT
语句也可以用于快速查看逻辑库配置,当不指定 TO FILE 参数时,EXPORT
的结果输出在查询结果集中。
🔍 DistSQL 看起来很好,但我以前用 YAML 配置的,不会写 DistSQL 语法,有人可以教我吗?
✍️ 社区贴心的准备了 CONVERT
语法,帮助用户将 YAML 转换为 DistSQL 语句,可以对照学习或直接复制执行。
在以上问题的解答中,我们看到了 EXPORT
、IMPORT
和 CONVERT
这几个语法,它们的作用是什么,有哪些具体用法? 现在,就让我们开始今天的解读吧!
语法排查
EXPORT DATABASE CONFIGURATION
用于将逻辑库的配置(含数据源和规则)导出为 YAML 格式。
EXPORT DATABASE CONFIGURATION (FROM databaseName)? (TO FILE filePath)?
说明如下:
▪️FROM databaseName 用于指定要导出的逻辑库;
▪️未指定 FROM databaseName 时,导出当前使用的逻辑库;
▪️当指定 TO FILE filePath 参数时,导出信息将输出到目标文件中。
▪️若文件不存在,会自动创建;若文件已存在,将会被覆盖;
▪️filePath 为 STRING 类型。
IMPORT DATABASE CONFIGURATION
用于将 YAML 中的配置(含数据源和规则)
导入到当前逻辑库中
IMPORT DATABASE CONFIGURATION FROM FILE filePath
说明如下:
▪️ 待导入的文件必须符合 Proxy 的 YAML 配置格式。
▪️ 导入目标必须是空的逻辑库,即当前使用的逻辑库中不存在存储节点和规则配置;
▪️ 文件中必须包含 databaseName 并且与当前操作的逻辑库名一致。
▪️ 文件中必须包含 dataSources 存储资源配置;
▪️ filePath 为 STRING 类型。
CONVERT YAML CONFIGURATION
用于将 YAML 配置转换为对应的 DistSQL 语句。
CONVERT YAML CONFIGURATION FROM FILE filePath
说明如下:
▪️ 待转换的文件必须符合 Proxy 的 YAML 配置格式;
▪️ filePath 为 STRING 类型
实战演练
本次演示以 MySQL 场景为例,ShardingSphere-Proxy 部署为集群模式。
环境准备
-
在 MySQL 中创建两个库 demo_ds_0 和 demo_ds_1;
-
启动 ZooKeeper 服务;
-
在 ShardingSphere-Proxy 的 server.yaml 中配置 mode 信息,并启动 [4]。
配置逻辑库
-
创建逻辑库
CREATE DATABASE sharding_db;
USE sharding_db;
-
注册存储节点
REGISTER STORAGE UNIT ds_0 (
URL="jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false",
USER="root",
PASSWORD="123456",
PROPERTIES("maximumPoolSize"=10)
),ds_1 (
URL="jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false",
USER="root",
PASSWORD="123456",
PROPERTIES("maximumPoolSize"=10)
);
-
创建分片规则
CREATE SHARDING TABLE RULE t_order (
STORAGE_UNITS(ds_0,ds_1),
SHARDING_COLUMN=order_id,TYPE(NAME=MOD,PROPERTIES("sharding-count"=4)),
KEY_GENERATE_STRATEGY(COLUMN=order_id,TYPE(NAME="snowflake"))
);
操作流程如下:
通过以上操作,我们动态的创建了一个逻辑库
sharding_db
,其存储节点信息和分片规则都将保存在治理中心 ZooKeeper 中。
EXPORT DATABASE CONFIGURATION
仅查看配置
EXPORT DATABASE CONFIGURATION;
# 或
EXPORT DATABASE CONFIGURATION FROM sharding_db;
执行示例
mysql> EXPORT DATABASE CONFIGURATION;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| result |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| databaseName: sharding_db
dataSources:
ds_1:
password: 123456
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
minPoolSize: 1
connectionTimeoutMilliseconds: 30000
maxLifetimeMilliseconds: 2100000
readOnly: false
idleTimeoutMilliseconds: 60000
maxPoolSize: 10
ds_0:
password: 123456
url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
minPoolSize: 1
connectionTimeoutMilliseconds: 30000
maxLifetimeMilliseconds: 2100000
readOnly: false
idleTimeoutMilliseconds: 60000
maxPoolSize: 10
rules:
- !SHARDING
autoTables:
t_order:
actualDataSources: ds_0,ds_1
keyGenerateStrategy:
column: order_id
keyGeneratorName: t_order_snowflake
logicTable: t_order
shardingStrategy:
standard:
shardingAlgorithmName: t_order_mod
shardingColumn: order_id
keyGenerators:
t_order_snowflake:
type: snowflake
shardingAlgorithms:
t_order_mod:
props:
sharding-count: '4'
type: mod
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)
执行
EXPORT DATABASE CONFIGURATION
后,逻辑库配置就以经典的 YAML 格式呈现出来了。
输出到 YAML 文件
EXPORT DATABASE CONFIGURATION TO FILE '/Users/xx/sharding_db.yaml';
# 或
EXPORT DATABASE CONFIGURATION FROM sharding_db TO FILE '/Users/xx/sharding_db.yaml';
执行示例
mysql> EXPORT DATABASE CONFIGURATION TO FILE '/Users/xxx/sharding_db.yaml';
+------------------------------------------------------------------+
| result |
+------------------------------------------------------------------+
| Successfully exported to:'/Users/xxx/sharding_db.yaml' |
+------------------------------------------------------------------+
1 row in set (0.01 sec)
加上
TO FILE
参数之后,
EXPORT DATABASE CONFIGURATION
的结果就输出到了指定的文件中。下图展示了
sharding_db.yaml
的内容:
IMPORT DATABASE CONFIGURATION
在导出成功之后,我们可以使用 sharding_db.yaml 在任意的 ShardingSphere-Proxy 中进行导入操作。为了方便演示,我们将当前元数据中的 sharding_db 删除,并通过 IMPORT 语句进行导入。
准备新库
USE shardingsphere;
DROP DATABASE sharding_db;
CREATE DATABASE sharding_db;
EXPORT DATABASE CONFIGURATION FROM sharding_db;
执行示例
mysql> USE shardingsphere;
Database changed
mysql> DROP DATABASE sharding_db;
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE DATABASE sharding_db;
Query OK, 0 rows affected (0.02 sec)
mysql> EXPORT DATABASE CONFIGURATION FROM sharding_db;
+----------------------------+
| result |
+----------------------------+
| databaseName: sharding_db
|
+----------------------------+
1 row in set (0.01 sec)
通过以上操作,我们创建了一个新的逻辑库
sharding_db
,该逻辑库中没有任何配置信息。
导入逻辑库
USE sharding_db;
IMPORT DATABASE CONFIGURATION FROM FILE '/Users/xx/sharding_db.yaml';
执行示例
mysql> USE sharding_db;
Database changed
mysql> IMPORT DATABASE CONFIGURATION FROM FILE '/Users/xx/sharding_db.yaml';
Query OK, 0 rows affected (1.06 sec)
这样,我们就将导出的逻辑库配置恢复到了在线的 ShardingSphere-Proxy 中,简单方便。
想要检查导入的结果,也可以通过 SHOW 和 EXPORT DATABASE CONFIGURATION 语句进行确认。
CONVERT YAML CONFIGURATION
在
EXPORT
和
I
MPOR
T
的基础上,
CONVERT YAML CONFIGURATION
语法为我们带来了更多可能:
-
帮助习惯 YAML 的用户过渡到 DistSQL 动态管理;
- 对于不方便拷贝文件进行导入的场景,可以将导出的 YAML 转换为 DistSQL,通过 SQL 客户端来迁移配置;
接下来,让我们把
EXPORT
导出的
sharding_db.yaml
转换为 DistSQL:
CONVERT YAML CONFIGURATION FROM FILE '/Users/xx/sharding_db.yaml';
执行示例
mysql> CONVERT YAML CONFIGURATION FROM FILE '/Users/xx/sharding_db.yaml';
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dist_sql |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE DATABASE sharding_db;
USE sharding_db;
REGISTER STORAGE UNIT ds_1 (
URL='jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false',
USER='root',
PASSWORD='123456',
PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='2100000', 'readOnly'='false', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='10')
), ds_0 (
URL='jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false',
USER='root',
PASSWORD='123456',
PROPERTIES('minPoolSize'='1', 'connectionTimeoutMilliseconds'='30000', 'maxLifetimeMilliseconds'='2100000', 'readOnly'='false', 'idleTimeoutMilliseconds'='60000', 'maxPoolSize'='10')
);
CREATE SHARDING TABLE RULE t_order (
STORAGE_UNITS(ds_0,ds_1),
SHARDING_COLUMN=order_id,
TYPE(NAME='mod', PROPERTIES('sharding-count'='4')),
KEY_GENERATE_STRATEGY(COLUMN=order_id, TYPE(NAME='snowflake'))
);
|
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
结语
到这里,元数据导出、导入和 YAML 转 DistSQL 的功能就解读完毕了,相信读者也能再次感受到 DistSQL 带来的方便和灵活。关于 DistSQL 的更多信息,请关注官网文档 [1] 和 GitHub [5]。
如果读者对 Apache ShardingSphere 有任何疑问或建议,欢迎在 GitHub issue 列表提出,或可前往中文社区 [6] 交流讨论。
🔗 参考
[1] DistSQL 文档:https://shardingsphere.apache.org/document/5.3.1/cn/user-manual/shardingsphere-proxy/distsql/
[2] SHOW SHARDING TABLE RULE:https://shardingsphere.apache.org/document/5.3.1/cn/user-manual/shardingsphere-proxy/distsql/syntax/rql/rule-query/sharding/show-sharding-table-rule/
[3] SHOW READWRITE_SPLITTING RULE:https://shardingsphere.apache.org/document/5.3.1/cn/user-manual/shardingsphere-proxy/distsql/syntax/rql/rule-query/readwrite-splitting/show-readwrite-splitting-rule/
[4] 使用 ShardingSphere-Proxy 二进制发布包:https://shardingsphere.apache.org/document/5.3.1/cn/user-manual/shardingsphere-proxy/startup/bin/
[5] GitHub issue 列表:https://github.com/apache/shardingsphere/issues
[6] 中文社区:OpenSEC - SphereEx 中文社区|开源异构分布式数据服务交流平台 - SphereEx 中文社区
文章转载自公众号: ShardingSphere官微