特性更新!DistSQL 叢集治理能力詳解
江龍滔,SphereEx 中介軟體研發工程師,Apache ShardingSphere Committer。 主要負責 DistSQL 及安全相關特性的創新與研發。
蘭城翔,SphereEx 中介軟體研發工程師,Apache ShardingSphere Committer。 目前專注於 DistSQL 的設計和研發。
背景
從 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,ds1),稱為資源或儲存節點。
其中,多個 Proxy 計算節點連線到同一註冊中心,共享配置和規則,並互相感知線上狀態。與此同時,這些計算節點也共享底層的儲存節點,它們可以同時對儲存節點進行讀寫操作。此時,使用者的應用程式連線到任一計算節點上,都能進行等效的操作。
透過這種叢集架構,在計算資源不足時,使用者可以快速的對 Proxy 進行水平擴充套件,也能夠在一定程度上降低單點故障帶來的風險,提高系統可用性。
應用程式與計算節點間還可以增加負載均衡的機制,此處不擴充套件。
計算節點治理
計算節點治理,適用於 Cluster 模式,關於模式的更多資訊可參考《 ShardingSphere Mode 執行模式詳解》。
叢集準備
這裡以單機模擬三個 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 3307sh %SHARDINGSPHERE_PROXY_HOME%/bin/start.sh 3308sh %SHARDINGSPHERE_PROXY_HOME%/bin/start.sh 3309
三個 Proxy 例項啟動成功後,計算節點叢集就準備好了。
SHOW INSTANCE LIST
使用客戶端連線到任一計算節點,如 3307:
mysql -h 127.0.0.1 -P 3307 -u root -p
檢視例項列表:
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 組成;
host
:主機地址;
port : 埠號;
status
: 例項的狀態,
enabled
和
disabled
分別表示啟用和禁用狀態。
DISABLE INSTANCE
DISABLE INSTANCE
語句用於將指定計算節點設定為禁用狀態。需要注意的是,該指令並不會終止目標例項的程式,只是在邏輯上對其進行停用。
DISABLE INSTANCE
支援以下語法形式:
DISABLE INSTANCE 10.7.5.35@3308;# 或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
語句用於將指定計算節點設定為啟用狀態。
ENABLE INSTANCE
也支援以下語法形式:
示例:
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 的例項狀態已恢復為啟用狀態。
計算節點引數管理
在此前的文章《
SCTL 涅槃重生:投入 RAL 的懷抱》中,我們為讀者解讀了 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;
在大量的客戶反饋中,我們發現查詢和修改 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 引數了。例如:
# 開啟 SQL 日誌輸出SET VARIABLE SQL_SHOW = true;# 開啟 hint 功能SET VARIABLE PROXY_HINT_ENABLED = true;# 開啟聯邦查詢SET VARIABLE SQL_FEDERATION_ENABLED = true; ……
?提示:
-
以下引數可以透過 SET VARIABLE 語句進行修改,但新值僅在 Proxy 重啟後生效:
kernel executorsize
proxy frontendexecutor_size
proxy backenddriver_type
-
以下引數為只讀,不可修改:
cached_connections
- 其他未說明的引數,修改後立即生效。
儲存節點管理
在 ShardingSphere 中,儲存節點並不是直接與計算節點繫結的。由於同一個儲存節點可能在不同邏輯庫(schema)中同時扮演不同的角色,用於實現不同的業務邏輯,因此,儲存節點始終是關聯在某個邏輯庫中的。
在 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、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 形式支援指定 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 不能修改連線的目標 DB,僅可修改以下內容:
-
使用者名稱
-
使用者密碼
-
PROPERTIES 連線池引數
-
JDBC 引數
DROP RESOURCE
DROP RESOURCE
用於從邏輯庫中刪除儲存節點,不會刪除儲存節點中的任何資料。語法示例如下:
DROP RESOURCE resource_0, resource_1;
?提示:為保護資料正確,被規則引用的儲存節點是無法刪除的。
例如 t order 為分片表,它的實際表分佈於 resource0 和 resource 1 中,那麼 resource0 和 resource 1 即被 torder 的分片規則引用,不能刪除。
SHOW SCHEMA RESOURCES
DROP RESOURCE resource_0, resource_1;
# 查詢當前 use 的邏輯庫中的儲存節點SHOW SCHEMA RESOURCES;# 查詢指定邏輯庫中的儲存節點SHOW SCHEMA RESOURCES FROM sharding_db;
示例:在透過前述的
ADD RESOURCE
命令新增 4 個儲存節點後,執行查詢操作:
由於查詢結果列數較多,只擷取部分。
以上就是透過 DistSQL 動態管理儲存節點的方式,與修改 YAML 檔案相比,DistSQL 的執行是實時的,無需重啟 Proxy 計算節點,讓線上業務更安全。
同時,透過 DistSQL 執行的變更會透過註冊中心實時同步到叢集內的其他計算節點,而連線到任一計算節點的客戶端,也能即時查詢到儲存節點的變化。
這,就是叢集治理的魅力。
結語
以上就是本次分享的全部內容,如果讀者對 Apache ShardingSphere 有任何疑問或建議,歡迎在 GitHub issue 列表提出,或可前往中文社群交流討論。 GitHub issue:
貢獻指南:
中文社群:
參考資訊:
1.ShardingSphere-Proxy 快速入門: https://shardingsphere.apache.org/document/5.1.0/cn/quick-start/shardingsphere-proxy-quick-start/
2.DistSQL RDL: https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/distsql/syntax/rdl/resource-definition/
3.DistSQL RQL: https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/distsql/syntax/rql/resource-query/
4.DistSQL RAL: https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/distsql/syntax/ral/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70001955/viewspace-2884180/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PowerBuilder DataWindow畫板的更新特性詳解UI
- Kubernetes叢集日誌詳解
- Kafka詳解二、如何配置Kafka叢集Kafka
- 負載均衡 - MQTT Broker 叢集詳解(一)負載MQQT
- CynosDB技術詳解——儲存叢集管理
- RHEL 7特性說明(六):叢集
- hadoop叢集多節點安裝詳解Hadoop
- Linux 高可用(HA)叢集之keepalived詳解Linux
- 紅帽RHCS叢集系統配置詳解(RHEL 6.5)
- GaussDB(DWS)叢集通訊:詳解pooler連線池
- K8s叢集證書更新K8S
- 11g叢集新特性-scan機制
- 粘性會話負載均衡 - MQTT Broker 叢集詳解(二)會話負載MQQT
- 3種雙叢集系統方案設計模式詳解設計模式
- CynosDB技術詳解——儲存叢集管理【文末有福利】
- Rabbitmq叢集高可用部署詳細MQ
- 《搭建更新DNS叢集服務》RHEL6DNS
- 流量治理神器-Sentinel的限流模式,選單機還是叢集?模式
- 基於Spring Cloud微服務叢集的服務治理思考SpringCloud微服務
- 深入剖析Redis系列(三) - Redis叢集模式搭建與原理詳解Redis模式
- 詳解Redis三大叢集模式,輕鬆實現高可用!Redis模式
- Nginx實現叢集的負載均衡配置過程詳解Nginx負載
- Zookeeper叢集 + Kafka叢集Kafka
- C#–特性詳解C#
- 運營商大規模資料叢集治理的實踐指南
- Kubernetes-高可用叢集證書更新
- Karmada跨叢集優雅故障遷移特性解析
- Application Request Route實現IIS Server Farms叢集負載詳解APPServer負載
- 搭建zookeeper叢集(偽叢集)
- web叢集與ejb叢集Web
- Flutter 2.8 更新詳解Flutter
- zookeeper叢集及kafka叢集搭建Kafka
- ES10特性詳解
- MySQL 5.5新特性詳解MySql
- MySQL 5.7 新特性詳解MySql
- K8s 從懵圈到熟練 – 叢集網路詳解K8S
- 詳解叢集級備份恢復:物理細粒度備份恢復
- CentOS 6.5下ZooKeeper3.4.6叢集環境部署及單機部署詳解CentOS