PostgreSQL?流復(fù)制配置環(huán)境搭建過程
前言
PostgreSQL 流復(fù)制(Streaming Replication)是 9.0 提供的一種新的 WAL 傳遞方法。使用流復(fù)制時,每當(dāng) Primary 節(jié)點 WAL 產(chǎn)生,就會馬上傳遞到 Standby 節(jié)點,流復(fù)制提供 異步
和 同步
兩種模式,同步模式可以保障數(shù)據(jù) 0 丟失。
1. 配置環(huán)境
1.1 環(huán)境介紹
主機名 | 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é)點配置 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é)點,搭建 異步/同步
流復(fù)制,步驟歸納:
- 準(zhǔn)備環(huán)境 PostgreSQL 主節(jié)點和備節(jié)點。
- 參數(shù)調(diào)整 pg_hba.conf、postgresql.conf,創(chuàng)建復(fù)制用戶。
- 備份主節(jié)點的數(shù)據(jù),恢復(fù)到備節(jié)點。
- 修改 primary_conninfo 啟動備庫。
- 檢查是否啟動成功。
2.1 備份恢復(fù)
在主庫執(zhí)行全量備份:
pg_basebackup -D /data/pgsql12/backup -v -P -X stream -Upostgres -h 127.0.0.1 -p5432 -R
將備份 SCP 到備庫節(jié)點:
scp -r ./backup/ root@172.16.104.56:/data/backup
關(guān)閉 Standby 節(jié)點,清空 Standby 節(jié)點的數(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
文件表示實例為 Standby 節(jié)點。在使用 pg_basebackup 備份添加 -R 參數(shù)(write configuration for replication)會在 postgresql.auto.conf
文件中寫入 primary_conninfo
參數(shù)信息,這里我們需要按照實際情況調(diào)整:
primary_conninfo = 'host=172.16.104.7 port=5432 user=repl password=repl123'
2.4 啟動并檢查
參數(shù)配置完成后,啟動 Standby 節(jié)點即可:
pg_ctl -D /data/pgsql12/data/ -l /data/pgsql12/logs/start.log start
在主節(jié)點,可通過下方 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 中的信息,或者啟動的時候就 tail -f
error_log,實時關(guān)注輸出的異常信息。
2.5 同步流復(fù)制
上面 2.1~2.4 是介紹如何搭建 異步
流復(fù)制。
PostgreSQL 異步流復(fù)制的缺點是當(dāng)主庫損壞的時候,激活備庫可能會丟失一部分?jǐn)?shù)據(jù),這于 MySQL 異步復(fù)制相同,主庫只管發(fā)送增量日志,掛掉后可能有部分日志從庫還沒有接收到,此時發(fā)生切換就會出現(xiàn)數(shù)據(jù)丟失,同步復(fù)制可以解決該類問題。不過需要注意的是,如果配置同步復(fù)制 Standby 節(jié)點掛掉,會導(dǎo)致 Priamry 節(jié)點卡住,所以一般會有多個 Standby 節(jié)點,至少保障 WAL 同步到一個 Standby 節(jié)點。
同步復(fù)制配置多加一個 synchronous_standby_names
參數(shù),有 3 種配置方法:
synchronous_standby_names = 's1,s2,s3'
在這個例子中,如果有 s1、s2、s3 三臺 Standby 節(jié)點在運行,意味著 s1 為同步節(jié)點,其他節(jié)點均為潛在同步節(jié)點,即 WAL 只需傳遞給 s1 節(jié)點就可以提交。
synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'
在這個例子中,如果有四個后備服務(wù)器 s1、s2、s3 和 s4 在運行,兩個后備服務(wù)器 s1 和 s2 將被選中為同步后備,因為它們出現(xiàn)在后備服務(wù)器名稱列表的前部。s3 是一個潛在的同步后備,當(dāng) s1 或 s2 中的任何一個失效, 它就會取而代之。s4 則是一個異步后備因為它的名字不在列表中。
synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
在這個例子中,如果有四臺后備服務(wù)器 s1、s2、s3 以及 s4 正在運行,事務(wù)提交將會等待來自至少其中任意兩臺后備服務(wù)器的回復(fù)。s4 是一臺異步后備,因為它的名字不在該列表中。
現(xiàn)在我們的架構(gòu)是一個 Primary 節(jié)點一個 Standby 節(jié)點,現(xiàn)在通過修改參數(shù)調(diào)整為 同步流復(fù)制
修改主庫參數(shù):
# 其中 walreceiver 為 Standby 節(jié)點的名字,由 primary_conninfo 中的 application_name 設(shè)置 synchronous_standby_names = 'walreceiver'
修改該參數(shù)不需要重啟數(shù)據(jù)庫,使用 reload 重新加載配置即可:
pg_ctl reload -D /data/pgsql12/data/
在 Primary 節(jié)點查詢流復(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)注一個參數(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é)點落后主庫多少字節(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)程啟動時使用的第一個 WAL 日志的位置。
- receive_start_tli:WAL 接收進(jìn)程啟動時使用的第一個時間線編號。
- received_lsn:已經(jīng)接收到并且已經(jīng)被寫入磁盤的最后一個 WAL 日志的位置。
- received_tli:已經(jīng)接收到并且已經(jīng)被寫入磁盤的最后一個 WAL 日志的時間線編號。
- last_msg_send_time:接收到最后一條 WAL 日志消息后,向主庫發(fā)回確認(rèn)消息的發(fā)送時間。
- last_msg_receipt_time:備庫接收到最后一條 WAL 日志消息的接收時間。
- slot_name:使用復(fù)制槽的名稱。
- conninfo:連接主庫的連接串,密碼等安全相關(guān)的信息會被隱去。
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數(shù)據(jù)庫根據(jù)年月查詢出本月的所有數(shù)據(jù)操作
這篇文章主要介紹了postgresql數(shù)據(jù)庫根據(jù)年月查詢出本月的所有數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12PostgreSQL 存儲過程的進(jìn)階講解(含游標(biāo)、錯誤處理、自定義函數(shù)、事務(wù))
PL/pgSQL 游標(biāo)允許我們封裝一個查詢,然后每次處理結(jié)果集中的一條記錄,這篇文章主要介紹了PostgreSQL 存儲過程的進(jìn)階介紹(含游標(biāo)、錯誤處理、自定義函數(shù)、事務(wù)),需要的朋友可以參考下2023-03-03淺談PostgreSQL 11 新特性之默認(rèn)分區(qū)
這篇文章主要介紹了淺談PostgreSQL 11 新特性之默認(rèn)分區(qū),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12PostgreSQL創(chuàng)建自增序列、查詢序列及使用序列代碼示例
數(shù)據(jù)庫中主鍵的生成一般是通過序列來生成,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL創(chuàng)建自增序列、查詢序列及使用序列的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11詳解PostgreSQL中實現(xiàn)數(shù)據(jù)透視表的三種方法
數(shù)據(jù)透視表(Pivot Table)是進(jìn)行數(shù)據(jù)匯總、分析、瀏覽和展示的強大工具,可以幫助我們了解數(shù)據(jù)中的對比情況、模式和趨勢,是數(shù)據(jù)分析師和運營人員必備技能之一,本給大家介紹PostgreSQL中實現(xiàn)數(shù)據(jù)透視表的三種方法,需要的朋友可以參考下2024-04-04