带有 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_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
支持以下语法形式
- 指定
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,并经许可转载。
评论已关闭。