【赵渝强老师】基于PostgreSQL的分布式数据库:Citus

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介: Citus 是基于 PostgreSQL 的开源分布式数据库,采用 shared nothing 架构,具备良好的扩展性。它以插件形式集成,部署简单,适用于处理大规模数据和高并发场景。本文介绍了 Citus 的基础概念、安装配置步骤及其在单机环境下的集群搭建方法。

b368.png

由于PostgreSQL具有强大的功能和良好的可扩展性,因此基于PostgreSQL很容易就可以实现分布式架构。Citus便是具体的一种实现方式。它以扩展的插件形式与PostgreSQL进行集成,且独立于PostgreSQL内核,部署也比较简单。Citus是现在非常流行的基于PostgreSQL的分布式解决方案。


一、 Citus基础


下面是百度百科中对分布式数据库的定义:

分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都可能有DBMS的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库。

——摘自《百度百科》


视频讲解如下:


1.1  为什么需要分布式数据库?


随着行业应用所产生的数据量呈爆炸式增长,传统的集中式数据库面对大规模数据处理逐渐表现出其局限性。这主要体现在以下三个方面:

  • 应用请求访问的数据量巨大;
  • 由于数据量巨大,造成服务器CPU、内存、网络、I\O都遇到瓶颈,从而造成性能下降;
  • 传统的集中式数据库在设计之初并不包含任务的并行执行,从而导致并行执行有天然的缺陷,对于分区也是如此。


因此,能快速处理数据和及时响应用户访问的新方法,以及对数据进行集中分析、管理和维护,这已经成为迫切需求。基于这样的背景,分布式数据库便在集中式数据库的基础上迅速发展起来的。分布式数据库是指数据在物理上分布而在逻辑上集中管理的数据库系统。


物理上分布是指数据分布在物理位置不同并由网络连接的节点或站点上;逻辑上集中是指各数据库节点之间的逻辑上是一个整体,并由统一的数据库管理系统管理。


分布式数据库具有数据透明性、数据冗余性、易于扩展性、自治性等特点,还具有经济、性能优越、响应速度更快、灵活的体系结构、易于集成现有系统等特点。但分布式数据库强烈依赖网络,且对事务的处理远没有传统的集中式数据库成熟。因此在很长一段时间内分布式数据存储将与传统数据存储共存。


1.2  什么是Citus?


Citus采用shared nothing架构,节点之间无共享数据,它是一款基于PostgreSQL的开源分布式数据库。Citus不仅仅兼容PostgreSQL的客户端协议,同时也兼容PostgreSQL的服务端扩展和管理工具。相比单实例的PostgreSQL数据库来说,Citus可以使用更多的CPU内核,更多的内存数量,保存更多的数据。通过向集群添加节点,Citus可以轻松的扩展数据库。Citus的最大特点是它是一个PostgreSQL扩展而不是一个独立的代码分支。因此Citus可以用很小的代价和更快的速度与PostgreSQL进行集成,同时又能最大程度的保证数据库的稳定性和兼容性。下图展示了Citus的体系架构。


image.png


Citus的体系架构中包含协调者节点和工作者节点,即:Coordinator节点和Worker节点。SQL语句经过语法解析后,在协调者节点的分析阶段被Citus扩展所替换,将其转换为并行执行的SQL分发到后端的工作者节点上执行。

# 这里的协调者和工作者都是PostgreSQL数据库实例。


二、 安装与配置Citus


在了解到了Citus的基本知识以后,下面便通过具体的步骤来演示如何安装和配置Citus。

# Citus既可以安装在单机环境中,也可以安装在多机环境中。
# 下面将以单机环境来进行演示说明。


(1)将用户postgres添加到系统的/etc/sudoers文件中。

postgres ALL=(ALL)       ALL


(2)切换到postgres用户

su - postgres


(3)安装Citus的域名源

curl https://install.citusdata.com/community/rpm.sh | sudo bash
# 输出的信息如下:
Detected operating system as centos/7.
Checking for curl...
Detected curl...
Checking for postgresql15-server...
Installing pgdg repo... Error: Nothing to do
done.
Checking for EPEL repositories...
Detected EPEL repoitories
Downloading repository file
Installing pygpgme to verify GPG signatures... done.
Installing yum-utils... done.
Generating yum cache for citusdata_community... done.
The repository is set up! You can now install packages.
# 这一步需要输入用户postgres的密码。


