Citus
Citus 是一个 PostgreSQL 扩展,它将 PostgreSQL 转换为分布式数据库,能够跨多个节点水平扩展以处理大量数据和查询。
自 Patroni v3.0 以来,已原生支持 Citus 高可用性,简化了 Citus 集群的设置。Pigsty 也为此提供原生支持。
Pigsty v3.7.0 的 Citus 模板固定使用 PostgreSQL 17;该版本没有 PostgreSQL 18 的 Citus 软件包。
Citus 集群
Pigsty 原生支持 Citus。参考 conf/citus.yml。
此示例使用四节点沙盒,包含一个名为 pg-citus 的 Citus 集群,由一个双节点协调器集群 pg-citus0 和两个工作节点集群 pg-citus1 和 pg-citus2 组成。
与标准 PostgreSQL 集群相比,Citus 集群配置有一些特定要求。首先,确保 Citus 扩展被下载、安装、加载和启用。这涉及以下四个参数:
repo_packages:必须包含citus扩展,或者您需要使用带有 Citus 扩展的 PostgreSQL 离线包。pg_extensions:必须包含citus扩展,意味着您需要在每个节点上安装citus扩展。pg_libs:必须包含citus扩展,且必须在列表中排第一,但现在 Patroni 会自动处理。pg_databases:定义安装了citus扩展的主数据库。
另外,确保 Citus 集群的配置正确:
pg_mode:必须设置为citus以告知 Patroni 使用 Citus 模式。pg_primary_db:指定主数据库名称,该数据库必须安装citus扩展(此处命名为citus)。pg_shard:指定统一名称作为所有水平分片 PG 集群的前缀(例如,pg-citus)。pg_group:指定分片编号,协调器集群从零开始,工作节点集群递增。pg_cluster:必须匹配 [pg_shard] 和 [pg_group] 的组合。pg_dbsu_password:设置非空明文密码以确保 Citus 正常运行。pg_parameters:建议设置citus.node_conninfo参数,强制 SSL 访问并要求节点间客户端证书验证。
配置完成后,使用 pgsql.yml 部署 Citus 集群,就像常规 PostgreSQL 集群一样。
管理 Citus 集群
定义 Citus 集群后,使用相同的剧本 pgsql.yml 部署 Citus 集群:
任何 DBSU 用户(postgres)都可以使用 patronictl(别名:pg)列出 Citus 集群的状态:
每个水平分片集群都可以作为单独的 PGSQL 集群处理,使用 pg(patronictl)命令管理。注意使用 pg 管理 Citus 集群时,必须使用 --group 参数指定集群分片编号:
Citus 有一个名为 pg_dist_node 的系统表来记录节点信息,Patroni 会自动维护。
另外,您可以查看用户认证信息(仅限超级用户):
然后您可以使用常规业务用户(例如,具有 DDL 权限的 dbuser_citus)访问 Citus 集群:
使用 Citus 集群
使用 Citus 集群时,我们强烈建议阅读 Citus 官方文档 了解其架构和核心概念。
关键是理解 Citus 中五种类型的表、它们的特征和用例:
- 分布式表
- 引用表
- 本地表
- 本地管理表
- 模式表
在协调器节点上,您可以创建分布式表和引用表,并从任何数据节点查询它们。自版本 11.2 以来,任何 Citus 数据库节点都可以充当协调器。
我们可以使用 pgbench 创建一些表,将主表(pgbench_accounts)分布到各个节点,并将其他较小的表用作引用表:
运行读写基准测试:
生产部署
生产环境的 Citus 部署通常需要为协调器和每个工作节点集群提供物理复制。
例如,在 simu.yml 中有一个 10 节点集群:
我们将在后续教程中涵盖一系列高级主题:
- 读写分离
- 故障转移处理
- 一致性备份和恢复
- 高级监控和故障排除
- 连接池