1 備份原理
postgresql在資料目錄下的pg_xlog子目錄中維護了一個WAL日志檔案,該檔案用于記錄資料庫檔案的每次改變,這種日志檔案機制提供了一種資料庫熱備份的方案,即:在把資料庫使用檔案系統的方式備份出來的同時也把相應的WAL日志進行備份,即使備份出來的資料塊不一緻,也可以重放WAL日志把備份的内容推到一緻狀态。這也就是基于時間點的備份(Point-in-Time Recovery),簡稱PITR。
把WAL日志傳送到另一台伺服器有兩種方式
1.WAL日志歸檔(base-file)
2.流複制(streaming replication)
第一種是寫完一個WAL日志後,才把WAL日志檔案拷貝到standby資料庫中,就是通過cp指令實作遠端備份,這樣通常備份會落後主庫一個WAL日志檔案。而第二種流複制是postgresql9.x之後才提供的新的傳遞WAL日志的方法,它的好處是隻要master庫一産生日志,就會馬上傳遞到standby庫,同第一種相比有更低同步延遲,是以我們肯定會選擇流複制的方式。
在實際操作之前還有一點需要說明的是standby的搭建中最關鍵的一步,在standby中生成master的基礎上備份。postgresql9.1之後提供了一個很友善的工具,pg_basebackup,關于它的詳細介紹和參數可以在官網中檢視。
2 基本環境
系統版本 | 主機名 | IP位址 | postgresql版本 | 角色 |
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,本文檔配置的是主從複制,主庫可以讀寫,從庫隻能讀取不能寫入資料。
3 主庫配置
3.1 修改配置檔案
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日志
3.2 建立同步使用者
建立同步使用者
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日志資料
3.3 重新開機postgresql服務
systemctl restart postgresql-9.5
4 從庫配置
4.1 清空從庫的資料目錄
先關閉從庫
systemctl stop postgresql-9.5
清空從庫資料目錄
rm -rf /var/lib/pgsql/9.5/data/*
4.2 從主庫備份資料
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
4.3 啟動從庫
systemctl start postgresql-9.5
檢視流複制的程序
5 測試
5.1 從庫寫入測試
5.2 建立庫表測試
在主庫上建立一個庫wangning
登入從庫檢視是否有wangning庫
在主庫的wangning庫中建一個test表并插入資料
進入從庫的wangning庫檢視是否有test表和插入的資料
5.3 删除庫測試
經過測試可看出,主從複制已配置成功。
轉載于:https://blog.51cto.com/wn2100/2238996