OceanBase學習之路13|體驗多租戶特性

老樹樁12發表於2023-01-16

OceanBase 資料庫具有多租戶的特性,在叢集層面實現了例項資源的池化。在 OceanBase 資料庫中,每一個租戶即一個例項(類比 MySQL Instance)。租戶與租戶之間資料、許可權、資源隔離,每個租戶擁有自己獨立的訪問埠及 CPU、記憶體訪問資源。

背景資訊

OceanBase 資料庫可以靈活的調整租戶資源分配情況(CPU、記憶體),並且整個過程對上層業務透明。透過多租戶機制,OceanBase 叢集可以幫助使用者高效的利用資源,在保證可用性和效能的前提下,最佳化成本,並且做到按照需求彈性擴容。

為了幫助您更容易的理解 OceanBase 資料庫多租戶的概念。下面透過建立一個 OceanBase 資料庫租戶的例子分步驟進行說明。

建立資源規格 Unit Config

在 OceanBase 資料庫中,資源單元 Unit 是一個租戶使用 CPU、記憶體的最小邏輯單元,也是叢集擴充套件和負載均衡的一個基本單位,在叢集節點上下線,擴容、縮容時會動態調整資源單元在節點上的分佈進而達到資源的使用均衡。而 Unit Config 則規定了一個 Unit 需要使用的計算儲存資源(包含記憶體、CPU 和 IO 等)的規格,是一個配置資訊。

因為其分散式的架構,一個 OceanBase 資料庫租戶可以在資源規格、資源池、副本型別,副本分佈幾個不同維度靈活定義,所以建立租戶時,也需要按照 “unit config -> resource pool -> tenant” 的順序進行建立和定義。

OceanBase 資料庫在建立租戶前,需要先確定租戶的 Unit Config。您需要使用  sys 租戶管理員,透過如下 SQL 語句來建立。

下面建立兩個 Unit Config,分別為  unit1 和  unit2 並指定 CPU、記憶體、使用的最大及最小閾值。

  • 建立  unit1 資源單元的 CPU、記憶體使用大小為 3 C、6 G。

    obclient [oceanbase]> CREATE RESOURCE UNIT UNIT1 MAX_CPU =3,MIN_CPU =3 ,MEMORY_SIZE ='6G';
  • 建立  unit2 資源單元的 CPU、記憶體使用大小為 4 C、8 G。

    obclient [oceanbase]> CREATE RESOURCE UNIT UNIT2 MAX_CPU =4,MIN_CPU =4 ,MEMORY_SIZE ='8G';

建立資源池和關聯 Unit Config

Unit Config 是一組租戶的配置規格資訊,而 Resource Pool 則是租戶的資源實體,所以在這一步我們需要建立一個 Resource Pool,並且與 Unit Config 關聯起來。

建立兩個不同的資源池  pool1pool2,併為其分別指定到  unit1unit2 上。實現資源單元與資源池的對應。 UNIT_NUM 表示在一個副本中指定多少個  unit 單元(同一個租戶中,一個節點上最多隻能有一個  unit), ZONE_LIST 則指定租戶在當前叢集中在哪幾個副本進行部署。

本例中考慮到是單節點叢集,我們都指定單個 Unit 和 Zone List。建立 Resource Pool 需要保證有足夠的資源剩餘,如果資源不足,您可以先嚐試刪除已有的  test 租戶,或者將已有租戶的 Unit Config 調整到更小。如何調整請參見  調整租戶資源大小

obclient [oceanbase]> CREATE RESOURCE POOL pool1 UNIT='UNIT1',UNIT_NUM=1,ZONE_LIST=('zone1');
obclient [oceanbase]> CREATE RESOURCE POOL pool2 UNIT='UNIT2',UNIT_NUM=1,ZONE_LIST=('zone1');

注意

上面的例子針對的是單節點的叢集環境,如果您的叢集有 3 個節點,那麼  ZONE_LIST 的值應該為  ('zone1','zone2','zone3'),其中 Zone 的名稱需要根據您建立的情況具體填寫。

根據建立的 Resource Pool 建立租戶

在完成 Unit Config、Resource Pool 的建立,完成資源單元和資源池的對應後,就可以正常開始租戶建立了。

本例中由於是單節點叢集,所以我們只能建立單副本的租戶。如果希望建立 3 副本的租戶,OceanBase 叢集至少需要 3 個節點。

定義一個名為  tenant1 的單副本租戶,並規定字符集為  utf8mb4,使用  pool1 的資源池, ob_tcp_invited_nodes 是租戶白名單定義,初始可以設定為 '%',表示任意 IP 地址均可以訪問,後期可以修改。

obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant1 CHARSET='utf8mb4', ZONE_LIST=('zone1'), PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes='%';

注意

上面的例子針對的是單節點的叢集環境,只能建立單副本的租戶。如果您的叢集有 3 個節點,那麼  ZONE_LIST 的值應該為('zone1','zone2','zone3'), PRIMARY_ZONE 則填寫  'zone1;zone2;zone3',表示租戶的 Leader 優先分佈在  zone1,其次為  zone2

類似的,定義一個名為  tenant2 的一個 單副本的租戶,並規定字符集為  utf8mb4,使用  pool2 的資源池。

obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant2 CHARSET='utf8mb4', ZONE_LIST=('zone1'), PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool2') SET ob_tcp_invited_nodes='%';

