Citus分布式方案(六)- MX(企业版特性)

(六)MX(企业版特性)

Citus MX是Citus的一个新版本,它增加了从Citus集群中的任何节点使用Hash分布表的能力,即,在所有节点上打开多个连接来扩展查询吞吐量,该特性在高速执行水平扩展的小型读写时特别有用。Citus MX目前仅在Citus企业版中可用。

MX概述

在Citus MX架构中,所有节点都是运行Citus扩展的PostgreSQL服务器。一个节点作为协调节点,其他节点作为数据节点,每个节点都有一个热备,在发生故障时自动接管。协调节点是集群的主元数据源,数据节点将实际数据存储在分片中。分布式表只能通过协调器创建、修改或删除,但可以从任何节点查询。当对一个表进行更改(比如添加一个列)时,分布式表的元数据会使用PostgreSQL内置的2PC机制和分布式锁传给关联的数据节点,确保了元数据始终一致。

Citus MX使用了PostgreSQL自己的流复制,它允许分片上执行更高频率的写,避免了通过单个主节点执行所有写操作的瓶颈,线性化的同时,保证一致性。从Citus的角度来看,现在每个分片只有一个副本,因为流复制的存在,它不必保持多个副本同步。在后台,我们监视每个节点,并在出现故障时自动将故障转移到热备用系统。

数据存取

在Citus MX可以通过两种方式访问数据库:

① 通过协调节点创建或改变分布表;
② 通过数据URL,路由到一个数据节点,在该节点上可以对分布式表执行常规查询。这些是保存分片数据的节点,即,存储数据的常规PostgreSQL表。

协调节点上支持的操作有:创建/删除分布式表、分片重平衡、DDL、DML、选择和复制。
数据URL上支持的操作有:DML、选择、复制。

使用psql连接到数据URL并运行\d,那么将得到所有分布式表。在分布式表上执行查询时,将根据筛选条件确定正确的分片,并将查询转发到存储分片的节点。如果一个查询跨越所有的分片,那么它将并行地跨所有节点。

某些情况下可能需要直接对分片执行操作(如添加触发器),那就需要连接到每个数据节点,而不是使用数据URL。我们可以通过从任何节点运行SELECT * FROM master_get_active_worker_nodes()来找到数据节点的主机名,并使用相同的凭证作为数据URL。

使用MX的一种典型方法是通过协调节点手动设置表,然后通过数据URL进行查询。另一种方法是使用协调节点作为应用程序主后端,并使用数据URL进行数据导入,当需要使用本地PostgreSQL表时尤为有效。

扩展原始事件表

由于Citus是PostgreSQL的一个扩展,它可以使用所有PostgreSQL特性,包括JSONB和BRIN索引。当输入数据源生成不同类型的事件数据时,JSONB可以用于表示不同的数据结构,而Brin可以将数据以一种紧凑的按时间排序方式创建索引。

要创建具有JSONB列和BRIN索引的分布式事件表,可以运行以下命令:

psql postgres://citus:pw@coordinator-host:5432/citus?sslmode=require
CREATE TABLE events (
  device_id bigint not null,
  event_id uuid not null default uuid_generate_v4(),
  event_time timestamp not null default now(),
  event_type int not null default 0,
  payload jsonb,
  primary key (device_id, event_id)
);
CREATE INDEX event_time_idx ON events USING BRIN (event_time);
SELECT create_distributed_table('events', 'device_id');

一旦创建了分布式表,我们就可以通过data URL开始使用它,当在一个节点上完成写操作,所有其他节点上立即可见。

$ psql postgres://citus:pw@data-url:5432/citus?sslmode=require
INSERT INTO events (device_id, payload) VALUES (12, '{"temp":"12.8","unit":"C"}');

选择通过特定device_id过滤的查询效率很高,因为Citus可以将它们直接路由到对应的数据节点上,并在指定分片上执行它们。

$ psql postgres://citus:pw@data-url:5432/citus?sslmode=require
SELECT event_id, event_time, payload FROM events WHERE device_id = 12 ORDER BY event_time DESC LIMIT 10;

与常规的Citus一样,执行SQL分析查询与大容量数据获取相结合的能力为实时分析应用程序提供了捷径,比如运行集群中并行的分析查询:

SELECT minute,
       min(temperature)::decimal(10,1) AS min_temperature,
       avg(temperature)::decimal(10,1) AS avg_temperature,
       max(temperature)::decimal(10,1) AS max_temperature
FROM (
       SELECT date_trunc('minute', event_time) AS minute, (payload->>'temp')::float AS temperature
       FROM events WHERE event_time >= now() - interval '10 minutes'
) ev
GROUP BY minute ORDER BY minute ASC;

需要考虑的一个重要方面是,水平扩展处理能力可以确保索引不会在应用程序增长时成为一个瓶颈,结合PostgreSQL非常强大的索引功能以及向外扩展的能力,我们几乎可以获得任意的读和写的性能。

MX的局限性

尽管MX允许从数据节点直接读写,但它不支持对数据节点的所有命令。协调节点作为Citus元数据的来源,更改元数据的查询必须通过协调节点进行。

1. 必须通过协调节点的操作

数据库模式定义语句(DDL命令)。
执行可能会更改Citus元数据的Citus系统函数。
将会访问追加的分布式表的查询。

2. 其他查询限制

Citus MX不支持外部数据包装器(Foreign Data Wrappers),包括cstore_fdw。
序列的类型必须是bigserial。在整个集群中,序列值不会单调增加,因为它的16个最高有效位包含了数据节点的ID。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值