異步復制
#創建復制數據庫用戶 CREATE ROLE rep login replication encrypted password 'rep'; #修改配置文件pg_hba.conf,增加replica用戶,進行同步 host replication rep 192.168.20.201/24 md5 host replication rep 192.168.20.202/24 md5 #修改配置文件postgresql.conf,修改以下幾個地方 wal_level = hot_standby # 這個是設置主為wal的主機 max_wal_senders = 32 # 這個設置了可以最多有幾個流復制連接,差不多有幾個從,就設置幾個 wal_keep_segments = 256 # 設置流復制保留的最多的xlog數目 wal_sender_timeout = 60s # 設置流復制主機發送數據的超時時間 max_connections = 100 # 這個設置要注意下,從庫的max_connections必須要大於主庫的 登錄postgre用戶,測試連接主庫數據庫是否正常 psql -h 192.168.20.201 #若鏈接正常,刪除從庫data目錄下文件 rm -rf data/* #通過pg_basebackup命令行在從庫上生成基礎備份 pg_basebackup -h 192.168.20.201 -U rep -Fp -X stream -P -R -D /u01/pgsql/data -l replbackup20191015 #參數說明: # -h:指定連接的數據庫的主機名或IP地址,這里就是主庫的ip # -U:指定連接的用戶名,此處是我們剛才創建的專門負責流復制的repl用戶 # -F:指定了輸出的格式,支持p(原樣輸出)或者t(tar格式輸出) # -X:表示wal日志格式 # -P:表示允許在備份過程中實時的打印備份的進度 # -R:表示會在備份結束后自動生成recovery.conf文件,這樣也就避免了手動創建 # -D:指定把備份寫到哪個目錄 # -l:表示指定一個備份的標識,運行命令后看到如下進度提示就說明生成基礎備份成功 #修改從庫數據目錄下的postgresql.conf文件,將hot_standby改為啟用狀態 hot_standby=on #重啟從數據庫 postgres=# SELECT client_addr,application_name,sync_state FROM pg_stat_replication; client_addr | application_name | sync_state ----------------+------------------+------------ 192.168.20.202 | walreceiver | async (1 row)
同步復制
修改主庫postgresql.conf synchronous_standby_names = 'rep1' 重啟主數據庫 postgres=# SELECT client_addr,application_name,sync_state FROM pg_stat_replication; client_addr | application_name | sync_state ----------------+------------------+------------ 192.168.20.202 | rep1 | sync (1 row)
延遲復制
延遲復制是加快誤操作恢復 ,比如dml、ddl操作失誤 比用備份pitr恢復速度快,pitr是恢復整庫. 修改備庫上的recovery.conf [postgres@redis03 data]$ cat recovery.conf standby_mode = 'on' primary_conninfo = 'application_name=rep2 user=rep password=rep host=192.168.20.201 port=5432 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any' recovery_min_apply_delay = '8h' recovery_target_timeline = 'latest' 啟動數據庫 延遲復制 演練 postgres=# \d List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | t | table | postgres public | t1 | table | postgres public | t2 | table | postgres (3 rows) postgres=# delete from t2 ; DELETE 10000 主庫上查延遲時間 postgres=# SELECT client_addr,application_name,sync_state,replay_lag FROM pg_stat_replication; client_addr | application_name | sync_state | replay_lag ----------------+------------------+------------+----------------- 192.168.20.202 | rep1 | sync | 192.168.20.203 | rep2 | async | 00:02:02.748067 (2 rows) 備庫上查看復制事務的最后時間 、lsn、現在時間 postgres-# SELECT pg_last_wal_replay_lsn(), pg_last_xact_replay_timestamp(),now() ; pg_last_wal_replay_lsn | pg_last_xact_replay_timestamp | now ------------------------+-------------------------------+------------------------------- 0/251BE288 | 2019-10-15 18:03:27.592845+08 | 2019-10-16 11:18:57.641601+08 (1 row) 延遲復制庫停止復制 postgres=# SELECT pg_wal_replay_pause(); pg_wal_replay_pause --------------------- (1 row)
啟動復制
select pg_wal_replay_resume(); 主庫的數據 postgres=# select count(1) from t2; count ------- 0 (1 row) 備庫的數據 postgres=# select count(1) from t2; count ------- 10000 (1 row) 停止延遲復制數據庫 pg_ctl stop -m fast 修改recovery.conf [postgres@redis03 data]$ cat recovery.conf standby_mode = 'on' primary_conninfo = 'application_name=rep2 user=rep password=rep host=192.168.20.201 port=5432 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any' recovery_target_time = '2019-10-16 10:18:57.641601+08' 如果恢復的數據不是需要的,可以慢慢推進recovery_target_time 時間