DistSQL 集群治理能力指南

Apache ShardingSphere 的功能更新增强了存储节点的动态管理。
2 位读者喜欢这篇文章。
Databases as a service

Jason Baker。CC BY-SA 4.0。

带有 DistSQL 的 Apache ShardingSphere 5.0.0-Beta 版本因其动态效果、无需重启以及接近标准 SQL 的优雅语法等优点,而更受开发人员和运维团队的喜爱。随着升级到 5.0.0 和 5.1.0,ShardingSphere 社区再次为 DistSQL 添加了丰富的语法,带来了更多实用的功能。

在本文中,社区联合作者将从集群治理的角度分享 DistSQL 的最新功能。

ShardingSphere 集群

在一个典型的由 ShardingSphere-Proxy 组成的集群中,有多个计算节点和存储节点,如下图所示。

An illustrated diagram shows three distinct applications at the top, represented by rectangles containing "Business Code." These each of these link to two instances of ShardingSphere-Proxy. Between these two instances is a Register Center; both proxies feed a Register Center. In addition, each proxy feeds four barrel-shaped distributed database resources, labeled ds_0, ds_1, ds_2, and ds_3.

(Jiang Longtao 和 Lan Chengxiang,CC BY-SA 4.0)

为了便于理解,在 ShardingSphere 中,我们将 proxy 称为计算节点,将 proxy 管理的分布式数据库资源(如 ds_0 或 ds_1)称为资源存储节点

多个 proxy 或计算节点连接到同一个注册中心。它们共享配置和规则,并且可以感知彼此的在线状态。这些计算节点也共享底层存储节点,因此它们可以同时对存储节点执行读写操作。用户应用程序连接到任何计算节点都可以执行等效的操作。

通过这种集群架构,当计算资源不足时,您可以快速水平扩展 proxy,从而降低单点故障的风险并提高系统可用性。负载均衡机制也可以添加到应用程序和计算节点之间。

计算节点治理

计算节点治理适用于集群模式。有关 ShardingSphere 模式的更多信息,请参阅 您的 Apache ShardingSphere 操作模式详细指南

集群准备

以三个 proxy 计算节点的独立模拟为例。要使用该模式,请按照以下配置进行操作

mode:
type: Cluster
repository:
type: ZooKeeper
props:
namespace: governance_ds
server-lists: localhost:2181
retryIntervalMilliseconds: 500
timeToLiveSeconds: 60
maxRetries: 3
operationTimeoutMilliseconds: 500
overwrite: false

分别执行 bootup 命令

sh %SHARDINGSPHERE_PROXY_HOME%/bin/start.sh 3307
sh %SHARDINGSPHERE_PROXY_HOME%/bin/start.sh 3308
sh %SHARDINGSPHERE_PROXY_HOME%/bin/start.sh 3309

三个 proxy 实例成功启动后,计算节点集群就准备就绪了。

SHOW INSTANCE LIST

使用客户端连接到任何计算节点,例如 3307

mysql -h 127.0.0.1 -P 3307 -u root -p

使用 SHOW INSTANCE LIST 查看实例列表

mysql> SHOW INSTANCE LIST;
+----------------+-----------+------+---------+
| instance_id    | host      | port | status  |
+----------------+-----------+------+---------+
| 10.7.5.35@3309 | 10.7.5.35 | 3309 | enabled |
| 10.7.5.35@3308 | 10.7.5.35 | 3308 | enabled |
| 10.7.5.35@3307 | 10.7.5.35 | 3307 | enabled |
+----------------+-----------+------+---------+

以上字段的含义是

  • instance_id:实例的 ID,目前由主机和端口组成
  • host:主机地址
  • port:端口号
  • status:实例的状态,启用或禁用

DISABLE INSTANCE

使用 DISABLE INSTANCE 语句将指定的计算节点设置为禁用状态。该语句不会终止目标实例的进程,而只是在虚拟层面停用它。

DISABLE INSTANCE 支持以下语法形式

DISABLE INSTANCE 10.7.5.35@3308;
#or
DISABLE INSTANCE IP=10.7.5.35, PORT=3308;

