PostgreSQL流複製 postgresql物理複製也叫流複製,通過將主節點上的是redo日誌(wal日誌)傳送到從節點來實現資料庫的同步的,參考下圖(侵刪),正如邏輯複製里提到的 1,物理複製數據傳遞的原理:傳遞的wal也即redo日誌,從節點上通過對物理日誌進行redo的方式來實現數據的還原 ...
PostgreSQL流複製
postgresql物理複製也叫流複製,通過將主節點上的是redo日誌(wal日誌)傳送到從節點來實現資料庫的同步的,參考下圖(侵刪),正如邏輯複製里提到的
1,物理複製數據傳遞的原理:傳遞的wal也即redo日誌,從節點上通過對物理日誌進行redo的方式來實現數據的還原,想對重新執行sql的邏輯日誌來說效率會更高。
2,物理複製數據傳遞的範圍:物理複製是實例級的,因此沒有所謂的邏輯複製的發佈(publication)~訂閱(subscribution)對象,整個搭建過程相對簡單不少。
主節點配置
主節點配置
###主節點 ###複製同步模式 synchronous_commit = on # synchronization level; off, local, remote_write, remote_apply, or on ###主節點創建複製用戶 create user replica with replication login password 'A-Strong-Password'; ###主節點pg_hba連接配置 ###增加複製用戶以及從庫IP配置: host replication replica 192.168.1.2/32(從庫ip) md5 ###重啟主節點 systemctl restart postgresql9100 ###主節點複製槽名稱確認(如果存在刪除) #查看複製槽信息 SELECT * FROM pg_replication_slots; #請確保在刪除任何複製槽之前,該槽不再被任何複製消費者使用。 select pg_drop_replication_slot('pgstandby_slave01');
主節點複製狀態監控
select * from pg_stat_replication ; id 一個 WAL 發送進程的進程 ID usesysid 登錄到這個 WAL 發送進程的用戶的 OID usename 登錄到這個 WAL 發送進程的用戶的名稱 application_name 連接到這個 WAL 發送進程的應用的名稱 client_addr 連接到這個 WAL 發送進程的客戶端的 IP 地址。 如果這個域為空,它表示該客戶端通過伺服器機器上的一個Unix 套接字連接。 client_hostname 連接上的客戶端的主機名,由一次對client_addr的逆向 DNS 查找報告。 這個域將只對 IP 連接非空,並且只有在 log_hostname被啟用時非空。 client_port 客戶端用來與這個 WAL 發送進程通訊的 TCP 埠號,如果使用 Unix 套接字則為-1 backend_start 這個進程開始的時間,即客戶端是何時連接到這個WAL 發送進程的。 backend_xmin 由hot_standby_feedback報告的這個後備機的xmin水平線。 state 當前的 WAL 發送進程狀態。 可能的值是: startup: 這個WAL發送器正在啟動。 catchup: 這個WAL發送者連接的備用伺服器正在趕上主伺服器。 streaming: 在其連接的備用伺服器趕上主伺服器之後,這個WAL發送方正在流化變化。 backup: 這個WAL發送器正在發送一個備份。 stopping: 這個WAL發送器正在停止。 sent_lsn 在這個連接上發送的最後一個預寫式日誌的位置 write_lsn 被這個後備伺服器寫入到磁碟的最後一個預寫式日誌的位置 flush_lsn 被這個後備伺服器刷入到磁碟的最後一個預寫式日誌的位置 replay_lsn 被重放到這個後備伺服器上的資料庫中的最後一個預寫式日誌的位置 write_lag 從本地刷新近期的WAL與接收到此備用伺服器已寫入WAL的通知(但尚未刷新或應用它)之間的時間經過。 如果將此伺服器配置為同步備用伺服器,則可以使用此參數來衡量在提交時synchronous_commit級別remote_write所導致的延遲。 flush_lag 在本地刷寫近期的WAL與接收到後備伺服器已經寫入並且刷寫它(但還沒有應用)的通知之間流逝的時間。 如果這台伺服器被配置為一個同步後備,這可以用來計量在提交時synchronous_commit的級別on所導致的延遲。 replay_lag 在本地刷寫近期的WAL與接收到後備伺服器已經寫入它、刷寫它並且應用它的通知之間流逝的時間。 如果這台伺服器被配置為一個同步後備,這可以用來計量在提交時synchronous_commit的級別remote_apply所導致的延遲。 sync_priority 在基於優先的同步複製中,這台後備伺服器被選為同步後備的優先順序。在基於規定數量的同步複製中,這個值沒有效果。 sync_state 這一臺後備伺服器的同步狀態。 可能的值是: async: 這台後備伺服器是非同步的。 potential: 這台後備伺服器現在是非同步的,但可能在當前的同步後備失效時變成同步的。 sync: 這台後備伺服器是同步的。 quorum: 這台後備伺服器被當做規定數量後備伺服器的候選。 reply_time 帶時區的時間戳,從備用伺服器收到的最後一條回覆信息的發送時間。
從節點配置
從節點配置
從節點通過pg_basebackup將主節點的數據備份到當前實例下,在啟動後基於pgbasebackup備份時生成的postgresql.auto.conf文件,啟動時會自動接入主節點進行複製。這一點其實與MySQL的克隆插件如出一轍(clone instance from clone_user@***.***.***.***:port identified by "password";),都是一個實例級的備份,都會保留備份/克隆完成時的主節點位點信息,以致於在啟動複製時無需關註位點值,只需要啟動複製即可。
###從節點 ###關閉從節點實例服務 ###備份從節點實例的數據文件 mv data data_bak mkdir data ###備份遠程(主節點)數據到本地 /usr/local/pgsql/bin/pg_basebackup -h 1.1.1.1 -p 8888 -U replica --password -R -P -v -C --slot=pgstandby_slave01 -D /usr/local/pgsql/pg_instance_9000/data/ -R 說明會創建standby.signal文件,以及補充postgresql.auto.conf的內容 -P 顯示備份進度 -v 顯示更加詳細信息 -C 同時創建複製槽 --slot 指定複製槽的名字(一個備庫一個名字) -D 生成備庫的路徑 ###備份完成後重新授權文件路徑許可權給postgres用戶 #1,因為pg_basebackup備份到從節點當前實例的另外一個路徑,備份中包含了配置文件信息,當前配置文件中的信息還是主節點的,因此相關數據,日誌,歸檔文件的路徑要修改 #2,postgres用戶並沒有pg_basebackup執行備份備份生成的文件的許可權,因此需要授權 chown postgres.postgres -R /usr/local/pgsql/pg_instance_9000/ chmod 700 -R /usr/local/pgsql/pg_instance_9000/ ###從節點啟動實例 然後用systemctl重啟從節點,複製自動開啟
從節點操作一鏡到底
從節點複製狀態監控
select pg_is_wal_replay_paused() #如果恢復被暫停,為真。 select pg_wal_replay_pause() #立即暫停恢復(僅限於超級用戶)。 select pg_wal_replay_resume() #如果恢復被暫停,重啟之(僅限於超級用戶)。 select * from pg_stat_wal_receiver; pid WAL 接收器進程的進程 ID status WAL 接收器進程的活動狀態 receive_start_lsn WAL 接收器啟動時使用的第一個預寫日誌位置 receive_start_tli WAL 接收器啟動時使用的第一個時間線編號 received_lsn 已經接收到並且已經被刷入磁碟的最後一個預寫日誌的位置,這個域的初始值是 WAL 接收器啟動時使用的第一個日誌位置 received_tli 已經接收到並且已經被刷入磁碟的最後一個預寫日誌的時間線編號,這個域的初始值是 WAL 接收器啟動時使用的第一個日誌所在的時間線編號 last_msg_send_time 從源頭 WAL 發送器接收到的最後一個消息的發送時間 last_msg_receipt_time 從源頭 WAL 發送器接收到的最後一個消息的接收時間 latest_end_lsn 報告給源頭 WAL 發送器的最後一個預寫日誌位置 latest_end_time 報告給源頭 WAL 發送器最後一個預寫日誌位置的時間 slot_name 這個 WAL 接收器使用的複製槽的名稱 conninfo 這個 WAL 接收器使用的連接串,安全相關的域會被隱去。