Greenplumhash分佈演算法

德哥發表於2018-01-02

標籤

PostgreSQL , hash , cdbhash , 一致性hash演算法


背景

Greenplum,如果從master節點寫入資料的話,寫入效能實際上是比較差的,但是我們可以直接連資料節點來寫入:

《讓greenplum的oltp效能飛起來》

這種用法需要客戶端從master獲取gp_segment_configuration,同時需要獲取表的分佈鍵,同時需要使用cdbhash演算法算出記錄應該寫入哪個segment節點,這種方法不保證全域性一致性,建議選擇場景使用。

hash演算法

src/backend/cdb/cdbhash.c

算出的值對應gp_segment_configuration.content.

獲取GPDB叢集配置

postgres=# select * from gp_segment_configuration ;
 dbid | content | role | preferred_role | mode | status | port  |     hostname      |  address  | replication_port | san_mounts 
------+---------+------+----------------+------+--------+-------+-------------------+-----------+------------------+------------
    1 |      -1 | p    | p              | s    | u      | 15432 | .sqa.tbc | localhost |                  | 
    2 |       0 | p    | p              | s    | u      | 25432 | .sqa.tbc | localhost |                  | 
    3 |       1 | p    | p              | s    | u      | 25433 | .sqa.tbc | localhost |                  | 
    4 |       2 | p    | p              | s    | u      | 25434 | .sqa.tbc | localhost |                  | 
    5 |       3 | p    | p              | s    | u      | 25435 | .sqa.tbc | localhost |                  | 
    6 |       4 | p    | p              | s    | u      | 25436 | .sqa.tbc | localhost |                  | 
    7 |       5 | p    | p              | s    | u      | 25437 | .sqa.tbc | localhost |                  | 
    8 |       6 | p    | p              | s    | u      | 25438 | .sqa.tbc | localhost |                  | 
    9 |       7 | p    | p              | s    | u      | 25439 | .sqa.tbc | localhost |                  | 

content就是hash value,注意-1表示master,0開始表示segment,如果有mirror的話,content會重複,每個content id都有兩條,分別表示primary 和 mirror。

通過role判斷當前屬於什麼角色,選擇primary寫入。

注意有MIRROR時,如果PRIMARY掛了會自動切換到MIRROR,所以建議寫入時,如果發現失敗,再從master獲取新的gp_segment_configuration,找到對應content id的當前role=p的連線。

hostname, port表示節點的真實連線斷開和主機名。

獲取分佈鍵

********* QUERY **********
SELECT attrnums
FROM pg_catalog.gp_distribution_policy t
WHERE localoid = `721689` 
**************************

********* QUERY **********
SELECT attname FROM pg_attribute 
WHERE attrelid = `721689` 
AND attnum = `1` 
**************************

如果gp_distribution_policy獲取到的attrnums是空,表示隨機分佈。


相關文章