例如

mysql> DISABLE INSTANCE 10.7.5.35@3308;
Query OK, 0 rows affected (0.02 sec)
mysql> SHOW INSTANCE LIST;
+----------------+-----------+------+----------+
| instance_id    | host      | port | status   |
+----------------+-----------+------+----------+
| 10.7.5.35@3309 | 10.7.5.35 | 3309 | enabled  |
| 10.7.5.35@3308 | 10.7.5.35 | 3308 | disabled |
| 10.7.5.35@3307 | 10.7.5.35 | 3307 | enabled  |
+----------------+-----------+------+----------+

通过再次查询执行 DISABLE INSTANCE 语句后,您可以看到端口 3308 的实例状态已更新为 disabled,表明该计算节点已被禁用。

如果客户端连接到 10.7.5.35@3308,则执行任何 SQL 语句都会提示异常

1000 - Circuit break mode is ON.

您不允许禁用当前的计算节点。如果您将 10.7.5.35@3309 发送到 DISABLE INSTANCE 10.7.5.35@3309,您将收到异常提示。

ENABLE INSTANCE

使用 ENABLE INSTANCE 语句将指定的计算节点设置为启用状态。ENABLE INSTANCE 支持以下语法形式

ENABLE INSTANCE 10.7.5.35@3308;
#or
ENABLE INSTANCE IP=10.7.5.35, PORT=3308;

例如

mysql> SHOW INSTANCE LIST;
+----------------+-----------+------+----------+
| instance_id    | host      | port | status   |
+----------------+-----------+------+----------+
| 10.7.5.35@3309 | 10.7.5.35 | 3309 | enabled  |
| 10.7.5.35@3308 | 10.7.5.35 | 3308 | disabled |
| 10.7.5.35@3307 | 10.7.5.35 | 3307 | enabled  |
+----------------+-----------+------+----------+
mysql> ENABLE INSTANCE 10.7.5.35@3308;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW INSTANCE LIST;
+----------------+-----------+------+----------+
| instance_id    | host      | port | status   |
+----------------+-----------+------+----------+
| 10.7.5.35@3309 | 10.7.5.35 | 3309 | enabled  |
| 10.7.5.35@3308 | 10.7.5.35 | 3308 | enabled  |
| 10.7.5.35@3307 | 10.7.5.35 | 3307 | enabled  |
+----------------+-----------+------+----------+

执行 ENABLE INSTANCE 语句后,您可以再次查询并查看端口 3308 的实例状态已恢复为 enabled

如何管理计算节点参数

在我们的文章 将 SCTL 集成到 DISTSQL 的 RAL 中:使 Apache ShardingSphere 成为数据库管理的完美选择 中,我们解释了 ShardingSphere 控制语言 (SCTL) 到资源和规则管理语言 (RAL) 的演变以及新的 SHOW VARIABLESET VARIABLE 语法。

但是,在 5.0.0-Beta 中,DistSQL RAL 的 VARIABLE 类别仅包含以下三个语句

SET VARIABLE TRANSACTION_TYPE = xx; (LOCAL, XA, BASE)
SHOW VARIABLE TRANSACTION_TYPE;
SHOW VARIABLE CACHED_CONNECTIONS;

通过听取社区的反馈,我们注意到查询和修改 proxy 的 props 配置(位于 server.yaml 中)也是一项频繁的操作。因此,自 5.0.0 GA 版本以来,我们已添加对 DistSQL RAL 中 props 配置的支持。

SHOW VARIABLE

首先,我们将回顾如何配置 props

props:
max-connections-size-per-query: 1

kernel-executor-size: 16  # Infinite by default.

proxy-frontend-flush-threshold: 128  # The default value is 128.

proxy-opentracing-enabled: false

proxy-hint-enabled: false

sql-show: false

check-table-metadata-enabled: false

show-process-list-enabled: false

# Proxy backend query fetch size. A larger value may increase the memory usage of ShardingSphere Proxy.

# The default value is -1, which means set the minimum value for different JDBC drivers.

proxy-backend-query-fetch-size: -1

