當遇到需要進行實時數據處理或大規模數據采集等場景(如:實時分析、日志收集),面臨大量并發讀寫請求時,通過合理的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以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
目前Resharding是單表級別,當使用Resharding時,需要停止該表的寫入(如Flink、數據集成等寫入),對表的查詢不受影響。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狀態的表名稱。