通过DistSQL动态管理存储节点的方法

225 阅读8分钟

Apache ShardingSphere的一项功能更新增强了对存储节点的动态管理。

带有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.

为了便于理解,在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@3309DISABLE 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 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 ,查询所有参数值。

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_size
  • proxy_frontend_executor_size
  • proxy_backend_driver_type

下面的参数是只读的,不能修改。

  • cached_connections

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

如何管理存储节点

在 ShardingSphere 中,存储节点不直接与计算节点绑定。一个存储节点可以同时在不同的模式中扮演不同的角色,以实现不同的业务逻辑。存储节点总是与一个模式相关联。

对于DistSQL,存储节点是通过RESOURCE-相关的语句来管理的,包括。

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

模式准备

RESOURCE-相关语句只在模式上工作,所以在操作之前,你需要创建并使用USE 命令来成功选择一个模式。

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

ADD RESOURCE

ADD RESOURCE 支持以下语法形式。

  • 指定HOST,PORTDB
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 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 ,从一个模式中删除存储节点,而不删除存储节点中的任何数据。语句示例如下。

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 命令添加四个存储节点,然后执行查询。

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.

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

总结

在这篇文章中,我们已经向你介绍了通过DistSQL动态管理存储节点的方法。

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