再談Citus 多CN部署與Citus MX

Citus集羣由Coordinator(CN節點)和Worker節點組成。CN節點上放元數據負責SQL分發; Worker節點上放實際的分片,各司其職。 可是,Citus裏它們的功能也能夠靈活的轉換。html

1. Worker as CN

當一個普通的Worker上存儲了元數據後,就有了CN節點分發SQL的能力,能夠分擔CN的負載。 這樣的Worker按官方的說法,叫作Citus MX節點。node

配置Citus MX的前提條件爲Citus的複製模式必須配置爲streaming。即不支持在多副本的HA部署架構下使用sql

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屬性進行控制。async

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

2. CN as Worker

Citus裏CN節點也能夠做爲一個Worker加到集羣裏。ide

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的靈活性,可是其適用於什麼場景呢?post

官方文檔的舉的一個例子是,本地表和參考表能夠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. 參考

相關文章
相關標籤/搜索