【趙渝強老師】基于PostgreSQL的分布式數據庫:Citus

在這里插入圖片描述

由于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/目錄下。

《PostgreSQL數據庫實戰派》

(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)

《PostgreSQL數據庫實戰派》

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86805.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86805.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86805.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【趙渝強老師】OceanBase OBServer節點的接入層

OceanBase數據庫代理ODP(OceanBase Database Proxy,又稱OBProxy)是OceanBase數據庫的接入層,負責將用戶的請求轉發到合適的OceanBase數據庫實例上進行處理。ODP是獨立的進程實例,獨立于OceanBase數據庫實例部署。ODP監…

ISP Pipeline(8): Color Space Conversion 顏色空間轉換

Color Space Conversion(顏色空間轉換) 是圖像處理中的一個重要步驟,它將圖像從一個顏色空間(Color Space)轉換到另一個,以滿足 顯示、分析、壓縮或算法需求。 為什么轉換顏色空間? 應用場景…

Spring Web MVC ①

🚀 一、Spring MVC MVC三層 Controller:樂團指揮,接收請求→調用模型→選擇視圖(Controller) Model:樂手,處理業務邏輯與數據(POJO對象) View:舞臺展示&…

【數據挖掘】貝葉斯分類學習—NaiveBayes

NaiveBayes 樸素貝葉斯的核心是貝葉斯定理,它描述了如何根據新證據更新事件的概率。 要求: 1、實現樸素貝葉斯分類算法,驗證算法的正確性,并將算法應用于給定的數據集Data_User_Modeling數據集,選擇一部分數據集作為已…

Java面試寶典:基礎二

🔒 25. final vs abstract 關鍵字 關鍵字修飾對象作用規則final類禁止被繼承final class MyClass { ... }方法禁止被子類重寫public final void func()變量變為常量(基本類型值不可變,引用類型地址不可變)final int MAX 100;abs…

小米手機安裝charles證書

使用紅米手機下載Charles證書一直下載中,無法正常下載。 不使用原裝瀏覽器,使用第三方瀏覽器下載就可以了。 使用第三方瀏覽器安裝,如我使用的是UC瀏覽器 使用第三方瀏覽器安裝的證書格式是".pem"格式問卷 將這個文件放入小米的dow…

DeepSeek R2 推遲發布:因 H20 算力短缺

DeepSeek 今年早些時候憑借其 R1 AI 模型備受廣泛關注。據《The Information》報道,R2 模型的工作似乎因 H20 處理器而停滯不前。 DeepSeek尚未透露其R2 模型的具體上市時間。 DeepSeek 使用 5 萬塊 Hopper GPU(包括 3 萬塊 H20、1 萬塊 H800 和 1 萬塊…

智能之火,重塑創造:大模型如何點燃新一代開發引擎?

導言:普羅米修斯之火再現 在科技演進的長河中,每一次生產力的躍遷都伴隨著工具的質變。從蒸汽機轟鳴到電力普及,再到信息高速公路的鋪就,人類駕馭能量的能力不斷突破。今天,我們站在一個嶄新的臨界點上:大語…

一文入門JS

轉自個人博客 因為本人經常使用QML,而由于QML與JS之間的關系,本人經常使用到JS相關語法,所以在此系統性對JS基礎知識進行總結、記錄。 1. 入門 JavaScript(簡稱 JS)是一種廣泛應用于Web開發的腳本語言,它…

libtool: error: ‘/usr/.local/lib/libgmp.la‘ is not a valid libtool archive

背景: 安裝gcc時提示需要vc11,然后安裝gcc依賴gmp、mpfr、mpc。 到mpc make時出錯: libtool: error: ‘/usr/.local/lib/libgmp.la’ is not a valid libtool archive 詳細: /usr/bin/grep: /usr/.local/lib/libgmp.la: No such f…

HDC2025聚焦鴻蒙生態,FairGuard加固方案保駕護航

近日,在2025年華為開發者大會(HDC)上,華為正式啟動HarmonyOS 6開發者Beta,并全面展示一年多以來與合作伙伴共建鴻蒙生態的創新成果:“累計有9000多個應用參與了70多個系統級創新體驗的聯合打造,目前有3萬多鴻蒙應用和元…

GAN的思考及應用

一、對文獻的思考 CycleGAN的思考,前兩周看到了關于CycleGAN的原始論文,是用于處理圖像數據,有了如下思考: 1、基礎理論與方法 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》是Cycle…

Xcode26新特性與iOS26適配指南

Xcode 26 新特性 在 WWDC25 上 Apple 推出了 Xcode 26,相比較 Xcode 16,它有如下的變化。 項目 安裝包更小,其他組件與工具鏈只有在需要時才會下載。設置界面重新設計,菜單從頂部挪到了左側,其中 Accounts 改名為 Apple Accounts,Text Editing 改名為 Editing,Key Bind…

閑庭信步使用SV搭建圖像測試平臺:第二十課——RGB圖像轉HSV圖像

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程文件請關注…

Django的CSRF保護機制

一、Django的CSRF保護機制 1. 核心原理 作用&#xff1a;防止跨站請求偽造&#xff08;CSRF&#xff09;攻擊&#xff0c;確保表單提交來源可信。實現方式&#xff1a; 在模板中使用{% csrf_token %}生成一個隱藏的<input>字段&#xff08;如csrfmiddlewaretoken&#…

JavaScript中的回調函數詳解

JavaScript中的回調函數詳解 1.1 概念 1.1.1 什么是回調函數 **回調函數&#xff08;Callback Function&#xff09;**是你將一個函數的引用&#xff08;指針&#xff09;作為參數傳遞給另一個函數&#xff0c;在那個函數完成任務后調用回來執行你傳遞的函數。簡單的來說就是…

Utils系列之內存池(Fixed size)

內存池核心介紹 廢話不多說&#xff0c;show you code. 我實現了兩套內存池&#xff0c;一個是固定大小的內存池&#xff0c;一個是多重不同大小的內存池。 Fixed size memory pool 設計思路&#xff1a; 我們一個個看&#xff0c;首先我們定義了一個chunk, chunk 里面包含…

ubuntu安裝docker遇到權限問題

問題現象&#xff1a; 使用snap安裝的docker&#xff0c;執行docker build命令構建景象時報錯&#xff1a; [] Building 0.1s (1/1) FINISHED docker:default > [internal] load build definition from Dockerfile 0.0s > > transferring dockerfile: 2B 0.0s ERROR:…

在Linux系統中部署Java項目

1.在Linux中啟動mysql的服務: systemctl start mysql可以采用以下代碼查看狀態: systemctl status mysql如下圖展示綠色代表啟動成功 2.之后進入mysql mysql -uroot -p輸入自己的密碼&#xff0c;這里的密碼不會顯示,直接輸入即可 3.在DG中連接Linux的數據庫 4.修改配置文件…

C++洛谷P1002 過河卒

題目 鏈接&#xff1a;https://www.luogu.com.cn/problem/P1002 解析 這道題適用于了解動態規劃的同學。 變量初始化 初始化B點坐標&#xff08;n, m&#xff09;和馬的坐標&#xff08;a, b&#xff09; 初始化方向數組和動態規劃數組 long long dp[30][30]; int dx[8] …