當遇到需要進行即時資料處理或大規模資料擷取等情境(如:即時分析、日誌收集),面臨大量並發讀寫請求時,通過合理的Table Group選擇與Shard Count制定可以實現資料分布和負載平衡,最佳化查詢效能,從根本上提升資料的儲存與計算效率。
Table Group與Shard Count設定建議
Hologres擁有靈活指定Shard和Table Group的特性,相比一些同類產品,具備更加靈活、易用、方便根據具體情境定製化Schema的能力,更加靈活應對業務需求,加上使用者對自身業務的理解,能夠比較高效、充分地利用Hologres高效能。推薦設定Table Group基本原則如下:
如無必要不建議建立Table Group,使用預設Table Group即可,規格詳情請參見執行個體規格概述。
對於大規格執行個體(大於256 Core)建議根據業務情況拆分多個Table Group,以使得業務使用更加均衡。
資料量過大,可建立獨立較大Shard數的Table Group。
表的資料量很小但數量很多,可獨立出一個小Shard數的Table Group,減小Query啟動開銷。
需要Join在一起的表(Local Join),必須放在同一個Table Group中。
不要為每個表都設定一個Table Group。
設定Shard數時,充分考慮Worker個數以及後續的擴容情況,盡量使得Shard數與Worker個數為倍數關係,以此讓資源分派更加平衡。
不支援修改已經建立Table Group的Shard數。如果您需要修改Shard數量,請建立Table Group。
不建議Shard數設定過多,否則會導致無法分配計算資源,帶來額外開銷。Hologres從2.0版本開始,將會預設為單個Table Group的Shard數設定上限,並為整個執行個體設定Shard數上限,防止出現Shard數設定過多導致無法分配計算資源的問題,當超過約定的Shard總數上限時,會提示異常too many shards in this instance,具體Shard數上限規則如下:
單個Table Group的Shard數上限=單個Table Group預設Shard數 * 2
執行個體總的Shard數上限=單個Table Group預設Shard數 * 8
如需調整單Table Group的Shard數上限和執行個體總Shard數上限,需要使用如下GUC參數取消Shard數上限,但是不建議使用,否則可能會因為Shard數過多導致無法分配計算資源。
set hg_experimental_enable_shard_count_cap =off;
Shard數上限一覽表:
執行個體規格
預設計算節點數
預設Shard數(適用於V0.10.31及以上版本)
單個Table Group的shard count上限(適用於V2.0及以上版本)
執行個體總的shard count上限(適用於V2.0及以上版本)
32 Core
2
20
40(20*2)
160(20*8)
64 Core
4
40
80(40*2)
320(40*8)
96 Core
6
60
120(60*2)
480(60*8)
128 Core
8
80
160(80*2)
640(80*8)
160 Core
10
80
160(80*2)
640(80*8)
192 Core
12
80
160(80*2)
640(80*8)
256 Core
16
120
240(120*2)
960(120*8)
384 Core
24
160
320(160*2)
1280(160*8)
512 Core
32
160
320(160*2)
1280(160*8)
......
......
M
M*2
M*8
許可權說明
建立Table Group、修改預設Table Group、刪除Table Group、遷移表的Table Group(Resharding)需要執行個體的Superuser帳號進行操作。使用Superuser帳號執行如下語句為普通使用者授予Superuser許可權。
--將“雲帳號ID”替換為實際使用者名稱。如果是RAM使用者,帳號ID前需要添加“p4_”。 ALTER USER "雲帳號ID" SUPERUSER;
將建立表放入指定Table Group操作需要帳號有建立表許可權。
擷取Table Group中繼資料
查看預設Table Group
SELECT * FROM hologres.hg_table_group_properties WHERE tablegroup_name IN ( SELECT tablegroup_name FROM hologres.hg_table_group_properties WHERE property_key = 'is_default_tg' AND property_value = '1' );
結果:
說明結果中is_default_tg代表為預設Table Group,shard_count代表Table Group對應的Shard數。
tablegroup_name | property_key | property_value -----------------+------------------+---------------- test_tg_default | tg_version | 1 test_tg_default | table_num | 1 test_tg_default | is_default_tg | 1 test_tg_default | shard_count | 3 test_tg_default | replica_count | 1 test_tg_default | created_manually | 0 (6 rows)
查看當前資料庫有哪些Table Group
SELECT tablegroup_name FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;
結果:
tablegroup_name ----------------- test_tg_default (1 row)
查看某Table Group設定的Shard數
SELECT property_value AS shard_count FROM hologres.hg_table_group_properties WHERE property_key = 'shard_count' AND tablegroup_name ='<tg_name>';
結果:
shard_count ------------- 3 (1 row)
查看某Table Group下有哪些表
SELECT table_namespace AS schema_name, table_name FROM hologres.hg_table_properties WHERE property_key = 'table_group' AND property_value = '<tg_name>';
結果:
schema_name | table_name -------------+------------ public | a (1 row)
查看某張表所在的Table Group
SELECT property_value AS table_group_name FROM hologres.hg_table_properties WHERE property_key = 'table_group' AND table_name = '<table_name>';
結果:
table_group_name ------------------ test_tg_default (1 row)
建立Table Group
若是有新上的業務或者需要重新建立Table Group並指定新的Shard數,可以使用以下命令語句。
建立Table Group後,原來的表和資料還會在原Table Group中,不會預設遷移到新的Table Group中。
需要將原來表和資料都遷移至新的Table Group或者刪除,原Table Group才會失效。
CALL HG_CREATE_TABLE_GROUP ('<new_tg_name>', <shard_count>);
參數說明如下:
參數 | 類型 | 說明 |
new_tg_name | Text | 建立的Table Group名。 |
shard_count | INT4 | Table Group對應的Shard數。 |
使用樣本:
-- 建立一個Shard數為8的新Table Group,命名為tg_8
CALL HG_CREATE_TABLE_GROUP ('tg_8', 8);
修改預設Table Group
建立一個資料庫後,執行個體會有一個預設Table Group,以及預設的Shard數。詳情請參見執行個體規格概述。若是資料庫中有多個Table Group,想要修改預設Table Group,使得後續建立的表存放於新的Table Group中,可以使用如下命令語句。
Hologres執行個體V0.9及以上版本執行以下命令語句修改預設Table Group,V0.9以下版本請先升級到更高版本。
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', '<tg_name>');
參數說明:
參數 | 類型 | 說明 |
tg_name | TEXT | 預設Table Group名稱,設定後,其Shard count為設定的Table Group的Shard數。 |
使用樣本:
-- 將新建立TG設為預設Table Group,後續建立的表,將預設使用新的Table Group (v0.9及以上版本)
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', 'tg_8');
將建立表放入指定Table Group
可以通過以下命令語句將建立表,顯式放入指定的Table Group中。
BEGIN;
CREATE TABLE table_name (
col type,
....
);
CALL SET_TABLE_PROPERTY('table_name', 'table_group', '<tg_name>');
COMMIT;
參數說明:
參數 | 類型 | 說明 |
table_name | TEXT | 建立的表名。 |
tg_name | TEXT | 指定的Table Group名稱,設定後,其Shard Count為設定的Table Group的Shard數。 |
使用樣本:
-- 建立表tbl1並直接關聯名為tg_8的Table Group
BEGIN;
CREATE TABLE tbl1 (
col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;
(Resharding)遷移表至建立Table Group
在Hologres中,Shard用於提升資料處理的並發度,合理的設定Shard數,有利於提高查詢或者寫入的效能。一般情況下,Hologres執行個體預設的shard數已經能滿足大部分情境,無需再手動修改。
當執行個體擴容後,例如32core擴容到128core,該資料庫的Shard數不會隨著擴容預設更改,因此建議您針對該資料庫增加Shard數,以擷取更好的效能。如果是該執行個體下建立的DB,其Shard數為當前規格的預設數量。執行個體規格與Shard的相關描述,請參見執行個體規格概述。
當執行個體擴容或者縮容後,其之前DB的Shard數不會自動隨之增加或減少,需要通過命令語句設定Shard數,並重新進行資料匯入。Resharding功能用於修改Shard數後,自動實現Rebalance的功能,無需再重建立表導資料,即可將原來的表和資料Resharding到各Shard上,簡化操作步驟,實現最優效能。
使用限制
僅Hologres V0.10及以上版本支援Resharding,請前往Hologres管控台的執行個體詳情頁查看當前執行個體版本,如果您的執行個體是V0.10以下版本,請您使用自助升級或加入HologresDingTalk交流群反饋,詳情請參見如何擷取更多的線上支援?。
目前Resharding是單表層級,當使用Resharding時,需要停止該表的寫入(如Flink、Data Integration等寫入),對錶的查詢不受影響。V1.1 版本開始,支援
set table readonly
,即時任務寫入自動Failover。Resharding會消耗CPU資源,且在Resharding過程中會導致儲存增加,建議在業務低峰期處理。
如果表開啟了Binlog,請在Resharding之前關掉Binlog,待Resharding完成後再開啟Binlog,詳細操作請參見訂閱Hologres Binlog。
暫不支援表欄位帶有Serial自增序列以及Default值進行Resharding,帶Serial欄位的表在Resharding時會報錯,帶Default欄位的表Resharding後會丟失Default屬性。
表在Resharding時不能有其他的依賴比如view等,若存在請在Resharding前刪除相關依賴,否則會報錯
“ERROR: resharding table xxx can not executed because other objects depend on it.”
。自Hologres V2.2.29版本開始,支援對有View依賴的表執行Resharding。
Resharding只適用簡單模型,不適用於專家模型。關於Hologres許可權模型介紹,詳情請參見Hologres許可權模型概述。
Resharding暫不保留表的動態分區屬性。
僅Hologres V2.0及以上版本的Resharding操作支援保留列COMMENTS。如果您的執行個體版本低於V2.0,請提前備份列COMMENTS,並在Resharding完成後手動設定。
文法樣本
如果您的執行個體為V2.0.24及以上版本,推薦使用HoloWeb進行Resharding操作,詳情請參見Table Resharding。
如果您的執行個體版本低於V2.0.24,可以通過以下命令將業務的部分表遷移至建立的Table Group。如果執行個體版本低於V0.10,請先升級到更高版本。
說明在遷移之前,需要有一個建立的Table Group,若是沒有建立Table Group,請參見建立Table Group進行建立。
表遷移時需要停止對該表的寫入,查詢不受影響。
原Table Group的表全部遷移後,原Table Group將會被自動刪除。若是因為業務需求需要建立多個Table Group,建議合理設定每個Table Group的Shard數。
表遷移時分區表只需要操作父表即可。
-- V1.1及以上版本命令文法 CALL HG_MOVE_TABLE_TO_TABLE_GROUP('<table_name>','<new_table_group_name>'); -- V0.10版本命令文法 CALL HG_UPDATE_TABLE_SHARD_COUNT('<table_name>','<new_table_group_name>');
參數說明
參數
說明
樣本
table_name
需要遷移的表名。一次命令僅支援單表遷移,若是有多個表,需要多次執行。分區表只需要操作父表即可。
new_table
table_group_name
新的Table Group名。
new_tg
異常處理
Table Resharding過程中,會先將表設為唯讀狀態,而後通過暫存資料表的方式進行Table Group遷移。由於Resharding任務涉及資料匯入,可能需要執行較長時間,因此可能會出現多種異常情況,如OOM、手動終止任務等,此時原表會仍處於唯讀狀態,且資料庫中出現名為<initial_table_name>_xxxxxxxx的暫存資料表,此時需要根據如下情況進行操作:
Hologres執行個體版本低於 V2.0.24,請升級執行個體或提交工單解決,升級執行個體請參見執行個體升級。
Hologres執行個體版本為 V2.0.24及以上:
如果您通過HoloWeb進行Resharding操作,請單擊繼續運行或取消任務,詳情請參見Table Resharding。
如果您通過執行上述命令進行Resharding操作,請按以下步驟操作:
如果您希望繼續對該表進行Resharding:對中斷原因進行處理後,重新對該表運行HG_MOVE_TABLE_TO_TABLE_GROUP命令即可。
如果您希望取消Resharding並恢複初始狀態:請依次運行如下命令進行恢複:
-- 取消原表的readonly屬性 CALL set_table_property('<schema_name>.<table_name>','readonly','false'); -- 清理暫存資料表 -- 擷取暫存資料表名(分區表) SELECT schema_name,target_temp_table_name FROM hologres.hg_resharding_properties WHERE reshard_table_name = <schema_name>.<table_name> AND is_parent_table IS TRUE; -- 擷取暫存資料表名(非分區表) SELECT schema_name,target_temp_table_name FROM hologres.hg_resharding_properties WHERE reshard_table_name = <schema_name>.<table_name> AND is_parent_table IS FALSE AND is_sub_table IS FALSE; -- 清理暫存資料表 DROP TABLE IF EXISTS <schema_name>.<target_temp_table_name>; -- 清理系統資料表。系統資料表中會記錄當前表的Resharding進度,如果希望取消任務,需要清理系統資料表中的對應資料 CALL hologres.hg_internal_clear_resharding_properties('<schema_name>.<table_name>');
刪除Table Group
可以通過以下命令語句刪除空的Table Group。如果Table Group有表存在,則無法刪除。
CALL HG_DROP_TABLE_GROUP('<tg_name>');
使用樣本:
--刪除名為tg_8的Table Group
CALL HG_DROP_TABLE_GROUP('tg_8');
查看Shard與Worker的傾斜關係
Shard數與Worker個數存在一定的分配關係,詳情請參見Shard與計算節點Worker的關係。如果Worker個數與Shard分配不均,那麼很容易出現Worker資源傾斜,導致負載不均,資源得不到高效利用。因此在Hologres V1.3版本提供worker_info系統檢視表,用於查詢當前資料庫的Worker、Table Group和Shard之間的關係,從而協助排查解決傾斜問題,詳細的Worker資源傾斜排查請參見查看Worker傾斜關係。
使用最佳實務
Table Group是比較進階的功能,一般情況下,不建議業務建立Table Group以及修改Shard數。若是因為業務有不同的需求,可以按照最佳實務合理規劃,詳情請參見Table Group設定最佳實務。
常見問題
Resharding是個比較複雜的過程,涉及到建立暫存資料表、修改原始表唯讀狀態、寫入目標表、更換表名稱和記錄同步狀態等多個環節,如果中間環節因為某些原因出現異常,可能造成系統狀態不確定等問題,可通過以下方法進行排查。
當出現internal error: Get rundown is not allowed in recovering state.
異常時,說明當前正在更新的表處於Read Only狀態,不能執行Insert、Update、Delete等操作,此時需要退出Read Only狀態。
執行如下命令檢索當前處於Read Only狀態的表。
select * from hologres.hg_table_properties where property_key ='readonly' and property_value='true';
執行如下命令退出Read Only狀態。
call set_table_property('<table_name>','readonly','false');
table_name為需要退出Read Only狀態的表名稱。