一、簡介
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
主機上可以看到正在向從機發送數據流
從機上可以看到正在接收數據流
到此,主從配置完成;
參考鏈接: