Citus 目前仅支持创建分布式外部表。让我们举个例子:
CREATE FOREIGN TABLE audit (
id integer NOT NULL,
ctime timestamp without time zone DEFAULT now() NOT NULL,
site_id integer NOT NULL,
client_id integer,
done_time timestamp without time zone,
status text DEFAULT 'NEW' NOT NULL,
file_id character varying(16) DEFAULT ''::character varying NOT NULL
) SERVER mysql_svr
OPTIONS (dbname 'constructor', table_name 'audit');
您现在可以使用以下方式分发它:
SELECT * FROM master_create_distributed_table('audit', 'id', 'append');
并使用以下方法创建分片:
SELECT master_create_worker_shards('audit', <shard_count>);
但是,在工作节点上创建的每个分片都将继承与主节点相同的选项。因此,在本例中,每个分片将指向 dbname 'constructor' 和外部表 'audit'。创建这种分布的价值有限,因为即使 Citus 会发出并行查询,它们也会再次发送到单个节点和表。
为了构建一个更有用的示例,假设您已经有一些(比如说 8 个)分片 MySQL 表,例如 audit_1、audit_2、...、audit_8。
您可以构建与上面相同的表,并创建一个分布式设置,如下所示:
SELECT * FROM master_create_distributed_table('audit', 'id', 'append');
并使用以下方法创建分片:
SELECT master_create_worker_shards('audit', 8);
您现在需要登录每个 Citus 工作节点,并更新每个分片以指向其相关的 MySQL 分片。
例如:ALTER TABLE audit_100208 OPTIONS (SET table_name 'audit_1');
如果表分布在多个节点或数据库中,则需要为每个 Citus 工作节点上的每个外部节点手动创建特定服务器。
这里有一些需要注意的警告。一方面,我们将分布标记为“附加”,因为我们不知道外部表的基础分布。如果你使用哈希,你可能会通过 Citus 得到错误的分区修剪。可能还有其他警告,因为这不是我们积极支持或测试过的用例。从历史的角度来看,我们主要将其用作概念验证来尝试读取分布在多个节点上的平面文件。
** 编辑 ** 添加对 Eugen 其他问题的回复。另外,请注意,此类问答最适合此处的邮件列表:
https ://groups.google.com/forum/#!forum/citus-users
通过“部分支持”,我的意思是我们将推动外部表的创建,但不会自动将不同的外部表设置映射到不同的分片。
SQL 和 PostgreSQL 具有广泛的特性,我们目前并不支持所有这些特性。我们正在编制一份可用功能列表,但与此同时,如果您对任何功能感兴趣,请告诉我们。
当您发出 master_create_distributed_table 时,我们会自动创建存储类型为“f”的分片。