主從復制
1. 基于文件的日志傳送
創建一個高可用性(HA)集群配置可采用連續歸檔,集群中主服務器工作在連續歸檔模式下,備服務器工作在連續恢復模式下(1臺或多臺可隨時接管主服務器),備持續從主服務器讀取WAL文件。
連續歸檔不需要對數據庫表做任何改動,可有效降低管理開銷,對主服務器的性能影響也相對較低。
直接從一個數據庫服務器移動WAL記錄到另一臺服務器被稱為日志傳送,PostgreSQL通過一次一文件(WAL段)的WAL記錄傳輸實現了基于文件的日志傳送。
日志傳送所需的帶寬取根據主服務器的事務率而變化;
日志傳送是異步的,即WAL記錄是在事務提交后才被傳送,那么在一個窗口期內如果主服務器發生災難性的失效則會導致數據丟失,還沒有被傳送的事務將會被丟失;
數據丟失窗口可以通過使用參數archive_timeout進行限制,可以低至數秒,但同時會增加文件傳送所需的帶寬。
2. 流復制
PostgreSQL在9.x之后引入了主從的流復制機制,所謂流復制,就是備服務器通過tcp流從主服務器中同步相應的數據,主服務器在WAL記錄產生時即將它們以流式傳送給備服務器,而不必等到WAL文件被填充。
默認情況下流復制是異步的,這種情況下主服務器上提交一個事務與該變化在備服務器上變得可見之間客觀上存在短暫的延遲,但這種延遲相比基于文件的日志傳送方式依然要小得多,在備服務器的能力滿足負載的前提下延遲通常低于一秒;
在流復制中,備服務器比使用基于文件的日志傳送具有更小的數據丟失窗口,不需要采用archive_timeout來縮減數據丟失窗口;
將一個備服務器從基于文件日志傳送轉變成基于流復制的步驟是:把recovery.conf文件中的primary_conninfo設置指向主服務器;設置主服務器配置文件的listen_addresses參數與認證文件即可。
操作系統: CentOS 7
數據庫: PostgreSQL 12
一、主庫配置
1、創建具有流復制權限的用戶
CREATE ROLE replica login replication encrypted password 'replica的密碼';
2、編輯pg_hba.conf
# 新增或修改下列屬性設置
# 監聽所有IP
listen_addresses = '*'
# 開啟歸檔
archive_mode = on
#歸檔命令
archive_command = 'test ! -f /var/lib/pgsql/12/data/pg_archive/%f cp %p /var/lib/pgsql/12/data//pg_archive/%f'
# 9.6開始沒有hot_standby(熱備模式)
wal_level = replica
#最多有2個流復制連接
max_wal_senders = 2
wal_keep_segments = 16
#流復制超時時間
wal_sender_timeout = 60s
# 最大連接數,據說從機需要大于或等于該值
max_connections = 100
3、重啟postgres
pg_ctl -D /var/lib/pgsql/12/data -l logfile restart
二、從庫配置
1、驗證在從庫是否可以訪問主節點
psql -h 10.20.2.195 -U postgres
2、停止從庫postgres服務
pg_ctl -D /var/lib/pgsql/12/data -l logfile stop
3、清空從庫數據存儲文件夾
rm -rf /var/lib/pgsql/12/data/*
4、從主服務器上copy數據到從服務器,這一步叫做“基礎備份”
pg_basebackup -h 主節點IP -p 5432 -U replica -Fp -Xs -Pv -R -D /var/lib/pgsql/12/data
5、此時data目錄下會出現standby.signal文件,編輯此文件
## 加入
standby_mode = 'on'
6、修改postgresql.conf文件
#從機信息和連接用戶
primary_conninfo = 'host=主節點IP port=5432 user=replica password=replica用戶的密碼'
#說明恢復到最新狀態
recovery_target_timeline = latest
#大于主節點,正式環境應當重新考慮此值的大小
max_connections = 120
#說明這臺機器不僅用于數據歸檔,還可以用于數據查詢
hot_standby = on
#流備份的最大延遲時間
max_standby_streaming_delay = 30s
#向主機匯報本機狀態的間隔時間
wal_receiver_status_interval = 10s
#r出現錯誤復制,向主機反饋
hot_standby_feedback = on
7、重啟從庫
pg_ctl -D /var/lib/pgsql/12/data -l logfile start
三、驗證主從搭建是否成功
1、連接主庫執行
select client_addr,sync_state from pg_stat_replication;

說明從服務器正在接收流,而且是異步流復制。主從配置成功
四、主從切換
主數據庫是讀寫的,備數據庫是只讀的。當主數據庫宕機了,可以通過pg_controldata命令將從庫提升為主庫(將只讀模式變成讀寫),實現一些基本的HA應用。也可以通過建立觸發文件提升為主庫,不推薦。命令快捷不容易出錯。
1、查看/var/lib/pgsql/12/data復制狀態
主庫

從庫

2、主庫故障,停止主庫服務

3、提升從庫為主庫
su - postgres -c "pg_ctl promote"
server promoting
4、查看從庫日志
cat /var/lib/pgsql/912/data/pg_log/postgresql-Mon.log
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- PostgreSQL 慢查詢SQL跟蹤操作
- PostgreSQL 查看表的主外鍵等約束關系詳解
- PostgreSQL 修改視圖的操作
- PostgreSQL 更新視圖腳本的注意事項說明
- postgreSQL中的row_number() 與distinct用法說明
- Postgresql 動態統計某一列的某一值出現的次數實例
- postgresql 計算兩點距離的2種方法小結
- 淺談pg_hint_plan定制執行計劃