作者:Digital Observer(施嘉伟)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年数据库行业经验,现主要从事数据库服务工作
拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证
ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师
第一部分 说明
Citus 是一种 PostgreSQL 扩展,它允许数据库服务器(称为节点)在"无共享"架构中相互协调。 这些节点形成一个集群,允许 PostgreSQL 保存更多数据并使用比单台计算机更多的 CPU 内核。 这种架构还允许通过简单地向集群添加更多节点来扩展数据库。
Citus 数据库集群包含一个 Citus 协调器节点和多个工作节点。 每个节点都包含称为分片的小型 Postgres 表。
对于每个查询,协调器要么将其路由到单个工作节点,要么将其并行化到多个节点,具体取决于所需数据是位于单个节点上还是多个节点上。 协调器通过查阅其元数据表知道如何做到这一点。 这些特定于 Citus 的表跟踪 DNS 名称和工作节点的健康状况,以及跨节点的数据分布。可以这么说,Coordinator是个包工头,Workers才是使力气的搬砖人。
Citus 集群中有三种类型的表,包括Distributed Tables(分布式表)、Reference Tables(参考表)以及Local Tables(本地表),每种类型用于不同的目的,我们主要来描述一下分布式表的相关内容。
分布式表是最常见的类型,一般建议把大于10G的业务表创建为分布式表,它们在Workers工作节点之间水平分区。
从图中我们可以看到,分布式表的按照设置好的分布式列,将数据打散到各个Worker上,在Coordinator上负责维护元数据,Workers上承担数据的实际存储。以实现了分布式最主要的功能特性。
综合而言,Citus非常适合做单表查询,并且单表的数据量越大,其优势就越明显,当然地,对于实时场景分析也有不俗的表现。但对于Work节点之间需要大量的数据进行交互的场景,并不能发挥Citus的功能特性,它只适合节点之间IO比较小的场景。
1.1 环境规划
本操作使用1个coordinator、2个worker进行部署:
PG版本13
citus10.0
主机名 | IP地址 | 数据库端口 |
---|---|---|
cnode | 192.168.22.128 | 5437 |
node1 | 192.168.22.129 | 5438 |
node2 | 192.168.22.130 | 5439 |
第二部分 操作步骤
2.1 安装citus扩展
以下步骤在所有节点上执行。
2.1.1 下载并添加存储库
shell
# curl https://install.citusdata.com/community/rpm.sh | sudo bash
2.1.2 安装citus
shell
# sudo yum install -y citus100_13
2.1.3 初始化数据库
安装PostgreSQL(此步骤见《基于Linux的PostgreSQL12源码安装标准化实施文档》),并初始化数据库
shell
$ initdb -D /citus1/data
2.1.4 配置数据库参数
修改配置文件,如果包含多个预载入的共享库,shared_preload_libraries 参数的值,citus需要写在第一个。同时,修改配置连接,设置远端可访问
shell
$ vim postgresql.conf
shared_preload_libraries = 'citus'
listen_addresses = '*'
修改白名单验证,来保证集群之间各节点的正常通讯
shell
$ vim ph_hba.conf
host all all 192.168.0.0/16 trust
2.1.5 创建citus扩展
启动数据库服务,创建citus扩展
shell
$ pg_ctl start -D /citus1/data
citus=# create extension citus;
2.2 添加节点信息
在coordinator节点上使用citus_add_node()函数来添加两个工作节点
shell
citus=# SELECT * from citus_add_node('node1', 5438);
citus=# SELECT * from citus_add_node('node2', 5439);
查看已添加的工作节点,至此,部署完成
shell
citus=# SELECT * FROM citus_get_active_worker_nodes();
2.3 创建分布式表
创建一张分布式表
shell
citus=# create table citus_test(id int,name text);
使用表citus_test的"id"列作为分布列,对于分布列的选择,我们推荐选择一个具有高基数的列作为分布列,并且尽可能地选择包含均匀分布的列
shell
citus=# SELECT create_distributed_table('citus_test','id');
们来对比一下Coordinator节点上的表和Work上节点的表所展现的情况
Coordinator节点的表:
Workers节点上的表:
在Coordinator节点上插入测试数据,并在该表上做查询。查看一下执行计划,可以看到该结果是从node1上,且端口号为5438的Work节点上找到的,也能够看到具体是从哪个小表中查询到的这条记录。