動態

詳情 返回 返回

【趙渝強老師】基於PostgreSQL的分佈式數據庫:Citus - 動態 詳情

由於PostgreSQL具有強大的功能和良好的可擴展性,因此基於PostgreSQL很容易就可以實現分佈式架構。Citus便是具體的一種實現方式。它以擴展的插件形式與PostgreSQL進行集成,且獨立於PostgreSQL內核,部署也比較簡單。Citus是現在非常流行的基於PostgreSQL的分佈式解決方案。

一、 Citus基礎

下面是百度百科中對分佈式數據庫的定義:

分佈式數據庫系統通常使用較小的計算機系統,每台計算機可單獨放在一個地方,每台計算機中都可能有DBMS的一份完整拷貝副本,或者部分拷貝副本,並具有自己局部的數據庫,位於不同地點的許多計算機通過網絡互相連接,共同組成一個完整的、全局的邏輯上集中、物理上分佈的大型數據庫。
——摘自《百度百科》

視頻講解如下:
https://www.bilibili.com/video/BV1ueKEzeE9N/?aid=114741376717...

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分佈式數據庫集羣環境配置完成。

user avatar euphoria 頭像 shawn_5dd516205b8bd 頭像 xingxingshangdekele 頭像
點贊 3 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.