基于PostgreSQL的分布式数据库—Citus

如果想要处理高并发以及大数据量的任务,那么单台服务器已远不能解决这个问题,随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩大,以分布式为主要特征的数据库系统的研究与开发受到人们的注意。分布式数据库是数据库技术与网络技术相结合的产物,在数据库领域已形成一个分支。

PostgreSQL虽然作为关系型数据库的代表,但它也能够支持分布式功能,除了GreenPLum这一类基于PostgreSQL二次开发的分布式数据库,PostgreSQL本身也可以通过扩展来实现分布式的特性。

关于CitusData公司

有一家PostgreSQL数据库商业软件提供商,名为CitusData,其成立于2011年,这家公司并没有从源头开始设计一个能够处理更大规模和负载的数据库,而是选择了相对于比较成熟的关系型数据库进行扩展,以实现在原有的基础上提高数据的水平扩展。最终是选择了开放度高和可扩展性强的PostgreSQL上作文章,Citus便应运而生。

2019年,微软对外宣布收购了CitusData,无疑是对开源数据库的一种认同和肯定,也是提前对分布式数据的未来做好布局。

Citus介绍

Citus是一种PostgreSQL扩展,它允许数据库服务器(称为节点)在“无共享”架构中相互协调。这些节点形成一个集群,允许PostgreSQL保存更多数据并使用比单台计算机更多的CPU内核。这种架构还允许通过简单地向集群添加更多节点来扩展数据库。

Citus数据库集群包含一个Citus协调器节点和多个工作节点。每个节点都包含称为分片的小型Postgres表。

基于PostgreSQL的分布式数据库—Citus

对于每个查询,协调器要么将其路由到单个工作节点,要么将其并行化到多个节点,具体取决于所需数据是位于单个节点上还是多个节点上。协调器通过查阅其元数据表知道如何做到这一点。这些特定于Citus的表跟踪DNS名称和工作节点的健康状况,以及跨节点的数据分布。可以这么说,Coordinator是个包工头,Workers才是使力气的搬砖人。

分布式数据

Citus集群中有三种类型的表,包括Distributed Tables(分布式表)、Reference Tables(参考表)以及Local Tables(本地表),每种类型用于不同的目的,我们主要来描述一下分布式表的相关内容。

分布式表是最常见的类型,一般建议把大于10G的业务表创建为分布式表,它们在Workers工作节点之间水平分区。

基于PostgreSQL的分布式数据库—Citus

从图中我们可以看到,分布式表的按照设置好的分布式列,将数据打散到各个Worker上,在Coordinator上负责维护元数据,Workers上承担数据的实际存储。以实现了分布式最主要的功能特性。

综合而言,Citus非常适合做单表查询,并且单表的数据量越大,其优势就越明显,当然地,对于实时场景分析也有不俗的表现。但对于Work节点之间需要大量的数据进行交互的场景,并不能发挥Citus的功能特性,它只适合节点之间IO比较小的场景。

Citus的一些功能特性使得它对海量数据的查询有着很好的支持,由于Citus仅仅是一个extension,因此它不仅部署简单,而且能够随着PostgreSQL的更新实现基于扩展的整体内容更新,不修改内核而享受到最新版本的优化体验。以下为简单的安装和使用步骤:

一、确认环境信息

基于PostgreSQL的分布式数据库—Citus

二、在所有节点上执行

下载并添加存储库

# curl https://install.citusdata.com/community/rpm.sh | sudo bash

安装Citus

# sudo yum install -y citus100_13

安装PostgreSQL(此步骤略),并初始化数据库

$ initdb -D /citus1/data

修改配置文件,如果包含多个预载入的共享库,shared_preload_libraries参数的值,citus需要写在第一个。同时,修改配置连接,设置远端可访问

$ vim postgresql.conf
shared_preload_libraries = 'citus'
listen_addresses = '*'

修改白名单验证,来保证集群之间各节点的正常通讯

$ vim ph_hba.conf
host    all             all             192.168.0.0/16            trust

启动数据库服务,创建citus扩展

$ pg_ctl start -D /citus1/data
citus=# create extension citus;

三、在Coordinator节点上执行

添加工作节点,这里我们使用citus_add_node()函数来添加两个工作节点

citus=# SELECT * from citus_add_node('node1', 5438);
citus=# SELECT * from citus_add_node('node2', 5439);

查看已添加的工作节点,至此,部署完成

citus=# SELECT * FROM citus_get_active_worker_nodes();
基于PostgreSQL的分布式数据库—Citus

四、创建分布式表

下面来创建一张分布式表

citus=# create table citus_test(id int,name text);

使用表citus_test的”id”列作为分布列,对于分布列的选择,我们推荐选择一个具有高基数的列作为分布列,并且尽可能地选择包含均匀分布的列

citus=# SELECT create_distributed_table('citus_test','id');

我们来对比一下Coordinator节点上的表和Work上节点的表所展现的情况

Coordinator节点的表:

基于PostgreSQL的分布式数据库—Citus

Workers节点上的表:

基于PostgreSQL的分布式数据库—Citus

在Coordinator节点上插入测试数据,并在该表上做查询。查看一下执行计划,可以看到该结果是从node1上,且端口号为5438的Work节点上找到的,也能够看到具体是从哪个小表中查询到的这条记录。

基于PostgreSQL的分布式数据库—Citus

至此,基于Citus插件实现的PostgreSQL分布式集群搭建完成。相较于传统的集中式数据库,分布式数据库皆在提高数据库的吞吐能力和可扩充性,其灵活的体系结构可以为数据服务提供更强大的支撑。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/237335.html

(0)
上一篇 2022年1月25日 22:08
下一篇 2022年1月25日 22:09

相关推荐

发表回复

登录后才能评论