带有 DistSQL 的 Apache ShardingSphere 5.0.0-Beta 版本因其动态效果、无需重启以及接近标准 SQL 的优雅语法等优点,而更受开发人员和运维团队的喜爱。随着升级到 5.0.0 和 5.1.0,ShardingSphere 社区再次为 DistSQL 添加了丰富的语法,带来了更多实用的功能。
在本文中,社区联合作者将从集群治理的角度分享 DistSQL 的最新功能。
ShardingSphere 集群
在一个典型的由 ShardingSphere-Proxy 组成的集群中,有多个计算节点和存储节点,如下图所示。
(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 VARIABLE 和 SET 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_sizeproxy_frontend_executor_sizeproxy_backend_driver_type
以下参数是只读的,无法修改
cached_connections
其他参数将在修改后立即生效。
如何管理存储节点
在 ShardingSphere 中,存储节点不直接绑定到计算节点。一个存储节点可能在不同的 schema 中同时扮演不同的角色,以便实现不同的业务逻辑。存储节点始终与 schema 关联。
对于 DistSQL,存储节点通过 RESOURCE 相关语句进行管理,包括
ADD RESOURCEALTER RESOURCEDROP RESOURCESHOW SCHEMA RESOURCES
Schema 准备
RESOURCE 相关语句仅在 schema 上工作,因此在操作之前,您需要创建并使用 USE 命令成功选择 schema
DROP DATABASE IF EXISTS sharding_db;
CREATE DATABASE sharding_db;
USE sharding_db;ADD RESOURCE
ADD RESOURCE 支持以下语法形式
- 指定
HOST、PORT、DB
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 RESOURCE 与 ADD 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_0 和 resource_1 中。当 resource_0 和 resource_1 被 t_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 命令添加四个存储节点,然后执行查询
(Jiang Longtao 和 Lan Chengxiang,CC BY-SA 4.0)
查询结果中有很多列,但这里我们只显示一部分。
结论
在本文中,我们向您介绍了通过 DistSQL 动态管理存储节点的方法。
与修改 YAML 文件不同,执行 DistSQL 语句是实时的,无需重启 proxy 或计算节点,从而使在线操作更安全。通过 DistSQL 执行的更改可以通过注册中心实时同步到集群中的其他计算节点。连接到任何计算节点的客户端也可以实时查询存储节点的更改。
如果您对 Apache ShardingSphere 有任何问题或建议,请在 GitHub issue 列表上打开一个 issue。如果您有兴趣为该项目做出贡献,非常欢迎您加入 Apache ShardingSphere 社区。
Apache ShardingSphere 项目链接
本文最初发表于 FAUN,并经许可转载。

评论已关闭。