(4)安装Citus。

sudo yum install -y citus113_15
# 这一步会自动将PostgreSQL 15安装到/usr/pgsql-15/目录下。


(5)查看目录/usr/pgsql-15/的结构。

[postgres@mydb ~]$ tree -d -L 2 /usr/pgsql-15/
/usr/pgsql-15/
├── bin
├── doc
│   └── extension
├── include
│   └── server
├── lib
│   ├── bitcode
│   └── citus_decoders
└── share
    ├── extension
    ├── locale
    ├── man
    ├── timezonesets
    └── tsearch_data


(6)创建协调者和工作者的目录。

mkdir -p /home/postgres/citus_cluster/coordinator
mkdir -p /home/postgres/citus_cluster/worker1
mkdir -p /home/postgres/citus_cluster/worker2
# 这里将以一个协调者和两个工作者来进行演示。


(7)实例化PostgreSQL数据库数据目录

/usr/pgsql-15/bin/initdb -D /home/postgres/citus_cluster/coordinator
/usr/pgsql-15/bin/initdb -D /home/postgres/citus_cluster/worker1
/usr/pgsql-15/bin/initdb -D /home/postgres/citus_cluster/worker2


(8)修改coordinator的postgres.conf配置文件中的以下参数。

port = 5432
shared_preload_libraries = 'citus'


(9)修改worker1的postgres.conf配置文件中的以下参数。

port = 5433
shared_preload_libraries = 'citus'


(10)修改worker2的postgres.conf配置文件中的以下参数。

port = 5434
shared_preload_libraries = 'citus'


(11)启动coordinator、worker1和worker。

/usr/pgsql-15/bin/pg_ctl \
          -D /home/postgres/citus_cluster/coordinator \
          -l logfile start
/usr/pgsql-15/bin/pg_ctl \
          -D /home/postgres/citus_cluster/worker1 \
          -l logfile start
/usr/pgsql-15/bin/pg_ctl \
          -D /home/postgres/citus_cluster/worker2 \
          -l logfile start


(12)登录coordinator、worker1和woker2创建数据库和Citus扩展。

