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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
2月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
346 93
|
1月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
176 0
|
3月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
321 2
|
1月前
|
存储 NoSQL 前端开发
【赵渝强老师】MongoDB的分布式存储架构
MongoDB分片通过将数据分布到多台服务器,实现海量数据的高效存储与读写。其架构包含路由、配置服务器和分片服务器,支持水平扩展,结合复制集保障高可用性,适用于大规模生产环境。
266 1
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
安全 Oracle 关系型数据库
【赵渝强老师】基于PostgreSQL的MPP集群:Greenplum
Greenplum是基于PostgreSQL的MPP架构分布式数据库,由Master、Segment和Interconnect组成,支持海量数据并行处理。本文介绍其架构及集群安装配置全过程。
197 1
|
2月前
|
数据库
【赵渝强老师】达梦数据库实例的状态
达梦数据库实例包含NORMAL、PRIMARY和STANDBY三种模式,以及MOUNT、OPEN和SUSPEND三种状态。模式之间可在MOUNT状态下相互转换,不同状态与模式适用于数据库的启动、配置及运行需求。
184 1
|
3月前
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL数据库的多实例环境
MySQL多实例是指在一台服务器上运行多个MySQL服务,通过不同端口提供独立的数据服务。各实例共享安装程序,但使用各自的配置文件和数据文件,实现资源高效利用。本文详细介绍了如何通过“mysqld_multi”工具配置和启动多个MySQL实例,并演示了目录创建、初始化、配置文件修改及实例启动等操作步骤。
157 1

热门文章

最新文章

推荐镜像

更多