由于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的体系架构。
视频讲解如下 |
---|
【赵渝强老师】基于PostgreSQL的分布式数据库:Citus |
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分布式数据库集群环境配置完成。