ApsaraDB for SelectDB執行個體下可以包含多個計算叢集,可分別用於支援不同的工作負載(例如讀寫隔離、在離線隔離等),以滿足多業務間負載隔離的需求。本文將介紹ApsaraDB for SelectDB執行個體中,如何使用多計算叢集進行計算資源隔離。
基礎原理
ApsaraDB for SelectDB採用計算與儲存分離的雲原生架構,計算和儲存分離之後,使得同一份資料可以被上層計算資源所共用。ApsaraDB for SelectDB基於此架構提供了多計算叢集特性。同一個執行個體(Instance)下可以包含多個計算叢集,並共用底層的資料存放區。
計算叢集類似分布式系統中的計算群組、計算隊列,協調一個或多個負責計算的單元共同完成整體的計算任務。由於計算資源是物理隔離的,可分別用於支援不同的工作負載(例如讀寫隔離、在離線隔離等),從而滿足多業務間負載隔離的需求,避免了業務間互相干擾。
使用樣本
一個基礎的多計算叢集訪問情境如下:執行個體有兩個帳號test_01和test_02。test_01用於業務A的計算請求,為其分配了叢集cluster_01。test_02用於業務B的計算請求,為其分配了叢集cluster_02。兩個帳號都可以操作執行個體中的全部資料。
通過admin帳號串連執行個體,初始化test_01和test_02帳號。樣本如下。
mysql> CREATE USER test_01 IDENTIFIED BY 'testPassword'; Query OK, 0 rows affected (0.06 sec) mysql> CREATE USER test_02 IDENTIFIED BY 'testPassword'; Query OK, 0 rows affected (0.04 sec) mysql> GRANT ALL ON *.* TO test_01; Query OK, 0 rows affected (0.07 sec) mysql> GRANT ALL ON *.* TO test_02; Query OK, 0 rows affected (0.05 sec) mysql> GRANT USAGE_PRIV ON CLUSTER cluster_01 TO test_01; Query OK, 0 rows affected (0.05 sec) mysql> GRANT USAGE_PRIV ON CLUSTER cluster_02 TO test_02; Query OK, 0 rows affected (0.04 sec)admin帳號下查看當前可用叢集,樣本如下。
mysql> SHOW clusters; +------------+------------+-------+ | cluster | is_current | users | +------------+------------+-------+ | cluster_01 | FALSE | | | cluster_02 | TRUE | | +------------+------------+-------+ 2 rows in set (0.04 sec)結果顯示admin帳號擁有兩個叢集的存取權限,當前預設訪問的叢集是cluster_02。
通過test_01帳號串連執行個體,查看當前可用叢集,樣本如下。
mysql> SHOW clusters; +------------+------------+-------+ | cluster | is_current | users | +------------+------------+-------+ | cluster_01 | TRUE | | +------------+------------+-------+ 1 row in set (0.03 sec)結果顯示test_01帳號只有叢集cluster_01的訪問權。
test_01帳號下插入測試資料,樣本如下。
mysql> CREATE TABLE golds_log ( user_id bigint, accounts string, change_type string, golds bigint, log_time int ) DISTRIBUTED BY HASH(`user_id`) BUCKETS 3; Query OK, 0 rows affected (0.06 sec) mysql> INSERT INTO golds_log VALUES -> (3645356,'wds7654321(4171752)','swim',1700,152607152), -> (2016869,'dqyx123456789(2376699)','noise',1140,152607152), -> (3630468,'dke3776611(4156064)','white',1200,152602752); Query OK, 3 rows affected (0.20 sec) {'label':'insert_9707a9905aab4805_b8b9d28aadcd96e6', 'status':'VISIBLE', 'txnId':'15313504260617216'}通過test_02帳號串連執行個體,查看當前可用叢集,樣本如下。
mysql> SHOW clusters; +------------+------------+-------+ | cluster | is_current | users | +------------+------------+-------+ | cluster_02 | TRUE | | +------------+------------+-------+ 1 row in set (0.04 sec)結果顯示test_02帳號只有叢集cluster_02的存取權限。
test_02帳號下查詢測試資料,樣本如下。
mysql> SELECT * FROM golds_log; +---------+------------------------+------------------+-------+-----------+ | user_id | accounts | change_type | golds | log_time | +---------+------------------------+------------------+-------+-----------+ | 3630468 | dke3776611(4156064) | noise | 1200 | 152602752 | | 2016869 | dqyx123456789(2376699) | whitewo | 1140 | 152607152 | | 3645356 | wds7654321(4171752) | swim | 1700 | 152607152 | +---------+------------------------+------------------+-------+-----------+ 3 rows in set (0.13 sec)結果顯示不同叢集在同一執行個體下的資料是共用的。
通過admin帳號串連執行個體,建立一個新帳號test_03,不分配使用的叢集許可權,樣本如下。
mysql> CREATE USER test_03 IDENTIFIED BY 'testPassword'; Query OK, 0 rows affected (0.04 sec) mysql> GRANT ALL ON *.* TO test_03; Query OK, 0 rows affected (0.04 sec)通過test_03帳號串連執行個體,由於沒有授予叢集使用許可權,查詢測試資料會有錯誤提示,樣本如下。
mysql> SELECT * FROM golds_log; ERROR 1105 (HY000): errCode = 2, detailMessage = 90363 have no queryable replicas. err: 90364's backend -1 does not exist or not alive, or you may not have permission to access the current cluster, clusterName=null