由於 PostgreSQL 的交易日誌設計是和所運行的作業系統及硬體架構有關,所以要進行 Streaming Replication 規劃時,必須要兩端的作業系統一致(如:Linux 對 Linux、Windows 對 Windows);以及硬體架構也要一致才行(例如:32 位元和 64 位元之間就不能用 Streaming Replication) 。
要作實際演練的話,有兩種簡單的環境設置可以選擇:
1. 在同一台機器上開兩個 PostgreSQL instance,兩個 instance 之間進行備份;
2. 或是開兩台虛擬機器( VM ),兩個 VM 間進行備份。
這兩者的操作流程是一樣的。
[20191205 Update] 已經針對 PostgreSQL 12 重新演練一次了~
這次我演練的方式,是選在同一個作業系統上面跑兩個 PostgreSQL instance:ㄧ個提供主要的資料庫服務,稱為 primary;一個作為備份用資料庫,叫做 standby。
我的相關環境設定如下:
OS: Linux x86-64
PostgreSQL:ver. 9.5
[primary instance]
IP: localhost
Port: 5432
Process owner: postgres
Cluster folder 位置:/var/lib/pgsql/9.5/data/
[standby instance]
IP: localhost
Port: 5433
Process owner: aaa
Cluster folder 位置:/home/aaa/pgsql/9.5/data/
要注意的是,在同一台主機上跑多個 PostgreSQL instance,建議要將 port 設定到不同的值,以免發生呼相衝突的問題。
Streaming Replication 設定過程分成兩大步驟,為分別在 primary 與 standby 個別進行設定:
在 primary 資料庫上,要設定的的有:
1) 建立用來作備份的帳戶
2) 兩個設定檔:postgresql.conf、pg_hba.conf
3) 重新啟動這個 PostgreSQL instance
而在 standby 資料庫上,要設定的的有:
1) 從 primary 資料庫拷貝一份 primary 資料庫的內容
2) 兩個設定檔:postgresql.conf、recovery.conf
3) 啟動這個 PostgreSQL instance。大功告成!
接著下面就是個別設定的流程:
[primary]
(1) 使用 psql 進入 primary instance PostgreSQL,在 PostgreSQL 內先建立專門進行複寫的帳戶
[postgres]$ psql -p 5432 postgres psql (9.5.1) Type "help" for help. postgres=# CREATE ROLE strmrepl postgres=# WITH REPLICATION postgres=# PASSWORD 'strmrepl' postgres=# LOGIN;
在這裡建立了一個有 REPLICATION 權限的帳戶 strmrepl,備份機會透過這個帳戶進來抓交易日誌檔。
(2) 設定 pg_hba.conf,允許 strmrepl 這個帳戶能允許備份機登入進來
host replication strmrepl 127.0.0.1/32 trust
(3) 設定 postgresql.conf 有關的內容
listen_addresses = "*" port = 5432 wal_level = hot_standby max_wal_senders = 3 # 一次最多丟多少量的交易日誌 wal_keep_segment = 5 # 一次最多保留多少交易日誌
(4) 重新啟動 primary instance
[postgres]$ pg_ctl -D /var/lib/pgsql/9.5/data/ -l logfile restart
primary 設定到此完成。
接著是 standby:
[standby]
(1) 先使用 pg_basebackup 指令,拷貝一份 primary 資料庫到目標資料位置
[aaa]$ /usr/lib64/postgresql/9.5/bin/pg_basebackup -h 127.0.0.1 -p 5432 -D /home/aaa/pgsql/9.5/data/ -U strmrepl -v -P
值得注意的是,pg_basebackup 這個工具預設不會放到系統 $PATH 變數所在的地方,要去系統上找一下這個程式的絕對路徑來執行。
(2) 設定 postgresql.conf 內容
listen_addresses = "*" port = 5433 wal_level = hot_standby hot_standby = on
(3) 新增 recovery.conf
standby_mode = 'on' primary_conninfo = 'host=127.0.0.1 port=5432 user=strmrepl' trigger_file = '/tmp/pg_failover.trigger'
如果發生 primary 的交易日誌進行太快,使的 standby 跟不上的話,就需要將 primary 設定進行 WAL archiving 的備份,讓 standby 能夠使用 recovery.conf 內的 restore_command 選項,讓 standby 能利用 WAL archive 補足沒跟上的交易。
trigger_file 的選項是用來讓 standby 能夠在指定的檔案產生時,便切換成為 primary 繼續工作。
有關 recovery.conf 設定檔的內容,能夠在
/usr/share/postgresql-9.5/recovery.conf.sample找到各選項的設定與解說。
(4) 啟動備份資料庫
[aaa]$ pg_ctl -D /home/aaa/pgsql/9.5/data/ -l logfile start
這樣一來,streaming replication 就完工了。
接著就是登入檢視狀況了。在 PostgreSQL 中,有提供幾個能夠檢視 streaming replication 情況的相關系統函數與 view。
在 primary instance 上,有 pg_stat_replication 這個 view 以及 pg_current_xlog_location() 這個函數可供查閱:
[postgres] # SELECT usename, client_addr, state, sent_location postgres-# FROM pg_stat_replication; usename | client_addr | state | sent_location ----------+-------------+-----------+--------------- strmrepl | 127.0.0.1 | streaming | 0/30004C0 (1 row)
[postgres] # SELECT pg_current_xlog_location(); pg_current_xlog_location -------------------------- 0/30003E0 (1 row)
在 standby instance 上,則是使用 pg_is_in_recovery()、pg_last_xlog_replay_location() 以及 pg_last_xlog_receive_location() 三個函數查詢:
[postgres] # SELECT pg_is_in_recovery(); pg_is_in_recovery ------------------- t (1 row)
[postgres] # select pg_last_xlog_replay_location(); pg_last_xlog_replay_location ------------------------------ 0/30003E0 (1 row)
[postgres] # select pg_last_xlog_receive_location(); pg_last_xlog_receive_location ------------------------------- 0/30003E0 (1 row)
觀察上述指令,primary 上的 pg_current_xlog_location() 即為當前交易日誌位置;standby 上的 pg_last_xlog_replay_location() 則為已經同步的交易日誌位置。比較兩者是否一致就能得知 streaming replication 的狀況:兩者相同則表示目前已經同步,不一致就表示複寫還沒有跟上。
參考資料:
Difference between Warm, hot standby and Streaming Replication
New Replication and Recovery Features in PostgreSQL 9.1 by Vibhor Kumar
How To Set Up Master Slave Replication on PostgreSQL on an Ubuntu 12.04 VPS
Streaming Replication - PostgreSQL wiki
How To Set Up Master Slave Replication on PostgreSQL on an Ubuntu 12.04 VPS | DigitalOcean
Switchover/Switchback in PostgreSQL 9.3 By Vibhor Kumar
How PostgreSQL's SR (Streaming Replication) works by Stavros Korokithakis
Relational Database Technologies: Implementing Switchover/Switchback in PostgreSQL 9.3.
Db research & testing: PostgreSQL 9.0: Physical Hot Standby & streaming replication
select * from depesz; » Blog Archive » Write Ahead Log + Understanding postgresql.conf: checkpoint_segments, checkpoint_timeout, checkpoint_warning
官網文件:
Chapter 25. High Availability, Load Balancing, and Replication - 25.5. Hot Standby
Chapter 29. Reliability and the Write-Ahead Log - 29.4. WAL Configuration
Binary Replication Tutorial - PostgreSQL wiki
感謝分享~
回覆刪除wal_keep_segments = 5 # 一次最多保留多少交易日誌
好像少了一個s喔
謝謝提醒~
回覆刪除不過現在都建議不要直接改參數檔
而是透過「Postgres 設定系統參數 (GUC) 的小小注意事項」這篇筆記提到的方式作設定(不好意思,請直接用部落格的搜尋框找這篇。。)
這樣一來就不會有參數名稱錯誤造成的困擾了~
喔喔!很方便~ 感謝分享!!
刪除有支援 edbldr directpath ?
回覆刪除您好:
刪除1) EDB*Loader (指令名稱叫做 edbldr)是 EDB 企業版的資料匯入功能~先說明一下
2) 在 EDB Postgres Advance Server 11.5.12 測試(設置成 Streaming Replication)時,發現透過 EDB*Loader Direct Path Load 匯入的資料,是沒有被同步到 Standby DB 的,但是,磁碟空間在兩台 DB 上會佔據一樣多
希望以上有回答到您的問題