基于Linux的citus搭建标准化

作者: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节点上找到的,也能够看到具体是从哪个小表中查询到的这条记录。

相关推荐
Elastic 中国社区官方博客40 分钟前
将自定义 AWS S3 快照存储库连接到 Elastic Cloud
大数据·运维·人工智能·elasticsearch·搜索引擎·云计算·aws
工业3D_大熊1 小时前
如何在AWS中部署HOOPS Communicator?Docker容器化策略!
linux·c++·3d·docker·c#·云计算·aws
likeyou~coucou2 小时前
Linux中网络文件系统nfs使用
linux·运维·服务器
誓约酱2 小时前
Linux 内核 调用堆栈打印函数
linux·运维·服务器·c++
->yjy2 小时前
系统性能定时监控Python&Linux
linux·开发语言·python
may-daydayup2 小时前
【Linux】Linux 内存管理机制
linux·运维
吖吖耶3332 小时前
【Linux】网络基本配置命令
linux·运维·网络
楚疏笃2 小时前
linux安全管理-会话安全
linux·前端·安全
梦想画家3 小时前
在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决
linux·ubuntu·docker·wsl2