创建和分布表
要创建分布式表,您需要首先定义表 schema
。 为此,您可以使用 CREATE TABLE 语句定义一个表,就像使用常规 PostgreSQL
表一样。
CREATE TABLE github_events
(
event_id bigint,
event_type text,
event_public boolean,
repo_id bigint,
payload jsonb,
repo jsonb,
actor jsonb,
org jsonb,
created_at timestamp
);
接下来,您可以使用 create_distributed_table()
函数指定表分布列并创建工作分片。
SELECT create_distributed_table('github_events', 'repo_id');
该函数通知 Citus github_events
表应该分布在 repo_id
列上(通过哈希列值)。该函数还使用 citus.shard_count
和 citus.shard_replication_factor
配置值在工作节点上创建分片。
此示例将创建总共 citus.shard_count
个分片,其中每个分片拥有一部分哈希令牌空间并根据默认的 citus.shard_replication_factor
配置值进行复制。在 worker
上创建的 shard
副本与 coordinator
上的表具有相同的表 schema
、索引和约束定义。 创建副本后,此函数将所有分布式元数据保存在协调器上。
每个创建的分片都分配有一个唯一的分片 ID
,并且它的所有副本都具有相同的分片 ID
。 每个分片在工作节点上表示为一个名为 tablename_shardid
的常规 PostgreSQL
表,其中 tablename
是分布式表的名称,shardid
是分配给该分片的唯一 ID
。 您可以连接到工作节点(worker) postgres
实例以查看或在各个分片上运行命令。
您现在已准备好将数据插入分布式表并对其运行查询。您还可以在文档的 Citus Utility Functions 中了解有关本节中使用的 UDF
的更多信息。
- Citus Utility Functions
引用表
上述方法将表分布到多个水平分片中,但另一种可能是将表分布到单个分片中并将分片复制到每个工作节点。以这种方式分布的表称为引用表
。 它们用于存储集群中多个节点需要频繁访问的数据。
引用表的常见候选包括:
- 较小的表需要与较大的分布式表连接。
- 多租户应用程序中缺少
租户 ID
列或不与租户关联的表。 (在某些情况下,为了减少迁移工作,用户甚至可以选择从与租户关联但当前缺少租户 ID
的表中创建引用表。) - 需要跨多个列的唯一约束并且足够小的表。
例如,假设一个多租户电子商务网站需要为其任何商店的交易计算销售税。 税务信息并非特定于任何租户。 将其合并到共享表中是有意义的。 以美国为中心的引用表可能如下所示:
-- a reference table
CREATE TABLE states (
code char(2) PRIMARY KEY,
full_name text NOT NULL,
general_sales_tax numeric(4,3)
);
-- distribute it to all workers
SELECT create_reference_table('states');
现在,诸如为购物车计算税款之类的查询可以在没有网络开销的情况下加入 states
表,并且可以将外键添加到 state
代码中以进行更好的验证。
除了将表分布为单个复制分片之外,create_reference_table
UDF 将其标记为 Citus
元数据表中的引用表。Citus
自动执行两阶段提交 (2PC) 以修改以这种方式标记的表,这提供了强大的一致性保证。
如果您有一个现有的分布式表,您可以通过运行将其更改为引用表:
SELECT undistribute_table('table_name');
SELECT create_reference_table('table_name');
有关在多租户应用程序中使用引用表的另一个示例,请参阅在租户之间共享数据。
分布协调器数据
如果将现有的 PostgreSQL
数据库转换为 Citus
集群的协调器节点,则其表中的数据可以高效地分布,并且对应用程序的中断最小。
前面描述的 create_distributed_table
函数适用于空表和非空表,对于后者