生命不息,test不止。
最近組里面修改了幾個postgresql的bug,要進行回歸測試,除了前面提到的WAL的RT測試和Mirroring Controller的RT測試,還要測試下postgresql的hot standby功能。
要進行該項測試,就要首先搭建hot standby環境。
本文主要記錄下搭建hot standby環境的過程以及其中遇到的問題及解決方法。
首先介紹下系統環境:
操作系統:RHEL_6_x64
postgresql版本:9.5.4
首先至少要有兩台機器,其次這兩台機器都安裝了postgresql(postgresql的編譯安裝見本人的這篇博客)。當然了,postgres賬號也是要的。還有一些基礎的軟件包也是要安裝的,這里不贅述了。
好的言歸正傳,進入hot standby環境的搭建。
我的實例環境如下:
主服務器:IP(192.168.2.130) 數據目錄(/home/postgres/data)
從服務器:IP(192.168.2.128) 數據目錄(/file1/database/data)
1 建立主數據庫
mkdir -p /home/postgres/data #創建放置數據庫的文件夾
initdb –D /home/postgres/data #初始化數據庫
修改data文件夾下的postgresql.conf文件:
listen_addresses = '0.0.0.0'
port = 54321 #設置監聽端口,只要不沖突即可
wal_level = hot_standby
max_wal_senders = 30
修改data/pg_hba.conf
host replication postgres 192.168.2.0/24 trust
注意,我這樣是允許192.168.2.0/24這個網段的主機都可以連接到本台服務器。
如果你想指定某個特定用戶,用xxx.xxx.xxx.xxx/32即可。
2 啟動主數據庫
輸入以下命令啟動數據庫:
pg_ctl -D /file1/database/data -l logfile start
輸入命令后應該會顯示以下消息:
我們測試下數據庫是否啟動成功:
psql -d postgres
如下圖所示
說明數據庫成功啟動!
3 數據備份
數據備份的話有兩種方法,一種是停庫備份,即先讓數據庫進入備份模式再將數據庫目錄復制過去,另外一種是使用pg_basebackup命令,不用進入備份模式。
3.1 基礎備份方式
進入psql命令行,執行:
postgres=# select pg_start_backup('databackup',true);
使用這個命令后,所有請求在寫日志之后不會再刷新到磁盤。直到執行pg_stop_backup()這個函數。
這個時候就把主數據庫上的data目錄拷貝到從數據庫上吧。
你可以直接拷貝過去,也可以使用scp命令:
scp -r /home/postgres/data postgres@192.168.2.128:/file1/database/
這里輸入192.168.2.128上的postgres用戶的密碼。
拷貝過去后,例如拷貝到/file1/database/data目錄,那么在從庫的data目錄下,修改postgresql.conf文件:
port = 54321 #改成你想要的端口,不一定要和主庫一樣
hot_standby = on #
同時,在從庫的目錄下增加一個recovery.conf文件,這個文件的模板可以在從庫服務器的postgresql的安裝目錄下找到。修改recovery.conf文件:
standby_mode = on
primary_conninfo = 'host=192.168.2.130(就是主數據庫的IP) port=54321(主數據庫監聽端口) user=postgres(登錄用戶)'
括號里的東西只是提示,不要真的寫進文件哦~
最后,要刪除從庫目錄下的postmaster.pid文件:
rm -f postmaster.pid
然后切換回主數據庫,在psql命令行輸入:
postgres=# select pg_stop_backup();
退出備份模式。
是不是感覺很麻煩,所以我推薦下面這種方法。
3.2 使用pg_basebackup命令備份
pg_basebackup命令是postgresql 9.x之后才有的命令,具體命令的語法和各個參數的意義見用戶手冊
在從數據庫上的數據庫目錄(/file1/database/data)下使用pg_basebackup命令備份:
pg_basebackup -h 192.168.2.130 -U postgres -F p -P -x -R -D /file1/database/data -l backup20161021
拷貝完畢后,修改從庫的postgresql.conf文件:
port = 54321 #改成你想要的端口,不一定要和主庫一樣
hot_standby = on #
因為在pg_basebackup命令中使用了-R參數,所以生成了recovery.conf文件,不需要我們再制作了。
這就OK了。
4 啟動從數據庫
在從庫上使用pg_ctl 命令:
pg_ctl -D /file1/data -l logfile start
這樣環境就搭好了。
這里演示的是一台主數據庫,一台從數據庫的hot standby的環境搭建。你要搭建多個從服務器的話操作也是類似,這里不再贅述。
5 要注意的問題(坑)
5.1 環境變量
環境變量要設置好,例如:
PGPORT(數據庫的監聽端口)
PATH(可執行文件的路徑)
LD_LIBRARY_PATH(鏈接庫的路徑)
PGDATA(數據庫文件路徑)
不設置好的話,可能會報一些奇怪的錯誤。
2016.11.14補充:請記得數據庫文件夾的訪問權限必須是700,否則服務無法啟動!
5.2 參數設置
這里主要是指postgresql.conf文件和pg_hba.conf文件。這里面設置了postgresql里面大多數重要的參數。
一般在修改后要重啟數據庫或者reload下配置文件:
pg_ctl reload
5.3 操作順序
還是建議嚴格按照操作順序進行環境的搭建,尤其是在數據備份操作時尤其要小心,否則會導致很多“奇怪”的錯誤,尤其是WAL日志和archive的錯誤,這也是樓主走過的坑,希望大家不要再趟。還有最好使用腳本來進行操作,避免在大量重復的操作中出錯,這里也引用一篇相關文章好了:
PostgreSQL系統級冷備份和archive備份(shell文件)
6 展望
本次簡單的搭建了postgresql的異步流復制hot standby的環境,實際還有同步流復制,主備份切換等,這個留在后面的博客里面再寫吧。