Citus 是否支持使用 mysql_fdw 创建分片?

Does Citus support creating shards using mysql_fdw?

master_get_table_metadata 函数的 Citus documentation 指出:

part_storage_type: Type of storage used for the table. May be ‘t’ (standard table), ‘f’ (foreign table) or ‘c’ (columnar table).

但我搜索了整个文档,没有找到任何示例说明如何使用 'f'(外国 table) 分发的 tables分区存储类型。

我想最初的外国 table 可以使用以下方法创建:

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');

但创建后如何分发 table?分片将如何创建?

更新

我找到了this

FOREIGN (‘f’) — Indicates that shard stores foreign data. (Used by distributed file_fdw tables)

所以我的问题仍然存在:是否可以使用其他外国数据包装器,例如mysql_fdw?

创建分布式外部 tables 目前在 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' 和 foreign table 'audit'。创建这样的分布的价值有限,因为即使 Citus 会发出并行查询,它们也会再次发送到单个节点并且 table.

为了构造一个更有用的示例,假设您已经有一些(比如说 8 个)分片 MySQL table,例如audit_1, audit_2, ..., audit_8.

您可以构建与上面相同的 table,并像这样创建一个分布式设置:

SELECT * FROM master_create_distributed_table('audit', 'id', 'append');

并使用以下方法创建分片:

SELECT master_create_worker_shards('audit', 8);

您现在需要登录到每个 Citus 工作节点,并更新每个分片以指向它相关的 MySQL 分片。

例如: 更改 TABLE audit_100208 选项(设置 table_name 'audit_1');

如果您有 tables 分布在多个节点或数据库中,您需要为每个 Citus 工作节点上的每个外部节点手动创建特定服务器。

这里有一些注意事项需要注意。其一,我们将分布标记为'append',因为我们不知道国外的底层分布table。如果你使用散列,你可能会通过 Citus 得到错误的分区修剪。可能还有其他注意事项,因为这不是我们积极支持或测试过的用例。从历史的角度来看,我们主要将其用作概念验证来尝试读取分布在多个节点上的平面文件。

** 编辑 ** 添加对 Eugen 的其他问题的回答。 另外,请注意,这样的 Q/A 最适合这里的邮件列表: https://groups.google.com/forum/#!forum/citus-users

  • 通过'partial support',我的意思是我们将下推外部table创建,但不会自动将不同的外部table设置映射到不同的分片。

  • SQL 和 PostgreSQL 具有广泛的功能,我们目前并不支持所有功能。我们正在编制一份可用功能列表,但与此同时,如果您对任何功能感兴趣,请告诉我们。

  • 当您发出 master_create_distributed_table.

  • 时,我们会自动创建存储类型为 'f' 的分片