check-duplicate-table-enabled: false

proxy-frontend-executor-size: 0 # Proxy frontend executor size. The default value is 0, which means let Netty decide.

# Available options of proxy backend executor suitable: OLAP(default), OLTP. The OLTP option may reduce time cost of writing packets to client, but it may increase the latency of SQL execution

# and block other clients if client connections are more than `proxy-frontend-executor-size`, especially executing slow SQL.

proxy-backend-executor-suitable: OLAP

proxy-frontend-max-connections: 0 # Less than or equal to 0 means no limitation.

sql-federation-enabled: false

# Available proxy backend driver type: JDBC (default), ExperimentalVertx

proxy-backend-driver-type: JDBC

现在,您可以使用以下语法执行交互式查询

SHOW VARIABLE PROXY_PROPERTY_NAME;

例如

mysql> SHOW VARIABLE MAX_CONNECTIONS_SIZE_PER_QUERY;
+--------------------------------+
| max_connections_size_per_query |
+--------------------------------+
| 1                              |
+--------------------------------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLE SQL_SHOW;
+----------+
| sql_show |
+----------+
| false    |
+----------+
1 row in set (0.00 sec)
……

注意:对于 DistSQL 语法,参数键用下划线分隔。

SHOW ALL VARIABLES

由于 proxy 中有很多参数,您还可以通过 SHOW ALL VARIABLES 查询所有参数值

mysql> SHOW ALL VARIABLES;
+---------------------------------------+----------------+
| variable_name                         | variable_value |
+---------------------------------------+----------------+
| sql_show                              | false          |
| sql_simple                            | false          |
| kernel_executor_size                  | 0              |
| max_connections_size_per_query        | 1              |
| check_table_metadata_enabled          | false          |
| proxy_frontend_database_protocol_type |                |
| proxy_frontend_flush_threshold        | 128            |
| proxy_opentracing_enabled             | false          |
| proxy_hint_enabled                    | false          |
| show_process_list_enabled             | false          |
| lock_wait_timeout_milliseconds        | 50000          |
| proxy_backend_query_fetch_size        | -1             |
| check_duplicate_table_enabled         | false          |
| proxy_frontend_executor_size          | 0              |
| proxy_backend_executor_suitable       | OLAP           |
| proxy_frontend_max_connections        | 0              |
| sql_federation_enabled                | false          |
| proxy_backend_driver_type             | JDBC           |
| agent_plugins_enabled                 | false          |
| cached_connections                    | 0              |
| transaction_type                      | LOCAL          |
+---------------------------------------+----------------+
21 rows in set (0.01 sec)

SET VARIABLE

资源的动态管理和规则是 DistSQL 的一个特殊优势。现在您还可以使用 SET VARIABLE 语句动态更新 props 参数。例如

#Enable SQL log output
SET VARIABLE SQL_SHOW = true;
#Turn on hint function
SET VARIABLE PROXY_HINT_ENABLED = true;
#Open federal query
SET VARIABLE SQL_FEDERATION_ENABLED = true;
……

SET VARIABLE 语句可以修改以下参数,但新值仅在 proxy 重启后生效

  • kernel_executor_size
  • proxy_frontend_executor_size
  • proxy_backend_driver_type

以下参数是只读的,无法修改

  • cached_connections

其他参数将在修改后立即生效。

如何管理存储节点

在 ShardingSphere 中,存储节点不直接绑定到计算节点。一个存储节点可能在不同的 schema 中同时扮演不同的角色,以便实现不同的业务逻辑。存储节点始终与 schema 关联。

对于 DistSQL,存储节点通过 RESOURCE 相关语句进行管理,包括

  • ADD RESOURCE
  • ALTER RESOURCE
  • DROP RESOURCE
  • SHOW SCHEMA RESOURCES

Schema 准备

RESOURCE 相关语句仅在 schema 上工作,因此在操作之前,您需要创建并使用 USE 命令成功选择 schema

DROP DATABASE IF EXISTS sharding_db;
CREATE DATABASE sharding_db;
USE sharding_db;

ADD RESOURCE

