postgresql在數據目錄下的pg_xlog子目錄中維護了一個WAL日誌文件,該文件用於記錄數據庫文件的每次改變,這種日誌文件機制提供了一種數據庫熱備份的方案,即:在把數據庫使用文件系統的方式備份出來的同時也把相應的WAL日誌進行備份,即便備份出來的數據塊不一致,也能夠重放WAL日誌把備份的內容推到一致狀態。這也就是基於時間點的備份(Point-in-Time Recovery),簡稱PITR。sql
把WAL日誌傳送到另外一臺服務器有兩種方式數據庫
1.WAL日誌歸檔(base-file)vim
2.流複製(streaming replication)服務器
第一種是寫完一個WAL日誌後,才把WAL日誌文件拷貝到standby數據庫中,就是經過cp命令實現遠程備份,這樣一般備份會落後主庫一個WAL日誌文件。而第二種流複製是postgresql9.x以後才提供的新的傳遞WAL日誌的方法,它的好處是隻要master庫一產生日誌,就會立刻傳遞到standby庫,同第一種相比有更低同步延遲,因此咱們確定會選擇流複製的方式。併發
在實際操做以前還有一點須要說明的是standby的搭建中最關鍵的一步,在standby中生成master的基礎上備份。postgresql9.1以後提供了一個很方便的工具,pg_basebackup,關於它的詳細介紹和參數能夠在官網中查看。ide
系統版本工具 |
主機名post |
IP地址測試 |
postgresql版本ui |
角色 |
10.0.0.14 |
postgresql-master |
10.0.0.14 |
9.5.14 |
主庫 |
10.0.0.15 |
postgresql-slave |
10.0.0.15 |
9.5.14 |
從庫 |
說明:兩臺服務器都已經提早用yum方式安裝好了postgresql 9.5,本文檔配置的是主從複製,主庫能夠讀寫,從庫只能讀取不能寫入數據。
cat >>/var/lib/pgsql/9.5/data/postgresql.conf <<EOF
wal_level = hot_standby #(默認是minimal)
max_wal_senders=2 #(默認是0)
wal_keep_segments=64 #(默認是0)
EOF
說明
wal_level表示啓動搭建Hot Standby,max_wal_senders則須要設置爲一個大於0的數,它表示主庫最多能夠有多少個併發的standby數據庫,而最後一個wal_keep_segments也應當設置爲一個儘可能大的值,以防止主庫生成WAL日誌太快,日誌尚未來得及傳送到standby就被覆蓋,可是須要考慮磁盤空間容許,一個WAL日誌文件的大小是16M
如上圖,一個WAL日誌文件是16M,若是wal_keep_segments設置爲64,也就是說將爲standby庫保留64個WAL日誌文件,那麼就會佔用16*64=1GB的磁盤空間,因此須要綜合考慮,在磁盤空間容許的狀況下設置大一些,就會減小standby從新搭建的風險。接下來還須要在主庫建立一個超級用戶來專門負責讓standby鏈接去拖WAL日誌
建立同步用戶
postgres=# create user rep1 superuser password '123456';
修改配置文件
vim /var/lib/pgsql/9.5/data/pg_hba.conf
86 # Allow replication connections from localhost, by a user with the
87 # replication privilege.
88 #local replication postgres peer
89 #host replication postgres 127.0.0.1/32 ident
90 host replication rep1 10.0.0.0/24 md5
91 #host replication postgres ::1/128 ident
容許從庫服務器鏈接主庫去拖WAL日誌數據
systemctl restart postgresql-9.5
先關閉從庫
systemctl stop postgresql-9.5
清空從庫數據目錄
rm -rf /var/lib/pgsql/9.5/data/*
pg_basebackup -h 10.0.0.14 -U rep1 -F p -x -P -R -D /var/lib/pgsql/9.5/data/ -1 rep_backup
備份過程實際上就是從主庫的data目錄裏物理拷貝數據的過程。
參數說明
-F 指定了輸出的格式,支持p(原樣輸出)或者t(tar格式輸出)。
-x 表示備份開始後,啓動另外一個流複製鏈接從主庫接收WAL日誌。
-p 表示容許在備份的過程當中實時的打印備份的進度。
-R 表示會在備份結束後自動生成recovery.conf文件,這樣就避免了手動建立。
-D 指定把備份寫到哪一個目錄,注意:在作基礎備份以前從庫的數據目錄須要手動清空。
-1 表示指定一個備份的標識。
chown -R postgres.postgres /var/lib/pgsql/9.5/data/
修改配置文件
vim /var/lib/pgsql/9.5/data/postgresql.conf
243 # - Standby Servers -
244
245 # These settings are ignored on a master server.
246
247 #hot_standby = off # "on" allows queries during recovery
248 hot_standby = on #添加此行
249 # (change requires restart)
250 #max_standby_archive_delay = 30s # max delay before canceling queries
251 # when reading WAL from archive;
252 # -1 allows indefinite delay
253 #max_standby_streaming_delay = 30s # max delay before canceling queries
systemctl start postgresql-9.5
查看流複製的進程
在主庫上建立一個庫wangning
登陸從庫查看是否有wangning庫
在主庫的wangning庫中建一個test表並插入數據
進入從庫的wangning庫查看是否有test表和插入的數據
通過測試可看出,主從複製已配置成功。