PostgreSQL?流復(fù)制配置環(huán)境搭建過程
前言
PostgreSQL 流復(fù)制(Streaming Replication)是 9.0 提供的一種新的 WAL 傳遞方法。使用流復(fù)制時(shí),每當(dāng) Primary 節(jié)點(diǎn) WAL 產(chǎn)生,就會(huì)馬上傳遞到 Standby 節(jié)點(diǎn),流復(fù)制提供 異步 和 同步 兩種模式,同步模式可以保障數(shù)據(jù) 0 丟失。
1. 配置環(huán)境
1.1 環(huán)境介紹
| 主機(jī)名 | IP 地址 | 角色 | 數(shù)據(jù)目錄 |
|---|---|---|---|
| 172-16-104-7 | 172.16.104.7 | Master | /data/pgsql12/data/ |
| 172-16-104-56 | 172.16.104.56 | Standby | /data/pgsql12/data/ |
PostgreSQL 版本:PostgreSQL 12.2操作系統(tǒng):CentOS Linux release 7.8.2003 (Core)
1.2 主庫白名單
Master 節(jié)點(diǎn)配置 pg_hba.conf 表示接受流復(fù)制的用戶連接:
host replication all 0/0 md5
上面這條 SQL 語句的含義是允許任意用戶從任何網(wǎng)絡(luò)(0/0)網(wǎng)絡(luò)上發(fā)起到本數(shù)據(jù)庫的流復(fù)制連接,使用MD5的密碼認(rèn)證。
1.3 主庫參數(shù)配置
# 監(jiān)聽 listen_addresses = '*' # 流復(fù)制客戶端的最大并發(fā)數(shù),設(shè)置為 0 表示禁用復(fù)制 max_wal_senders = 10 # WAL 日志級別 wal_level = replica
上面的參數(shù)需要重啟 PostgreSQL 服務(wù)后生效。
2. 流復(fù)制搭建
使用 pg_basebackup 將主庫數(shù)據(jù)備份恢復(fù)到 Standby 節(jié)點(diǎn),搭建 異步/同步 流復(fù)制,步驟歸納:
- 準(zhǔn)備環(huán)境 PostgreSQL 主節(jié)點(diǎn)和備節(jié)點(diǎn)。
- 參數(shù)調(diào)整 pg_hba.conf、postgresql.conf,創(chuàng)建復(fù)制用戶。
- 備份主節(jié)點(diǎn)的數(shù)據(jù),恢復(fù)到備節(jié)點(diǎn)。
- 修改 primary_conninfo 啟動(dòng)備庫。
- 檢查是否啟動(dòng)成功。
2.1 備份恢復(fù)
在主庫執(zhí)行全量備份:
pg_basebackup -D /data/pgsql12/backup -v -P -X stream -Upostgres -h 127.0.0.1 -p5432 -R
將備份 SCP 到備庫節(jié)點(diǎn):
scp -r ./backup/ root@172.16.104.56:/data/backup
關(guān)閉 Standby 節(jié)點(diǎn),清空 Standby 節(jié)點(diǎn)的數(shù)據(jù)文件,或者使用 mv 修改目錄名:
# 備份數(shù)據(jù)目錄,或者可以直接清空 mv /data/pgsql12/data /data/pgsql12/data_bak # 將備份文件轉(zhuǎn)移到數(shù)據(jù)目錄 mv /data/pgsql12/backup /data/pgsql12/data # 修改文件屬組 chown -R postgres:postgres /data/pgsql12
2.2 創(chuàng)建復(fù)制用戶
主庫創(chuàng)建專用于流復(fù)制的用戶:
CREATE ROLE repl REPLICATION LOGIN PASSWORD 'repl123';
2.3 參數(shù)修改
PostgreSQL 使用 standby.signal 文件表示實(shí)例為 Standby 節(jié)點(diǎn)。在使用 pg_basebackup 備份添加 -R 參數(shù)(write configuration for replication)會(huì)在 postgresql.auto.conf 文件中寫入 primary_conninfo 參數(shù)信息,這里我們需要按照實(shí)際情況調(diào)整:
primary_conninfo = 'host=172.16.104.7 port=5432 user=repl password=repl123'
2.4 啟動(dòng)并檢查
參數(shù)配置完成后,啟動(dòng) Standby 節(jié)點(diǎn)即可:
pg_ctl -D /data/pgsql12/data/ -l /data/pgsql12/logs/start.log start
在主節(jié)點(diǎn),可通過下方 SQL 查詢流復(fù)制的監(jiān)控信息:
postgres=# \x Expanded display is on. postgres=# select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 27408 usesysid | 24865 usename | repl application_name | walreceiver client_addr | 172.16.104.56 client_hostname | client_port | 40990 backend_start | 2023-09-05 14:11:56.978627+08 backend_xmin | state | streaming sent_lsn | 6/4001BB0 write_lsn | 6/4001BB0 flush_lsn | 6/4001BB0 replay_lsn | 6/4001BB0 write_lag | flush_lag | replay_lag | sync_priority | 0 sync_state | async reply_time | 2023-09-05 15:03:58.408518+08
其中 state = streaming 表示流復(fù)制狀態(tài)正常,如果有異常,可以查看 error log 中的信息,或者啟動(dòng)的時(shí)候就 tail -f error_log,實(shí)時(shí)關(guān)注輸出的異常信息。
2.5 同步流復(fù)制
上面 2.1~2.4 是介紹如何搭建 異步 流復(fù)制。
PostgreSQL 異步流復(fù)制的缺點(diǎn)是當(dāng)主庫損壞的時(shí)候,激活備庫可能會(huì)丟失一部分?jǐn)?shù)據(jù),這于 MySQL 異步復(fù)制相同,主庫只管發(fā)送增量日志,掛掉后可能有部分日志從庫還沒有接收到,此時(shí)發(fā)生切換就會(huì)出現(xiàn)數(shù)據(jù)丟失,同步復(fù)制可以解決該類問題。不過需要注意的是,如果配置同步復(fù)制 Standby 節(jié)點(diǎn)掛掉,會(huì)導(dǎo)致 Priamry 節(jié)點(diǎn)卡住,所以一般會(huì)有多個(gè) Standby 節(jié)點(diǎn),至少保障 WAL 同步到一個(gè) Standby 節(jié)點(diǎn)。
同步復(fù)制配置多加一個(gè) synchronous_standby_names 參數(shù),有 3 種配置方法:
synchronous_standby_names = 's1,s2,s3'
在這個(gè)例子中,如果有 s1、s2、s3 三臺 Standby 節(jié)點(diǎn)在運(yùn)行,意味著 s1 為同步節(jié)點(diǎn),其他節(jié)點(diǎn)均為潛在同步節(jié)點(diǎn),即 WAL 只需傳遞給 s1 節(jié)點(diǎn)就可以提交。
synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'
在這個(gè)例子中,如果有四個(gè)后備服務(wù)器 s1、s2、s3 和 s4 在運(yùn)行,兩個(gè)后備服務(wù)器 s1 和 s2 將被選中為同步后備,因?yàn)樗鼈兂霈F(xiàn)在后備服務(wù)器名稱列表的前部。s3 是一個(gè)潛在的同步后備,當(dāng) s1 或 s2 中的任何一個(gè)失效, 它就會(huì)取而代之。s4 則是一個(gè)異步后備因?yàn)樗拿植辉诹斜碇小?/p>
synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
在這個(gè)例子中,如果有四臺后備服務(wù)器 s1、s2、s3 以及 s4 正在運(yùn)行,事務(wù)提交將會(huì)等待來自至少其中任意兩臺后備服務(wù)器的回復(fù)。s4 是一臺異步后備,因?yàn)樗拿植辉谠摿斜碇小?/p>
現(xiàn)在我們的架構(gòu)是一個(gè) Primary 節(jié)點(diǎn)一個(gè) Standby 節(jié)點(diǎn),現(xiàn)在通過修改參數(shù)調(diào)整為 同步流復(fù)制 修改主庫參數(shù):
# 其中 walreceiver 為 Standby 節(jié)點(diǎn)的名字,由 primary_conninfo 中的 application_name 設(shè)置 synchronous_standby_names = 'walreceiver'
修改該參數(shù)不需要重啟數(shù)據(jù)庫,使用 reload 重新加載配置即可:
pg_ctl reload -D /data/pgsql12/data/
在 Primary 節(jié)點(diǎn)查詢流復(fù)制的狀態(tài)信息:
postgres=# select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 13561 usesysid | 24865 usename | repl application_name | walreceiver client_addr | 172.16.104.56 client_hostname | client_port | 42126 backend_start | 2023-09-06 17:18:48.297466+08 backend_xmin | state | streaming sent_lsn | 6/50007D0 write_lsn | 6/50007D0 flush_lsn | 6/50007D0 replay_lsn | 6/50007D0 write_lag | flush_lag | replay_lag | sync_priority | 1 sync_state | sync reply_time | 2023-09-06 17:45:00.706196+08
其中 sync_state 由 async 變?yōu)?sync 表示為同步模式。
2.6 同步復(fù)制級別
影響同步復(fù)制還需要關(guān)注一個(gè)參數(shù) synchronous_commit 用來設(shè)置事務(wù)的同步級別:
postgres=# select * from pg_settings where name = 'synchronous_commit';
-[ RECORD 1 ]---+------------------------------------------------------
name | synchronous_commit
setting | on
unit |
category | Write-Ahead Log / Settings
short_desc | Sets the current transaction's synchronization level.
extra_desc |
context | user
vartype | enum
source | default
min_val |
max_val |
enumvals | {local,remote_write,remote_apply,on,off}
boot_val | on
reset_val | on
sourcefile |
sourceline |
pending_restart | f- local:WAL 日志被本地持久化后(不用管遠(yuǎn)程)事務(wù) commit 就可以返回。
- remote_write:WAL 日志被傳到備庫的內(nèi)存中(不必等其被持久化)事務(wù) commit 才返回。
- remote_apply:WAL 日志被傳到備庫并被 apply,事務(wù) commit 才返回。
- on:WAL 日志被傳到備庫并被持久化(不必等其被 apply)事務(wù) commit 才返回。
- off:不必等 WAL 日志被本地持久化,也不管是否傳到遠(yuǎn)程,事務(wù) commit 都可以立即返回。
對于同步復(fù)制,可選的值有 remote_write、remote_apply、on。
3. 流復(fù)制監(jiān)控
3.1 角色判斷
select pg_is_in_recovery();
判斷數(shù)據(jù)庫是否為主庫 f 表示是主庫, t 表示屬于備庫角色。
3.2 主庫查看流復(fù)制
查看流復(fù)制信息,可以在主庫查看 pg_stat_replication 視圖,可以查看流復(fù)制的狀態(tài)信息:
- sent_lsn:發(fā)送 WAL 的位置。
- write_lsn:備庫已接收到這部分日志,但還沒有刷到磁盤中。
- flush_lsn:備庫已把 WAL 寫入到磁盤中。
- replay_lsn:備庫應(yīng)用 WAL 的位置。
- sync_state:同步模式。
- state:流復(fù)制狀態(tài)。
select * from pg_stat_replication;
輸出結(jié)果:
postgres=# \x
Expanded display is on.postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 13561
usesysid | 24865
usename | repl
application_name | walreceiver
client_addr | 172.16.104.56
client_hostname |
client_port | 42126
backend_start | 2023-09-06 17:18:48.297466+08
backend_xmin |
state | streaming
sent_lsn | 6/50007D0
write_lsn | 6/50007D0
flush_lsn | 6/50007D0
replay_lsn | 6/50007D0
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2023-09-07 10:06:18.000504+08
3.3 延遲監(jiān)控
使用下方 SQL 可以查看 Standby 節(jié)點(diǎn)落后主庫多少字節(jié) WAL 日志:
select pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) from pg_stat_replication;
3.4 備庫查詢復(fù)制信息
在備庫也可以通過查詢 pg_stat_wal_receiver 視圖,獲得流復(fù)制的監(jiān)控信息:
- pid:WAL 接收進(jìn)程 ID。
- status:流復(fù)制狀態(tài),只有 streaming 為正常狀態(tài)。
- receive_start_lsn:WAL 接收進(jìn)程啟動(dòng)時(shí)使用的第一個(gè) WAL 日志的位置。
- receive_start_tli:WAL 接收進(jìn)程啟動(dòng)時(shí)使用的第一個(gè)時(shí)間線編號。
- received_lsn:已經(jīng)接收到并且已經(jīng)被寫入磁盤的最后一個(gè) WAL 日志的位置。
- received_tli:已經(jīng)接收到并且已經(jīng)被寫入磁盤的最后一個(gè) WAL 日志的時(shí)間線編號。
- last_msg_send_time:接收到最后一條 WAL 日志消息后,向主庫發(fā)回確認(rèn)消息的發(fā)送時(shí)間。
- last_msg_receipt_time:備庫接收到最后一條 WAL 日志消息的接收時(shí)間。
- slot_name:使用復(fù)制槽的名稱。
- conninfo:連接主庫的連接串,密碼等安全相關(guān)的信息會(huì)被隱去。
select * from pg_stat_wal_receiver;
postgres=# \x Expanded display is on. postgres=# postgres=# select * from pg_stat_wal_receiver; -[ RECORD 1 ]---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ pid | 113395 status | streaming receive_start_lsn | 6/5000000 receive_start_tli | 3 received_lsn | 6/50007D0 received_tli | 3 last_msg_send_time | 2023-09-07 10:20:00.207856+08 last_msg_receipt_time | 2023-09-07 10:20:00.20971+08 latest_end_lsn | 6/50007D0 latest_end_time | 2023-09-06 17:19:46.661221+08 slot_name | sender_host | 172.16.104.7 sender_port | 5432 conninfo | user=repl password=******** dbname=replication host=172.16.104.7 port=5432 fallback_application_name=walreceiver sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any
到此這篇關(guān)于PostgreSQL 流復(fù)制搭建的文章就介紹到這了,更多相關(guān)PostgreSQL 流復(fù)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql 存儲(chǔ)函數(shù)調(diào)用變量的3種方法小結(jié)
這篇文章主要介紹了postgresql 存儲(chǔ)函數(shù)調(diào)用變量的3種方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL主從復(fù)制的監(jiān)控與故障切換指南
PostgreSQL作為一款功能強(qiáng)大、開源且高度可擴(kuò)展的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),憑借其穩(wěn)定性、性能和豐富的特性,被廣泛應(yīng)用于金融、電商、物聯(lián)網(wǎng)等關(guān)鍵業(yè)務(wù)場景,本文將深入探討PostgreSQL主從復(fù)制的監(jiān)控機(jī)制與自動(dòng)化故障切換策略,需要的朋友可以參考下2026-03-03
解決PostgreSQL數(shù)據(jù)遷移過程中的數(shù)據(jù)類型不匹配問題
在數(shù)據(jù)遷移的過程中,經(jīng)常會(huì)遇到源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫之間的數(shù)據(jù)類型不匹配的情況,對于 PostgreSQL 數(shù)據(jù)庫來說,處理這種數(shù)據(jù)類型不匹配問題需要一些特定的策略和技巧,需要的朋友可以參考下2024-07-07
PostGIS中ST_Union與ST_Collect的區(qū)別與使用詳解
這篇文章主要介紹了PostGIS中ST_Union與ST_Collect的區(qū)別與使用,對于初入PostGIS世界的新手來說,眾多的地理空間函數(shù)可能會(huì)讓人感到眼花繚亂,不知從何下手,而ST_Union與ST_Collect這兩個(gè)函數(shù),由于它們在功能上存在一定的相似性,常常容易被混淆,需要的朋友可以參考下2026-01-01
PostgreSQL中使用dblink實(shí)現(xiàn)跨庫查詢的方法
這篇文章主要介紹了PostgreSQL中使用dblink實(shí)現(xiàn)跨庫查詢的方法,需要的朋友可以參考下2017-05-05
PostgreSQL數(shù)據(jù)庫部署linux服務(wù)器完整教程
本文主要述了在Linux服務(wù)器上部署PostgreSQL數(shù)據(jù)庫的過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2026-05-05
PostgreSQL實(shí)現(xiàn)透視表查詢的方法詳解
PostgreSQL 8.3版本發(fā)布時(shí),引入了一個(gè)名為tablefunc的新擴(kuò)展,這個(gè)擴(kuò)展提供了一組非常有趣的函數(shù),其中之一是交叉表函數(shù),用于創(chuàng)建數(shù)據(jù)透視表,這就是我們將在本文中討論的內(nèi)容,本文給大家介紹了PostgreSQL實(shí)現(xiàn)透視表查詢的方法,需要的朋友可以參考下2024-12-12