在完成  tenant1tenant2 租戶建立後,您可以透過查詢  oceanbase.DBA_OB_TENANTS 檢視來確認租戶是否建立成功。

obclient [oceanbase]> SELECT * FROM DBA_OB_TENANTS;

在完成 tenant1、tenant2 租戶建立後,您可以透過查詢  oceanbase.DBA_OB_TENANTS 檢視來確認租戶是否建立成功。

obclient [oceanbase]> SELECT * FROM DBA_OB_TENANTS;

上述操作確認完成後,您已完成在同一個叢集下實現兩個租戶的建立過程。接下來便可以在租戶里正常的進行資料庫操作了。

使用新建立的  tenant1 進行登入,並建立一張測試表。

obclient -hXXX.XX.XXX.106 -P2883 -uroot@tenant1#ob_test -p
obclient [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| test               |
+--------------------+
4 rows in set
obclient [(none)]> USE test;
Database changed
obclient [test]> CREATE TABLE t_f1(id DECIMAL(10,0),id2 DECIMAL(10,0),id3 DATE,id4 DATE,id5 FLOAT,id6 FLOAT,id7 VARCHAR(30),id8 VARCHAR(300));
Query OK, 0 rows affected
obclient [test]> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| t_f1           |
+----------------+
1 row in set

使用  tenant2 租戶進行登入,檢視  test 庫情況。

obclient -h***.**.***.106 -P2883 -uroot@tenant2#ob_test -p
obclient [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| test               |
+--------------------+
4 rows in set
obclient [(none)]> USE test;
Database changed
obclient [test]> SHOW TABLES;
Empty set

可以看到叢集下兩個租戶的資源、資料、許可權都是隔離的,您可以進行更多測試,體驗 OceanBase 資料庫的租戶隔離特性。

修改租戶配置和調整例項資源規格

OceanBase 資料庫可以靈活的對租戶資源的 CPU,記憶體資源進行調整,並且線上生效,對業務透明。修改租戶所佔用的 CPU、記憶體大小,您僅需要調整租戶所對應的 Unit Config,不需要對資源池或者租戶進行調整。

租戶資源單元可透過系統表  __all__unit_config 進行檢視。

obclient [oceanbase]> SELECT * FROM oceanbase.__all_unit_config;
+----------------------------+----------------------------+----------------+--------------------------------------+---------+---------+--------------+--------------+----------+----------+---------------+---------------------+
| gmt_create                 | gmt_modified               | unit_config_id | name                                 | max_cpu | min_cpu | max_memory   | min_memory   | max_iops | min_iops | max_disk_size | max_session_num     |
+----------------------------+----------------------------+----------------+--------------------------------------+---------+---------+--------------+--------------+----------+----------+---------------+---------------------+
| 2022-07-05 17:32:17.519436 | 2022-07-05 17:32:17.519436 |              1 | sys_unit_config                      |       5 |     2.5 |  17179869184 |  12884901888 |    10000 |     5000 | 2608854990848 | 9223372036854775807 |
| 2022-07-10 12:58:33.279509 | 2022-07-10 12:58:33.279509 |           1026 | unit1                                |       3 |       3 |   6442450944 |   6442450944 |      128 |      128 |   10737418240 |                  64 |
| 2022-07-10 12:58:39.276495 | 2022-07-10 12:58:39.276495 |           1027 | unit2                                |       4 |       4 |   8589934592 |   8589934592 |      128 |      128 |   21474836480 |                  64 |
+----------------------------+----------------------------+----------------+--------------------------------------+---------+---------+--------------+--------------+----------+----------+---------------+---------------------+

查詢結果顯示, unit1 資源單元 CPU、記憶體使用的分別是 3 C,6 G。

透過以下命令調整  unit1 資源單元 CPU、記憶體的使用大小為 5 c,10 G。

obclient [oceanbase]>  ALTER resource unit unit1 max_cpu =5,min_cpu =5 ,memory_size ='10G';
Query OK, 0 rows affected
obclient [oceanbase]> SELECT * FROM oceanbase.__all_unit_config;
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+---------------+----------+----------+-------------+
| gmt_create                 | gmt_modified               | unit_config_id | name            | max_cpu | min_cpu | memory_size | log_disk_size | max_iops | min_iops | iops_weight |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+---------------+----------+----------+-------------+
| 2022-09-29 17:07:14.647714 | 2022-09-29 17:07:14.647714 |              1 | sys_unit_config |     2.5 |     2.5 |  8589934592 |    8589934592 |    25000 |    25000 |           2 |
| 2022-09-29 18:27:21.231880 | 2022-09-30 10:53:49.522260 |           1004 | unit1         |       5   |       5 | 10737418240 |   51539607552 |    80000 |    80000 |           8 |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+---------------+----------+----------+-------------+

如上所示,租戶配置的調整是線上立即生效的,調整成功後, unit1 的 CPU、記憶體為 5 c,10 G。OceanBase 資料庫透過核心的虛擬化技術,在變更配置後租戶的 CPU 和記憶體資源可以立即生效,無需資料遷移或者切換,對業務無感知。

透過檢視  DBA_OB_UNITS 資訊,您可以獲取到資源單元、資源池、租戶在叢集裡的對應資訊及 CPU、記憶體資訊。

obclient [oceanbase]> SELECT * FROM DBA_OB_UNITS;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026075/viewspace-2932347/,如需轉載,請註明出處,否則將追究法律責任。

相關文章