-- coordinator节点
[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql 
psql (15.3)
Type "help" for help.
postgres=# create database mydemodb;
CREATE DATABASE
postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# create extension citus;
CREATE EXTENSION
mydemodb=# 
-- woker1节点
[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql -p 5433
psql (15.3)
Type "help" for help.
postgres=# create database mydemodb;
CREATE DATABASE
postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# create extension citus;
CREATE EXTENSION
mydemodb=# 
-- woker2节点
[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql -p 5434
psql (15.3)
Type "help" for help.
postgres=# create database mydemodb;
CREATE DATABASE
postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# create extension citus;
CREATE EXTENSION
mydemodb=#


(13)在coordinator节点上向集群添加worker节点。

[postgres@mydb citus_cluster]$ /usr/pgsql-15/bin/psql 
psql (15.3)
Type "help" for help.
postgres=# \c mydemodb 
You are now connected to database "mydemodb" as user "postgres".
mydemodb=# select * from mast
mydemodb=# select * from master_add_node('127.0.0.1',5433);
 master_add_node 
-----------------
               1
(1 row)
mydemodb=# select * from master_add_node('127.0.0.1',5434);
 master_add_node 
-----------------
               2
(1 row)


(14)在coordinator节点上验证集群中的worker节点信息。

mydemodb=# select * from master_get_active_worker_nodes();
# 输出的信息如下:
 node_name | node_port 
-----------+-----------
 127.0.0.1 |      5433
 127.0.0.1 |      5434
(2 rows)


(15)通过查询pg_dist_node表可以获取worker节点的详细信息。

mydemodb=# \x
mydemodb=# select * from pg_dist_node ;
# 输出的信息如下:
-[ RECORD 1 ]----+----------
nodeid           | 1
groupid          | 1
nodename         | 127.0.0.1
nodeport         | 5433
noderack         | default
hasmetadata      | t
isactive         | t
noderole         | primary
nodecluster      | default
metadatasynced   | t
shouldhaveshards | t
-[ RECORD 2 ]----+----------
nodeid           | 2
groupid          | 2
nodename         | 127.0.0.1
nodeport         | 5434
noderack         | default
hasmetadata      | t
isactive         | t
noderole         | primary
nodecluster      | default
metadatasynced   | t
shouldhaveshards | t


至此Citus分布式数据库集群环境配置完成。






相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
打赏
0
2
2
1
195
分享
相关文章
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
174 62
ClickHouse分布式数据库动态伸缩(弹性扩缩容)的实现
实现ClickHouse数据库的动态伸缩需要持续的维护和精细的操作。从集群配置到数据迁移,再到监控和自动化,每一步都要仔细管理以确保服务的可靠性和性能。这些活动可以显著提高应用的响应性和成本效率,帮助业务根据实际需求灵活调整资源分配。
128 10
【赵渝强老师】PostgreSQL的并行查询
PostgreSQL的并行查询功能通过多CPU提升查询速度,尤其适用于处理大量数据但返回少量结果的场景。它利用Leader进程、Gather节点和Worker线程协作完成查询任务,显著提高性能。本文详细解析其工作原理及适用场景,并通过实例展示开启与关闭并行查询的性能差异。
【赵渝强老师】在PostgreSQL中访问Oracle
本文介绍了如何在PostgreSQL中使用oracle_fdw扩展访问Oracle数据库数据。首先需从Oracle官网下载三个Instance Client安装包并解压,设置Oracle环境变量。接着从GitHub下载oracle_fdw扩展,配置pg_config环境变量后编译安装。之后启动PostgreSQL服务器,在数据库中创建oracle_fdw扩展及外部数据库服务,建立用户映射。最后通过创建外部表实现对Oracle数据的访问。文末附有具体操作步骤与示例代码。
137 6
【赵渝强老师】在PostgreSQL中访问Oracle
【赵渝强老师】在PostgreSQL中使用file_fdw访问外部文件系统
本文介绍了PostgreSQL的file_fdw扩展,它支持直接从数据库访问服务器文件系统中的文件,文件格式需为text、csv或binary。内容涵盖从编译安装扩展、配置postgresql.conf参数、重启数据库实例,到创建扩展、外部文件服务及外部表的完整流程,并通过具体示例展示如何查询外部表数据,同时附有视频讲解以帮助理解操作步骤。
128 22
【赵渝强老师】使用postgre_fdw访问外部PostgreSQL
本文介绍了如何使用postgres_fdw扩展让PostgreSQL访问外部远端数据库数据。通过编译安装扩展、修改配置文件、重启数据库、创建扩展及外部服务器对象等步骤,最终实现本地数据库通过外部表访问远程数据。附带视频讲解,详细演示操作流程,并提醒需调整远端PostgreSQL配置以支持远程登录。
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
171 12
【赵渝强老师】创建PostgreSQL的数据库
本文介绍了在PostgreSQL中通过SQL命令“create database”创建数据库的方法。首先查询系统目录pg_database以查看现有数据库集合,然后使用“create database”命令创建新数据库,并了解其在$PDATA/base目录下对应的文件夹生成。最后重新查询数据库集合确认创建结果,附带视频讲解便于理解操作步骤及注意事项。
111 1
【赵渝强老师】使用PostgreSQL客户端工具
PostgreSQL数据库服务器安装配置完成后,用户可以使用客户端工具连接并操作数据库。本文重点介绍两款常用的PostgreSQL客户端工具:命令行客户端psql和图形化客户端pgAdmin。 **psql**是PostgreSQL自带的命令行工具,支持交互式和非交互式模式。交互式模式下,用户可以直接输入SQL命令进行操作;非交互式模式则通过执行脚本文件来完成任务。 **pgAdmin**是一款功能全面的图形化管理工具,支持Linux、Windows和Mac OS X系统。 通过这两种工具,用户可以高效地管理和操作PostgreSQL数据库。
210 12
【赵渝强老师】使用PostgreSQL客户端工具

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问