全部產品
Search
文件中心

Hologres:Table Group與Shard Count操作指南

更新時間:Dec 05, 2024

當遇到需要進行即時資料處理或大規模資料擷取等情境(如:即時分析、日誌收集),面臨大量並發讀寫請求時,通過合理的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中繼資料

  1. 查看預設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)
  2. 查看當前資料庫有哪些Table Group

    SELECT tablegroup_name
    FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;

    結果:

    tablegroup_name
    -----------------
     test_tg_default
    (1 row)
  3. 查看某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)
  4. 查看某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)
  5. 查看某張表所在的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操作,請按以下步驟操作:

        1. 如果您希望繼續對該表進行Resharding:對中斷原因進行處理後,重新對該表運行HG_MOVE_TABLE_TO_TABLE_GROUP命令即可。

        2. 如果您希望取消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狀態。

  1. 執行如下命令檢索當前處於Read Only狀態的表。

    select * from hologres.hg_table_properties where property_key ='readonly' and property_value='true';
  2. 執行如下命令退出Read Only狀態。

    call set_table_property('<table_name>','readonly','false');

    table_name為需要退出Read Only狀態的表名稱。