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

素年锦时静待君丶
发布于 2023-5-18 11:42
浏览
0收藏

背景

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




在以上问题的解答中,我们看到了 EXPORTIMPORT 和 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 部署为集群模式。​

环境准备

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

​操作流程如下:​

元数据备份恢复和 DistSQL 转换功能解读-鸿蒙开发者社区

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

元数据备份恢复和 DistSQL 转换功能解读-鸿蒙开发者社区

​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官微

分类
已于2023-5-18 11:42:47修改
收藏
回复
举报
回复
    相关推荐