PostgreSQL主從復(fù)制--物理復(fù)制
1、復(fù)制類型
PostgreSQL支持物理復(fù)制(流復(fù)制)及邏輯復(fù)制2種。通過流復(fù)制技術(shù),可以從實例級復(fù)制出一個與主庫一模一樣的實例級的從庫。流復(fù)制同步方式有同步、異步兩種。
另一種復(fù)制方式為邏輯復(fù)制,區(qū)別于物理復(fù)制的是物理復(fù)制是基于實例級的復(fù)制,只能復(fù)制整個PostgreSQL實例,而不能基于部分庫及表。從PostgreSQL10開始,出現(xiàn)了基于表級別的復(fù)制,即邏輯復(fù)制。
2、流復(fù)制
主庫安裝及從庫編譯此處就省略了,直接進入主從復(fù)制的安裝環(huán)節(jié)。
(1) 修改主庫配置文件postgresql.conf
參數(shù)簡要說明:
- listen_address: 按需設(shè)置,本次測試配置為所有主機均可以訪問,生產(chǎn)環(huán)境可以按需配置網(wǎng)段或IP等。
- wal_level: 設(shè)置流復(fù)制模式至少設(shè)置為replica。
- archive_mode: 本次啟用歸檔。
- archive_command:WAL日志歸檔命令,生產(chǎn)環(huán)境可以將歸檔拷貝到對應(yīng)目錄或其他機器上,本次測試配置為歸檔到本機的另一個目錄下。
- max_wal_senders:最大WAL發(fā)送進程數(shù),此數(shù)量需大于等于從庫個數(shù)且比max_connections小。
- wal_keep_segments:pg_wal目錄下保留WAL日志的個數(shù),每個WAL文件默認16M,為保障從庫能在應(yīng)用歸檔落后時依舊能追上主庫,此值建議設(shè)置較大一點。
- hot_standby:此參數(shù)控制在恢復(fù)歸檔期間是否支持只讀操作,設(shè)置為ON后從庫為只讀模式。
注意:上述參數(shù)中有涉及歸檔日志的路徑,需手動創(chuàng)建
(2)創(chuàng)建復(fù)制賬號
為了數(shù)據(jù)安全及便于權(quán)限控制,創(chuàng)建一個復(fù)制專用的數(shù)據(jù)庫賬號。
(3)修改配置文件pg_hba.conf
添加復(fù)制賬號的權(quán)限,因可能會主從切換,因此 主從機器的IP均添加。也可以設(shè)置網(wǎng)段,以便于后期添加從庫。
(4)備份數(shù)據(jù)
從機上在線備份主庫數(shù)據(jù),并將數(shù)據(jù)放在指定路徑,此路徑建議與主庫路徑一致??梢允褂胮g_basebackup。
命令在線熱備份,具體命令如下:
pg_basebackup命令中的參數(shù)說明:
- -h 指定連接的數(shù)據(jù)庫的主機名或IP地址,這里就是主庫的ip。
- -U 指定連接的用戶名,此處是我們剛才創(chuàng)建的專門負責(zé)流復(fù)制的repl用戶。
- -F 指定生成備份的數(shù)據(jù)格式,支持p(plain原樣輸出)或者t(tar格式輸出)。
- -X 表示備份開始后,啟動另一個流復(fù)制連接從主庫接收WAL日志,有 f(fetch)和s (stream)兩種方式,建議使用s方式。
- -P 表示顯示數(shù)據(jù)文件、表空間傳輸?shù)慕瓢俜直?允許在備份過程中實時的打印備份的進度。
- -v 表示啟用verbose模式,命令執(zhí)行過程中會打印各階段日志,建議啟用。
- -R 表示會在備份結(jié)束后自動生成recovery.conf文件,這樣也就避免了手動創(chuàng)建。
- -D 指定把備份寫到哪個目錄,這里尤其要注意一點就是做基礎(chǔ)備份之前從庫的數(shù)據(jù)目錄(/data/postgresql/data)目錄需要手動清空。
- -l 表示指定個備份的標(biāo)識,運行命令后可以看到進度提示。
以上備份命令輸出過程如下:
從以上日志信息看出pg_basebackup命令首先對數(shù)據(jù)庫做一次checkpoint,之后基于時間點做一個全庫基準(zhǔn)備份,全備過程中會拷貝$PGDATA數(shù)據(jù)文件和表空間文件到備庫節(jié)點對應(yīng)目錄。
(5)修改recovery.conf
以上備份命令中生成了recovery.conf 文件,因此簡單修改即可。
參數(shù)說明:
- standby_mode:設(shè)置是否啟用數(shù)據(jù)庫為備庫,如果設(shè)置成on,備庫會不停地從主庫上獲取WAL日志流,直到獲取主庫上最新的WAL日志流
- primary_conninfo:設(shè)置主庫的連接信息,這里設(shè)置了主庫IP、端口、用戶名信息等,此處是明文密碼,生產(chǎn)環(huán)境建議配置非明文密碼,而是將密碼配置在另一個隱藏文件中
- covery_target_timeline:設(shè)置恢復(fù)的時間線(timeline),默認情況下是恢復(fù)到基準(zhǔn)備份生成時的時間線,設(shè)置成latest表示從備份中恢復(fù)到最近的時間線,通常流復(fù)制環(huán)境設(shè)置此參數(shù)為latest,復(fù)雜的恢復(fù)場景可將此參數(shù)設(shè)置成其他值
(6)啟動從庫
直接使用pg_ctl或配置服務(wù)啟動從庫即可。
如果啟動過程中出現(xiàn)如下錯誤。
則需要先修改權(quán)限,再啟動即可。
(7)測試主從同步
在主庫創(chuàng)建表并新增數(shù)據(jù)。
在從庫查看。
數(shù)據(jù)已正常同步。
(8)查看復(fù)制狀態(tài)
通過pg_stat_replication視圖可以查看復(fù)制狀態(tài)
以上查詢結(jié)果sync_state字段值為async,表示主備數(shù)據(jù)復(fù)制使用異步方式;state值為streaming,表示流復(fù)制方式。
(9)調(diào)整為同步復(fù)制
前面的步驟部署的為異步復(fù)制,如想配置為同步復(fù)制,則調(diào)整recovery.conf配置文件里的 synchronous_commit及synchronous_standby_names 后重啟或reload即可。
之后再查看結(jié)果如下:
此時狀態(tài)已變?yōu)橥綇?fù)制了。
注:synchronous_commit 有多種方式,在流復(fù)制模式下,主要設(shè)置情況如下:
- remote_write: 當(dāng)流復(fù)制主庫提交事務(wù)時,需等待備庫接收主庫發(fā)送的WAL日志流并寫入備節(jié)點操作系統(tǒng)緩存中,之后向客戶端返回成功,這種情況下備庫實例出現(xiàn)異常關(guān)閉時不會有已傳送的WAL日志丟失風(fēng)險,但備庫操作系統(tǒng)異常宕機就有已傳送的WAL丟失風(fēng)險了,此時WAL可能還沒完全寫入備節(jié)點WAL文件中,簡單地說remote_write表示本地WAL已落盤,備庫的WAL還在備庫操作系統(tǒng)緩存中,也就是說只有一份持久化的WAL,這個選項帶來的事務(wù)響應(yīng)時間較低
- on: 設(shè)置成on表示流復(fù)制主庫提交事務(wù)時,需等待備庫接收主庫發(fā)送的WAL日志流并寫入WAL文件,之后才向客戶端返回成功,簡單地說on表示本地WAL已落盤,備庫的WAL也已落盤,也就是說有兩份持久化的WAL,但備庫此時還沒有完成重做,這個選項帶來的事務(wù)響應(yīng)時間較高
- remote_apply: 表示表示流復(fù)制主庫提交事務(wù)時,需等待備庫接收主庫發(fā)送的WAL并寫入WAL文件,同時備庫已經(jīng)完成重做,之后才向客戶端返回成功,簡單地說remote_apply表示本地WAL已落盤,備庫WAL已落盤并且已完成重做,這個設(shè)置保證了擁有兩份持久化的WAL,同時備庫也完成了重做,這個選項帶來的事務(wù)響應(yīng)時間最高,即性能最差。