一、 簡介
PostgreSql在9.0之后引入了主從的流復制機制,所謂流復制,就是從服務器通過tcp流從主服務器中同步相應的數據。這樣當主服務器數據丟失時從服務器中仍有備份。
與基於文件日志傳送相比,流復制允許保持從服務器更新。 從服務器連接主服務器,其產生的流WAL記錄到從服務器, 而不需要等待主服務器寫完WAL文件(關於Wal可以看看官方的說法https://www.postgresql.org/docs/10/static/different-replication-solutions.html)。
PostgreSQL流復制默認是異步的。在主服務器上提交事務和從服務器上變化可見之間有一個小的延遲,這個延遲遠小於基於文件日志傳送,通常1秒能完成。如果主服務器突然崩潰,可能會有少量數據丟失。
同步復制必須等主服務器和從服務器都寫完WAL后才能提交事務。這樣在一定程度上會增加事務的響應時間。
配置同步復制僅需要一個額外的配置步驟: synchronous_standby_names必須設置為一個非空值。synchronous_commit也必須設置為on。
注: 主從服務器所在節點的系統、環境等最好一致。PostgreSQL版本也最好一致,否則可能會有問題。
二、 安裝部署(使用Ubuntu的普通用戶安裝部署)
| 角色 |
IP地址 |
系統版本 |
數據庫版本 |
| 主服務器 |
192.168.100.71 |
Ubuntu18.04 amd64 |
PostgreSQL10 |
| 從服務器 |
192.168.100.70 |
Ubuntu18.04 amd64 |
PostgreSQL10 |
注:18.04版本默認的PostgreSQL版本是10,要安裝其他版本可以采用編譯的方式或者apt-get 指定版本號安裝
1、兩台服務器都要安裝PostgreSQL
sudo apt-get updatel
sudo apt-get install postgresql
sudo vi /etc/postgresql/10/main/postgresql.conf
在文件末尾添加或者找到該行,將peer改為trust
local all all trust
重啟PostgreSQL服務
sudo service postgresql restartt
這樣PostgreSQL就安裝完畢
2、配置主服務器
切換成postgres用戶
sudo su – postgres
進入數據庫,創建一個普通的數據庫用戶用戶進行主從同步(只需賦予登錄和復制的權限即可)

postgres=# create role guoxm login replication encrypted password 'guoxm'
然后退出
postgres=# \q
在exit退出到原用戶
然后,修改postgresql的pg_hba.conf,配置運行剛剛創建的guoxm用戶可以進行連接
sudo vi /etc/postgresql/10/main/pg_hba.conf
在文件尾添加如下兩行
host all all 192.168.100.70/32 trust #運行70服務器連接到本機 host replication guoxm 192.168.100.70/32 md5 #運行guoxm用戶在70上復制本機數據
注:第二個的角色必須是replication
最后,再次配置postgresql.conf
sudo vi /etc/postgresql/10/main/ postgresql.conf
這次需要配置的是主機的角色
listen_addresses = ‘*’ #監聽所有ip archive_mode = on #開啟歸檔模式 archive_command = ‘cp %p /var/lib/postgresql/10/main/%f’ #歸檔命令 wal_level = hot_standby #熱備模式 max_wal_senders = 1 #最多有1個流復制連接 wal_sender_timeout = 60s #流復制超時時間 max_connections = 100 #最大連接時間,必須要小於從庫的配置
保存退出后,重啟數據庫服務
sudo service postgresql restartt
3、配置從服務器
首先,先測試一下是否能連接主服務器
psql -h 192.168.100.70 -U postgres
如果可以,說明主機配置正常,否則檢查一下主機的pg_hba.conf配置
進入到postgres用戶
sudo su - postgres
先清空main目錄下的數據(main文件夾就是PostgreSQL數據的存儲文件夾)
rm -rf 10/main/*
或者
rm -rf /var/lib/postgresql/10/main/*
因為PostgreSQL的home目錄就在/var/lib/postgresql中
所以上面兩條命令到達的效果是一樣的
然后,開始從主服務器上copy數據到本機上,這一步叫做“基礎備份”
pg_basebackup -h 192.168.100.71 -U guoxm –D 10/main/ -X stream –P
或者
pg_basebackup -F p --progress -D 10/main/ -h 192.168.100.71 -p 5432 -U guoxm --password
pg_basebackup是PostgreSQL自帶的基礎備份工具
這樣,基礎備份就完成了
然后,創建recovery.conf用於從庫恢復從主庫獲取的數據
vi recovery.conf
然后編輯如下配置
standby_mode = on #表示該節點是從庫 primary_conninfo = ‘host=192.168.100.71 post=5432 user=guoxm password=guoxm’#從機信息和連接用戶 recovery_target_timelint = ‘latest’ #說明恢復到最新狀態
保持並退出后,
復制或在移動到main文件夾中
cp recovery.conf 10/main/
或者
mv recovery.conf 10/main/
然后,exit退出到原用戶
最后,配置從機的postgresql.conf文件
sudo vi /etc/postgresql/10/main/postgresql.conf
在文件末尾添加如下配置
wal_level = hot_standby #熱備模式 max_connections = 300 #最大連接時間,必須要小於從庫的配置 hot_standby = on #說明這台機器不僅用於數據歸檔,還可以用於數據查詢 max_standby_streaming_delay = 30s #流備份的最大延遲時間 wal_receiver_status_interval = 10s #向主機匯報本機狀態的間隔時間 hot_standby_feedback = on #r出現錯誤復制,向主機反饋
保存並退出
到這里,從機配置完成
重啟數據庫服務
sudo service postgresql restart
4、驗證主從配置是否成功
在主機上,切換到postgres用戶
sudo su – postgres
進入數據庫

執行如下查詢
select client_addr,sync_state from pg_stat_replication;
如果看到如下查詢結果

說明192.168.100.70是從服務器,在接收流,而且是異步流復制。說明主從配置成功
注:必須切換到postgres用戶下進行查詢
此外,還可以查看相關進程來驗證是否配置成功
在主機、從機上分別執行
ps aux | grep postgres
主機上可以看到正在向從機發送數據流

從機上可以看到正在接收數據流

到此,主從配置完成;
參考鏈接:
