PostgreSQL流復(fù)制(主從復(fù)制)詳細(xì)教程
一、流復(fù)制簡介
在數(shù)據(jù)庫業(yè)務(wù)中,為了防止單點故障的發(fā)生、提高數(shù)據(jù)庫服務(wù)器的服務(wù)性能,一般都會采用「主從復(fù)制」集群來保障數(shù)據(jù)庫中數(shù)據(jù)的高可用。
而在 PostgreSQL 中,主從復(fù)制有其特定的技術(shù)名稱 ——流復(fù)制(Streaming Replication)。主從復(fù)制是所有數(shù)據(jù)庫主從架構(gòu)的統(tǒng)稱,而流復(fù)制是 PostgreSQL 實現(xiàn)主從復(fù)制的核心技術(shù),也是最常用的方式,特點是從庫實時(流式)接收主庫的 WAL 日志并應(yīng)用,延遲較低。PostgreSQL 中更推薦用 “主庫(Primary)” 和 “從庫(Standby)” 替代 “Master/Slave” 的說法。
此外,PostgreSQL 的流復(fù)制還可細(xì)分:
- 異步流復(fù)制(默認(rèn)):主庫寫入數(shù)據(jù)后無需等待從庫確認(rèn),性能高,可能有少量延遲。
- 同步流復(fù)制:主庫寫入數(shù)據(jù)后,必須等待從庫確認(rèn)已接收 WAL 日志才返回成功,安全性高但性能略低。
二、流復(fù)制原理與步驟
PostgreSQL 流復(fù)制的核心依賴于其WAL(Write-Ahead Logging,預(yù)寫日志)機制,這是PostgreSQL 保證數(shù)據(jù)一致性的基礎(chǔ),也是復(fù)制的 “數(shù)據(jù)源”。
1. WAL 日志的作用
- 主庫執(zhí)行任何數(shù)據(jù)修改操作(增刪改)時,會先將操作記錄寫入 WAL 日志(類似 “操作日志”,相當(dāng)于MySQL中的binlog),再更新實際數(shù)據(jù)文件。
- 即使主庫突然崩潰,重啟后可通過 WAL 日志恢復(fù)未完成的操作,保證數(shù)據(jù)一致性。
- 對復(fù)制而言:WAL 日志是主從數(shù)據(jù)同步的 “橋梁”—— 從庫通過獲取并應(yīng)用主庫的 WAL 日志,即可復(fù)現(xiàn)主庫的所有操作,保持?jǐn)?shù)據(jù)一致。
2. 流復(fù)制的核心進程
主庫(Primary)
wal_sender進程:當(dāng)從庫連接主庫時,主庫會啟動wal_sender進程,負(fù)責(zé)將 WAL 日志實時發(fā)送給從庫。
從庫(Standby)
wal_receiver 進程:從庫啟動后,會啟動 wal_receiver 進程,主動連接主庫wal_sender,接收 WAL 日志并寫入從庫的 WAL 文件。
startup 進程:負(fù)責(zé)讀取本地接收的 WAL 日志,并將日志中的操作應(yīng)用到從庫的數(shù)據(jù)文件中,最終實現(xiàn)數(shù)據(jù)同步。
3.流復(fù)制的同步步驟
1.主庫每執(zhí)行一次數(shù)據(jù)修改(如插入、更新),都會生成新的 WAL 記錄并寫入本地 WAL 文件。
2.從庫啟動后,wal_receiver 進程根據(jù) postgresql.conf 中 primary_conninfo 的配置(主庫 IP、復(fù)制用戶、密碼),主動連接主庫的 5432 端口。
3.主庫驗證從庫的連接(通過 pg_hba.conf 配置的權(quán)限)后,啟動 wal_sender 進程,開始向從庫實時流式傳輸新生成的 WAL 日志(從備份結(jié)束的位置開始,避免重復(fù)傳輸)。
4.從庫的 wal_receiver 接收 WAL 日志后,寫入本地的 WAL 文件。從庫的 startup 進程讀取本地 WAL 文件,將日志中的操作逐條應(yīng)用到從庫的數(shù)據(jù)文件中,最終實現(xiàn)與主庫的數(shù)據(jù)一致。
三、流復(fù)制的實現(xiàn)
- 操作系統(tǒng):CentOS7
- PostgreSQL版本:psql (PostgreSQL) 13.22
- 主庫IP:11.0.0.136
- 從庫IP:11.0.0.137
1、準(zhǔn)備工作
# 1.關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
# 或者開放5432端口
firewall-cmd --add-port=5432/tcp --permanent
firewall-cmd --reload
# 2.關(guān)閉SELINUX
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 3.同步時間
ntpdate ntp.ntsc.ac.cn
# 4.確保你的YUM源可用2、安裝PostgreSQL(主從庫都安裝)
進入官網(wǎng):https://www.postgresql.org/download/

