由于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 mastmydemodb=# 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 | 5433127.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分布式數據庫集群環境配置完成。