場景介紹
大規模數據庫集群通常會同時包含很多業務數據,不同業務有不同的數據表,可以通過資源管理功能創建多個資源池來實現不同業務的資源隔離。DWS支持將不同業務用戶分配給不同資源池,以便減少業務之間資源(CPU資源、內存資源、IO資源和存儲資源)競爭。
但隨著業務規模不斷擴大,集群系統中的業務數目越來越多,通過劃分多個資源池來管理越來越難以控制資源競爭。由于DWS的分布式架構,業務數據被分散存儲在多個節點上即每個表都會分布在數據庫集群的所有DN節點上,因此每次數據表操作都可能會涉及所有DN節點,導致網絡壓力增大和系統資源大量消耗,僅通過擴大集群規模也很難解決,DWS建議用戶劃分多個邏輯集群來解決業務數量擴大帶來的網絡壓力和資源消耗問題。
通過劃分獨立的邏輯集群,將新增的業務分配到獨立的邏輯集群上,這樣新增業務對原有業務的影響會很小。而原有邏輯集群中的業務規模如果擴大,也可以通過對原有邏輯集群擴容來解決。
如圖 跨邏輯集群訪問數據所示,假設某企業原有業務數據表都在原物理集群dws-demo(綠色部分),切換到邏輯集群lc1(藍色部分)后,物理集群再通過擴容方式,新增一套新的邏輯集群lc2,原有業務數據表統一切換到邏輯集群lc1,新的業務數據表統一寫入到邏輯集群lc2,實現新老業務的數據隔離。而新的邏輯集群lc2關聯的用戶u2,通過授權可以跨邏輯集群訪問邏輯集群lc1的表。
圖 跨邏輯集群訪問數據
創建集群并準備表數據
- 參見創建專屬集群章節創建集群。
- 連接數據庫后,以系統管理員dbadmin創建表name,并插入2條數據。
CREATE TABLE name (id int, name varchar(20));
INSERT INTO name VALUES (1,'joy'),(2,'lily');
轉換成邏輯集群lc1
須知:
轉換期間,用戶可執行增刪改查等簡單DML語句,執行數據庫對象等復雜DDL語句會阻塞業務,請選擇業務低峰窗口期進行。
- 登錄DWS管理控制臺,在左導航欄選擇“集群 > 專屬集群”,單擊指定集群名稱進入“集群詳情”頁面。
- 打開“邏輯集群開關”按鈕。
- 左導航欄選擇“邏輯集群管理”進入邏輯集群頁面。
- 單擊右上角“添加邏輯集群”,輸入邏輯集群名稱lc1,單擊“確定”。
切換期間當前集群不可用,請耐心等待約2分鐘(轉換時間因業務數據量大小不同,有所差異),待邏輯集群頁面出現lc1,表示轉換成功。
添加邏輯集群
擴容節點到彈性集群elastic_group中
- 返回集群管理頁面,在指定集群所在行操作列選擇“更多 >節點變更> 擴容”。
- 跳轉至擴容頁面,可選擇擴容3個節點;選擇擴容到邏輯集群,即“elastic_group”。確認無誤后,勾選“我已確認”,并單擊“下一步:確認”。
- 單擊“提交”,并單擊“確定”。請耐心等待約10分鐘,擴容成功。
添加邏輯集群lc2
- 在集群管理頁面,單擊指定集群名稱進入“集群詳情”頁面,在左導航欄單擊“邏輯集群管理”。
- 進入邏輯集群頁面,單擊右上角“添加邏輯集群”,從右側勾選3個節點到左側列表中,并輸入邏輯集群名稱lc2,單擊“確定”。
請耐心等待約2分鐘,邏輯集群添加成功。
創建邏輯集群關聯用戶并實現跨邏輯查詢數據
- 以系統管理員連接數據庫,執行以下SQL語句查詢原業務表name。
驗證轉換后,業務數據查詢正常。
SELECT * FROM name;
- 執行以下語句創建u1關聯邏輯集群lc1,u2關聯邏輯集群lc2。
CREATE USER u1 NODE GROUP "lc1" password '{password} ';
CREATE USER u2 NODE GROUP "lc2" password ' {password} ';
- 以用戶u1登錄數據庫,創建新表u1.t1并插入兩條數據,同時授權用戶u2可以訪問該表。
CREATE TABLE u1.t1 (id int, name varchar(20));
INSERT INTO u1.t1 VALUES (1,'joy'),(2,'lily');
GRANT USAGE ON SCHEMA u1 TO u2;
GRANT SELECT ON TABLE u1.t1 TO u2;
- 以用戶u2登錄數據庫,查詢原業務表t1數據,提示無權訪問邏輯集群lc1。結果表明,即使用戶u1已經授權了u2可以訪問該表,但是由于這張表在不同的邏輯集群,所以仍然無法訪問,證明邏輯集群間數據隔離。
SELECT * FROM u1.t1;
- 切回系統管理員dbadmin窗口,將邏輯集群lc1的訪問權限授予用戶u2。
GRANT USAGE ON NODE GROUP lc1 TO u2;
- 再次切到用戶u2窗口,查詢表t1成功。結果驗證綁定了邏輯集群lc2的用戶可以跨邏輯集群查詢到原業務表t1。實現邏輯集群間的數據共享。
SELECT * FROM u1.t1;