ADD RESOURCE 支持以下语法形式

  • 指定 HOSTPORTDB
ADD RESOURCE resource_0 (
HOST=127.0.0.1,
PORT=3306,
DB=db0,
USER=root,
PASSWORD=root
);
  • 指定 URL
ADD RESOURCE resource_1 (
URL="jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=UTC&useSSL=false",
USER=root,
PASSWORD=root
);

以上两种语法形式都支持扩展参数 PROPERTIES,该参数用于指定 proxy 和存储节点之间连接池的属性配置。

例如

ADD RESOURCE resource_2 (
HOST=127.0.0.1,
PORT=3306,
DB=db2,
USER=root,
PASSWORD=root,
PROPERTIES("maximumPoolSize"=10)
),resource_3 (
URL="jdbc:mysql://127.0.0.1:3306/db3?serverTimezone=UTC&useSSL=false",
USER=root,
PASSWORD=root,
PROPERTIES("maximumPoolSize"=10,"idleTimeout"="30000")
);

仅 URL 形式支持指定 Java 数据库连接 (JDBC) 连接参数,例如 useSSL

ALTER RESOURCE

使用 ALTER RESOURCE 修改存储节点的连接信息,例如更改连接池的大小或修改 JDBC 连接参数。

在语法上,ALTER RESOURCEADD RESOURCE 相同。

ALTER RESOURCE resource_2 (
HOST=127.0.0.1,
PORT=3306,
DB=db2,
USER=root,
PROPERTIES("maximumPoolSize"=50)
),resource_3 (
URL="jdbc:mysql://127.0.0.1:3306/db3?serverTimezone=GMT&useSSL=false",
USER=root,
PASSWORD=root,
PROPERTIES("maximumPoolSize"=50,"idleTimeout"="30000")
);

由于修改存储节点可能会导致元数据更改或应用程序数据异常,因此 ALTER RESOURCE 不能用于修改连接的目标数据库。只能修改以下值

  • 用户名
  • 用户密码
  • PROPERTIES 连接池参数
  • JDBC 参数

DROP RESOURCE

使用 DROP RESOURCE 从 schema 中删除存储节点,而不会删除存储节点中的任何数据。语句示例如下

DROP RESOURCE resource_0, resource_1;

为确保数据正确性,不能删除规则引用的存储节点。

t_order 是一个分片表,其实际表分布在 resource_0resource_1 中。当 resource_0resource_1t_order 分片规则引用时,它们不能被删除。

SHOW SCHEMA RESOURCES

SHOW SCHEMA RESOURCES  用于查询 schema 中的存储节点,并支持以下语法形式

#Query the storage node in the current schema
SHOW SCHEMA RESOURCES;
#Query the storage node in the specified schema
SHOW SCHEMA RESOURCES FROM sharding_db;

例如,通过 ADD RESOURCE 命令添加四个存储节点,然后执行查询

A table of output from a Show Schema Resources request shows 4 MySQL database resource from the same host and port, indicate their connection timeout in milliseconds, idle timeout in milliseconds, max lifetime in milliseconds, max pool size and minimum pool size.

(Jiang Longtao 和 Lan Chengxiang,CC BY-SA 4.0)

查询结果中有很多列,但这里我们只显示一部分。

结论

在本文中,我们向您介绍了通过 DistSQL 动态管理存储节点的方法。

与修改 YAML 文件不同,执行 DistSQL 语句是实时的,无需重启 proxy 或计算节点,从而使在线操作更安全。通过 DistSQL 执行的更改可以通过注册中心实时同步到集群中的其他计算节点。连接到任何计算节点的客户端也可以实时查询存储节点的更改。

如果您对 Apache ShardingSphere 有任何问题或建议,请在 GitHub issue 列表上打开一个 issue。如果您有兴趣为该项目做出贡献,非常欢迎您加入 Apache ShardingSphere 社区。

Apache ShardingSphere 项目链接

本文最初发表于 FAUN,并经许可转载。

接下来阅读
标签
Smile
Apache ShardingSphere Committer GitHub:https://github.com/RaigorJiang 电子邮件:jianglongtao@apache.org

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.