天天看點

Citus 多CN部署與Citus MX再談Citus 多CN部署與Citus MX

再談Citus 多CN部署與Citus MX

Citus叢集由Coordinator(CN節點)和Worker節點組成。CN節點上放中繼資料負責SQL分發; Worker節點上放實際的分片,各司其職。

但是,Citus裡它們的功能也可以靈活的轉換。

1. Worker as CN

當一個普通的Worker上存儲了中繼資料後,就有了CN節點分發SQL的能力,可以分擔CN的負載。

這樣的Worker按官方的說法,叫做Citus MX節點。

配置Citus MX的前提條件為Citus的複制模式必須配置為

streaming

。即不支援在多副本的HA部署架構下使用

citus.replication_model = streaming           

然後将普通的Worker變成Citus MX節點

select start_metadata_sync_to_node('127.0.0.1',9002);           

預設情況下,Citus MX節點上也會配置設定分片。官方的Citus MX架構中,Citus MX叢集中所有Worker都是Citus MX節點。

如果我們隻想讓少數幾個Worker節點專門用于分擔CN負載,那麼這些節點上是不需要放分片的。

可以通過設定節點的shouldhaveshards屬性進行控制。

SELECT master_set_node_property('127.0.0.1', 9002, 'shouldhaveshards', false);           

2. CN as Worker

Citus裡CN節點也可以作為一個Worker加到叢集裡。

SELECT master_add_node('127.0.0.1', 9001, groupid => 0);           

CN節點作為Worker後,參考表也會在CN上存一個副本,但預設分片是不會存在上面的。

如果希望分片也在CN上配置設定,可以把CN的shouldhaveshards屬性設定為true。

SELECT  master_set_node_property('127.0.0.1', 9001, 'shouldhaveshards', true);           

配置後Citus叢集成員如下:

postgres=# select * from pg_dist_node;
 nodeid | groupid | nodename  | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards 
--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------
      1 |       1 | 127.0.0.1 |     9001 | default  | f           | t        | primary  | default     | f              | t
      3 |       0 | 127.0.0.1 |     9000 | default  | t           | t        | primary  | default     | f              | t
      2 |       2 | 127.0.0.1 |     9002 | default  | t           | t        | primary  | default     | t              | f
(3 rows)           

把CN作為Worker用展現了Citus的靈活性,但是其适用于什麼場景呢?

官方文檔的舉的一個例子是,本地表和參考表可以Join。

這樣的場景我們确實有,那個系統的表設計是:明細表分片,維表作參考表,報表作為本地表。

報表之是以做成本地表,因為要支援高并發通路,但是又找不到合适的分布鍵讓所有SQL都以路由方式執行。

報表做成參考表也不合适,副本太多,影響寫入速度,存儲成本也高。

那個系統用的Citus 7.4,還不支援這種用法。當時為了支援報表和參考表的Join,建了一套本地維表,通過觸發器確定本地維表和參考維表同步。

3. 分片隐藏

在Citus MX節點(含作為Worker的CN節點)上,預設shard是隐藏的,即psql的'd'看不到shard表,隻能看到邏輯表。

Citus這麼做,可能是擔心有人誤操作shard表。

如果想在Citus MX節點上檢視有哪些shard以及shard上的索引。可以使用下面的視圖。

  • citus_shards_on_worker

  • citus_shard_indexes_on_worker

或者設定下面的參數

citus.override_table_visibility = false           

4. Citus是怎麼隐藏分片的?

Citus的plan hook(distributed_planner)中篡改了

pg_table_is_visible

函數,将其替換成

citus_table_is_visible

這個隐藏隻對依賴

pg_table_is_visible

函數的地方有效,比如psql的

\d

。直接用SQL通路shard表是不受影響的。

static bool
ReplaceTableVisibleFunctionWalker(Node *inputNode)
{
...
        if (functionId == PgTableVisibleFuncId())
        {
            ...
            functionToProcess->funcid = CitusTableVisibleFuncId();
        ...           

5. Citus多CN方案的限制和不足

  1. 不能和多副本同時使用
  2. Citus MX節點不能通路本地表
  3. 不能控制Citus MX節點上不部署參考表

6. 參考