元数据备份恢复和 DistSQL 转换功能解读

DistSQL是ShardingSphere提供的操作语言,允许用户像操作数据库一样管理ShardingSphere。通过EXPORT、IMPORT和CONVERT语法,用户可以方便地导出、导入和转换配置。这简化了多环境配置迁移和备份的过程,同时也提供了从YAML到DistSQL的转换工具,便于用户过渡到DistSQL语法。

📖 本文作者‍

24f0c8d65b610476fc18ad8bb9fb6c20.jpeg

杨肖,同程旅行研发工程师

ShardingSphere Committer

👏 对社区的寄语

很高兴能参与到 ShardingSphere 社区建设中,希望在社区中努力提高自己,为 ShardingSphere 社区的发展做更多的贡献!

背景‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

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 语句,可以对照学习或直接复制执行。


在以上问题的解答中,我们看到了 EXPORTIMPORTCONVERT 这几个语法,它们的作用是什么,有哪些具体用法? 现在,就让我们开始今天的解读吧!

语法排查‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

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 部署为集群模式。

环境准备

  1. 在 MySQL 中创建两个库 demo_ds_0 和 demo_ds_1;

  2. 启动 ZooKeeper 服务;

  3. 在 ShardingSphere-Proxy 的 server.yaml 中配置 mode 信息,并启动 [4]。


配置逻辑库

  1. 创建逻辑库

CREATE DATABASE sharding_db;
USE sharding_db;
  1. 注册存储节点

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)
);
  1. 创建分片规则

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"))
);

操作流程如下:

f111da6a0370425319d48dff704e34c0.png

通过以上操作,我们动态的创建了一个逻辑库 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 的内容:

9381dda7fb901a1a939e985d0584380f.png

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

EXPORTIMPORT 的基础上,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 中文社区

重要活动预告‼️

北京的朋友们看过来~

3.9 日 将正式开放

本次活动报名通道

参与有奖 🎁 福利多多 

📢 线下还有工作机会等你认领

更能面对面与

斐科技 CEO、CTO、大厂技术高层

顶级开源社区 PMC 成员们

一起交流、切磋互动

 欢迎大家来线下玩!

57ef94124d20361bfad1a30d5407f390.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值