Apache ShardingSphere的一项功能更新增强了对存储节点的动态管理。
带有DistSQL的Apache ShardingSphere 5.0.0-Beta版本使该项目因其动态效果、无需重启、接近标准SQL的优雅语法等优点而更加受到开发者和运营团队的喜爱。随着5.0.0和5.1.0的升级,ShardingSphere社区再次为DistSQL增加了丰富的语法,带来了更多实用的功能。
本文中,社区合作者将从集群治理的角度分享DistSQL的最新功能。
ShardingSphere集群
在一个由ShardingSphere-Proxy组成的典型集群中,有多个计算节点和存储节点,如下图所示。

为了便于理解,在ShardingSphere中,我们把代理称为计算节点,把代理管理的分布式数据库资源(如ds_0或ds_1)称为资源或存储节点。
多个代理或计算节点被连接到同一个注册中心。它们共享配置和规则,并且可以感知对方的在线状态。这些计算节点也共享底层存储节点,所以它们可以同时对存储节点进行读写操作。用户应用程序连接到任何计算节点,并可以执行同等的操作。
通过这种集群架构,当计算资源不足时,你可以快速横向扩展代理,减少单点故障的风险,提高系统可用性。负载平衡机制也可以在应用程序和计算节点之间添加。
计算节点治理
计算节点治理适用于集群模式。
集群准备
以三个代理计算节点的独立模拟为例。要使用该模式,请遵循以下配置。
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
三个代理实例成功启动后,计算节点集群就准备好了。
显示实例列表
使用客户端连接到任何计算节点,比如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 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 。
如何管理计算节点参数
我们解释了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 ,查询所有参数值。
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 语句来动态更新道具参数。比如说。
#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 语句可以修改下面的参数,但是新的值只在代理重启后生效。
kernel_executor_sizeproxy_frontend_executor_sizeproxy_backend_driver_type
下面的参数是只读的,不能修改。
cached_connections
其他参数在修改后会立即生效。
如何管理存储节点
在 ShardingSphere 中,存储节点不直接与计算节点绑定。一个存储节点可以同时在不同的模式中扮演不同的角色,以实现不同的业务逻辑。存储节点总是与一个模式相关联。
对于DistSQL,存储节点是通过RESOURCE-相关的语句来管理的,包括。
ADD RESOURCEALTER RESOURCEDROP RESOURCESHOW SCHEMA RESOURCES
模式准备
RESOURCE-相关语句只在模式上工作,所以在操作之前,你需要创建并使用USE 命令来成功选择一个模式。
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 ,用于指定代理和存储节点之间的连接池的属性配置。
比如说。
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")
);
指定Java数据库连接(JDBC)的连接参数,如useSSL ,只支持URL形式。
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 ,从一个模式中删除存储节点,而不删除存储节点中的任何数据。语句示例如下。
DROP RESOURCE resource_0, resource_1;
为了保证数据的正确性,规则所引用的存储节点不能被删除。
t_order 是一个分片表,它的实际表分布在 和 。当 和 被 分片规则引用时,它们不能被删除。resource_0 resource_1 resource_0 resource_1 t_order
显示模式资源
SHOW SCHEMA RESOURCES 用于查询模式中的存储节点,支持以下语法形式。
#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 命令添加四个存储节点,然后执行查询。

在查询结果中有很多列,但这里我们只展示其中的一部分。
总结
在这篇文章中,我们已经向你介绍了通过DistSQL动态管理存储节点的方法。
与修改YAML文件不同,执行DistSQL语句是实时发生的,不需要重新启动代理或计算节点,使在线操作更加安全。通过DistSQL执行的更改可以通过注册中心实时同步到集群中的其他计算节点。连接到任何计算节点的客户端也可以实时查询存储节点的变化。