選擇相應(yīng)操作系統(tǒng)和版本

# 1、安裝 PostgreSQL 官方的 YUM 源配置包 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 2、安裝 PostgreSQL 的服務(wù)器端程序 yum install -y postgresql13-server # 3、初始化 PostgreSQL 的數(shù)據(jù)庫集群 /usr/pgsql-13/bin/postgresql-13-setup initdb # 4、啟動 PostgreSQL 并設(shè)置開機自啟 systemctl enable postgresql-13 systemctl start postgresql-13 # 5、驗證安裝 psql --version
3、主庫配置
1、修改主庫核心配置
vim /var/lib/pgsql/13/data/postgresql.conf # 添加以下內(nèi)容 ----------------------------------------------------------------------------------------- # 允許所有IP連接(生產(chǎn)環(huán)境可指定從庫IP) listen_addresses = '*' # WAL日志級別(至少為replica才能支持流復(fù)制) wal_level = replica # 允許的最大復(fù)制連接數(shù)(至少1,建議3-5) max_wal_senders = 3 # 保留的WAL日志大小(防止從庫同步時WAL被刪除,建議1GB) wal_keep_size = 1GB # 開啟歸檔模式(流復(fù)制依賴歸檔) archive_mode = on # 歸檔命令(暫時用/bin/true表示不實際歸檔,僅開啟模式) archive_command = '/bin/true' -----------------------------------------------------------------------------------------
2、配置主庫訪問控制
vim /var/lib/pgsql/13/data/pg_hba.conf # 添加以下內(nèi)容 ----------------------------------------------------------------------------------------- # 允許從庫(11.0.0.137)通過 replica 用戶進行復(fù)制(md5 密碼驗證) # host 數(shù)據(jù)庫 / 功能 用戶名 從庫IP 認(rèn)證方式 host replication replica 11.0.0.137/32 md5 -----------------------------------------------------------------------------------------
3、創(chuàng)建復(fù)制專用用戶(replica)
# 1、切換到postgres用戶 su - postgres # 2、進入數(shù)據(jù)庫 psql
# 3、創(chuàng)建復(fù)制專用用戶,設(shè)置密碼 CREATE ROLE replica REPLICATION LOGIN ENCRYPTED PASSWORD 'peidongqing@123'; # 4、 退出psql \q # 5、退出postgres用戶 exit
# 6、重啟主庫 systemctl restart postgresql-13
4、從庫配置
1、停止從庫服務(wù)并清空默認(rèn)數(shù)據(jù)
從庫需使用主庫的備份數(shù)據(jù)初始化,因此先刪除默認(rèn)數(shù)據(jù)
# 停止從庫PostgreSQL服務(wù) systemctl stop postgresql-13 # 清空從庫數(shù)據(jù)目錄(默認(rèn)路徑) rm -rf /var/lib/pgsql/13/data/*
2、從主庫同步基礎(chǔ)數(shù)據(jù)
# 切換到postgres用戶(確保權(quán)限正確) su - postgres # 執(zhí)行基礎(chǔ)備份(從主庫11.0.0.136同步數(shù)據(jù)到從庫) pg_basebackup -h 11.0.0.136 -U replica -D /var/lib/pgsql/13/data/ -Fp -Xs -P
執(zhí)行后會提示輸入密碼,輸入設(shè)置的replica用戶密碼peidongqing@123,等待備份完成
-h 11.0.0.136:主庫 IP-U replica:復(fù)制用戶-D:從庫數(shù)據(jù)目錄(需與主庫一致)-Fp:輸出格式為原始文件(非壓縮)-Xs:備份時自動復(fù)制 WAL 日志(確保數(shù)據(jù)一致性)-P:顯示進度
3、配置從庫連接主庫
# 切換到root用戶,編輯從庫配置文件 vim /var/lib/pgsql/13/data/postgresql.conf ----------------------------------------------------------------------------------------- # 從庫連接主庫的信息 primary_conninfo = 'host=11.0.0.136 port=5432 user=replica password=peidongqing@123' # 允許從庫只讀查詢 hot_standby = on -----------------------------------------------------------------------------------------
4、創(chuàng)建standby.signal文件,啟用從庫模式
# 切換到postgres用戶,創(chuàng)建信號文件 su - postgres touch /var/lib/pgsql/13/data/standby.signal # 退出postgres用戶 exit # 啟動從庫服務(wù) systemctl start postgresql-13 systemctl enable postgresql-13
5、驗證主從復(fù)制
主從驗證均是通過postgres用戶登錄數(shù)據(jù)庫驗證
# 切換 postgres 用戶 su - postgres # 進入數(shù)據(jù)庫 psql
1、連接狀態(tài)驗證
主庫
SELECT client_addr, state FROM pg_stat_replication; # 成功輸出 client_addr | state -------------+----------- 11.0.0.137 | streaming (1 行記錄)
從庫
SELECT status FROM pg_stat_wal_receiver; # 成功輸出 status ----------- streaming (1 行記錄)
2、數(shù)據(jù)同步驗證
主庫
# 創(chuàng)建數(shù)據(jù)表 CREATE TABLE test_replica (id int); # 插入數(shù)據(jù) INSERT INTO test_replica VALUES (11111);
從庫
SELECT * FROM test_replica;
# 成功輸出
id
---------
111111
(1 行記錄)總結(jié)
通過以上步驟,PostgreSQL 13 一主一從流復(fù)制架構(gòu)已搭建完成:
- 主庫(11.0.0.136)負(fù)責(zé)寫入數(shù)據(jù),并通過 WAL 日志同步到從庫。
- 從庫(11.0.0.137)實時接收主庫日志,保持?jǐn)?shù)據(jù)一致,支持只讀查詢。
- 若主庫故障,可手動將從庫提升為主庫。
到此這篇關(guān)于PostgreSQL流復(fù)制(主從復(fù)制)詳細(xì)教程的文章就介紹到這了,更多相關(guān)PostgreSQL流復(fù)制(主從復(fù)制)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- PostgreSQL主從搭建的實現(xiàn)步驟
- postgresql數(shù)據(jù)庫主從恢復(fù)的實現(xiàn)
- 在docker上部署postgreSQL主從的超詳細(xì)步驟
- 利用Docker部署PostgreSQL 12.4主從方式
- postgresql13主從搭建Ubuntu
- CentOS PostgreSQL 12 主從復(fù)制(主從切換)操作
- postgresql數(shù)據(jù)庫安裝部署搭建主從節(jié)點的詳細(xì)過程(業(yè)務(wù)庫)
- Postgresql 檢查數(shù)據(jù)庫主從復(fù)制進度的操作
- Postgresql主從異步流復(fù)制方案的深入探究
- PostgreSQL 主從集群搭建
相關(guān)文章
PostgreSql中ALL與ANY區(qū)別小結(jié)
ALL和ANY是PostgreSQL中用于與子查詢結(jié)果進行比較的強大操作符,本文主要介紹了PostgreSql中ALL與ANY區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11
PostgreSQL 重復(fù)數(shù)據(jù)處理的操作方法
這篇文章主要介紹了PostgreSQL 重復(fù)數(shù)據(jù)處理的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Mybatis調(diào)用PostgreSQL存儲過程實現(xiàn)數(shù)組入?yún)鬟f
這篇文章主要介紹了mybatis調(diào)用postgresql自定義函數(shù)傳遞數(shù)組參數(shù)的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
Postgresql在mybatis中報錯:操作符不存在:character varying == unknown的問題
這篇文章主要介紹了Postgresql在mybatis中報錯: 操作符不存在 character varying == unknown的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Postgresql psql文件執(zhí)行與批處理多個sql文件操作
這篇文章主要介紹了Postgresql psql文件執(zhí)行與批處理多個sql文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
使用PostgreSQL創(chuàng)建高級搜索引擎的代碼示例
本文我們將探索PostgreSQL中的全文搜索功能,并研究我們能夠復(fù)制多少典型搜索引擎功能,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-07-07
PostgreSQL中實現(xiàn)數(shù)據(jù)實時監(jiān)控和預(yù)警的步驟詳解
在 PostgreSQL 中實現(xiàn)數(shù)據(jù)的實時監(jiān)控和預(yù)警是確保數(shù)據(jù)庫性能和數(shù)據(jù)完整性的關(guān)鍵任務(wù),以下將詳細(xì)討論如何實現(xiàn)此目標(biāo),并提供相應(yīng)的解決方案和具體示例,需要的朋友可以參考下2024-07-07
postgres 實現(xiàn)查詢某條數(shù)據(jù)的排名
這篇文章主要介紹了postgres 實現(xiàn)查詢某條數(shù)據(jù)的排名,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
postgresql 實現(xiàn)字符串分割字段轉(zhuǎn)列表查詢
這篇文章主要介紹了postgresql 實現(xiàn)字符串分割字段轉(zhuǎn)列表查詢,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

