С тех пор как в версию Apache ShardingSphere 5.0.0-Beta был включен DistSQL, проект стал все более любим разработчиками и операционными командами за такие его преимущества, как динамические эффекты, отсутствие перезапуска и элегантный синтаксис, близкий к стандартному SQL.
В обновлениях 5.0.0 и 5.1.0 сообщество ShardingSphere снова добавило в DistSQL изящный синтаксис, привнеся больше практических возможностей.
В этом посте соавторы сообщества поделятся последними функциями DistSQL с точки зрения «управления кластером».
Кластер ShardingSphere
В типичном кластере, состоящем из ShardingSphere-Proxy, есть несколько вычислительных узлов
и узлов хранения, как показано на рисунке ниже:
Чтобы было проще понять, в ShardingSphere мы называем Proxy вычислительным узлом, а управляемые Proxy ресурсы распределенной базы данных (такие как ds_0
, ds_1
) — ресурсами
или узлами хранения
.
Несколько прокси или вычислительных узлов подключены к одному центру регистрации, совместно используют конфигурацию и правила, и могут определять состояние друг друга в режиме онлайн.
Эти вычислительные узлы также совместно используют базовые узлы хранения, поэтому они могут одновременно выполнять операции чтения и записи на узлы хранения. Пользовательское приложение подключается к любому вычислительному узлу и может выполнять аналогичные операции.
Благодаря такой кластерной архитектуре вы можете быстро масштабировать 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
Выполните команду загрузки отдельно:
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
View the list of instances:
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 |
+----------------+-----------+------+---------+
Вышеуказанные поля означают:
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
.
Как управлять параметрами вычислительного узла
В предыдущей статье Integrating SCTL into RAL — Making Apache ShardingSphere Perfect for Database Management мы рассказали об эволюции SCTL (ShardingSphere Control Language) в RAL (Resource & Rule Administration Language) и новом синтаксисе SHOW VARIABLE
и SET VARIABLE
.
Однако в версии 5.0.0-Beta категория VARIABLE
DistSQL RAL содержит только три следующих утверждения:
SET VARIABLE TRANSACTION_TYPE = xx; (LOCAL, XA, BASE)
SHOW VARIABLE TRANSACTION_TYPE;
SHOW VARIABLE CACHED_CONNECTIONS;
Прислушавшись к отзывам сообщества, мы заметили, что запрос и изменение конфигурации props в Proxy (расположенной в server.yaml
) также является частой операцией. Поэтому, начиная с версии 5.0.0 GA, мы добавили поддержку конфигурации props в DistSQL RAL.
SHOW VARIABLE
Сначала рассмотрим, как настроить реквизиты:
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
. Например:
#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 узлы хранения не связаны напрямую с вычислительными узлами. Поскольку один узел хранения может одновременно играть разные роли в разных схемах для реализации различной бизнес-логики. Узлы хранения всегда связаны со схемой.
В DistSQL управление узлами хранения осуществляется с помощью утверждений RESOURCE
, связанных со схемой, в том числе:
ADD RESOURCE
ALTER RESOURCE
DROP RESOURCE
SHOW SCHEMA RESOURCES
Подготовка схемы
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")
);
💡 Примечание: Указание параметров соединения 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
нельзя использовать для изменения целевой базы данных соединения. Можно изменить только следующие значения:
- имя пользователя
- пароль пользователя
- Параметры 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
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;
Пример:
Добавьте 4 узла хранения с помощью вышеупомянутой команды ADD RESOURCE
, а затем выполните запрос:
На самом деле в результате запроса имеется большое количество столбцов, но здесь мы покажем только часть из них.
Выше мы познакомили вас со способами динамического управления узлами хранения с помощью DistSQL.
По сравнению с изменением файлов YAML, выполнение запросов DistSQL происходит в режиме реального времени, и нет необходимости перезапускать прокси-сервер или вычислительный узел, что делает онлайн-операции более безопасными.
Изменения, выполняемые через DistSQL, могут быть синхронизированы с другими вычислительными узлами кластера в режиме реального времени через центр регистрации, а клиент, подключенный к любому вычислительному узлу, также может запрашивать изменения на узлах хранения в режиме реального времени.
Управление кластером Apache ShardingSphere является очень мощным.
Заключение
Если у вас есть вопросы или предложения по Apache ShardingSphere, пожалуйста, откройте проблему в списке проблем на GitHub. Если вы хотите внести свой вклад в проект, приглашаем вас присоединиться к сообществу Apache ShardingSphere.
Проблема на GitHub:https://github.com/apache/shardingsphere/issues
Вопросы — apache/shardingsphere
Новый вопрос Есть вопрос по этому проекту? Зарегистрируйте бесплатный аккаунт на GitHub, чтобы открыть проблему и связаться с…
github.com
Ссылка
*1. ShardingSphere-Proxy Quickstart: *https://shardingsphere.apache.org/document/5.1.0/cn/quick-start/shardingsphere-proxy-quick-start/
2.DistSQL RDL:https://shardingsphere.apache.org/document/current/en/user-manual/shardingsphere-proxy/distsql/syntax/rdl/resource-definition/
3.DistSQL RQL:https://shardingsphere.apache.org/document/current/en/user-manual/shardingsphere-proxy/distsql/syntax/rql/resource-query/
4.DistSQL RAL:https://shardingsphere.apache.org/document/current/en/user-manual/shardingsphere-proxy/distsql/syntax/ral/
Ссылки на проект Apache ShardingSphere:
ShardingSphere Github
ShardingSphere Twitter
ShardingSphere Slack
Руководство для контрибьюторов
Авторы
Лонгтао Джианг
Инженер по разработке промежуточного ПО SphereEx и коммиттер Apache ShardingSphere
Цзян работает над DistSQL и функциями безопасности R&D.
Чэнсян Лань
Инженер по разработке ПО SphereEx Middleware & коммиттер Apache ShardingSphere
Лан вносит свой вклад в разработку DistSQL и R&D.