PostgreSQL主備環境搭建
記得在2年前寫過一篇PostgreSQL的文章,當時處于興趣,本來想在工作中接一下PG的業務,***因為各種各樣的原因就擱置了。
今天整理了下PostgreSQL的一些基礎內容,參考的書是唐成老師的那本《PostgreSQL修煉之道》,有了Oracle和MySQL的基礎,看起來會比從零開始要容易一些,總體的感覺,PG功能確實很多很全,功能上像Oracle看齊,技術風格和MySQL很像,在做一些總結的時候,不停的在兩個數據庫之間來回切換。
關于主備環境的搭建,我使用的基于流復制的方式搭建,這是在PG 9.0之后提供的對WAL傳遞日志的方法,是基于物理復制,在9.4開始有了邏輯解碼,而細粒度的邏輯復制在PG 10中會有較大的改進。
1.安裝部署數據庫軟件
安裝部署還是得啰嗦幾句,使用的是9.5版本的源碼安裝,源碼包很小,就幾十兆。
1)解壓
- tar -zxvf postgresql-9.5.0.tar.gz
2)切換到解壓目錄,嘗試編譯準備
- cd postgresql-9.5.0
- ./configure -prefix /usr/local/pgsql
這個過程很可能有問題,比如下面的錯誤。
- configure: error: zlib library not found
- If you have zlib already installed, see config.log for details on the
- failure. It is possible the compiler isn't looking in the proper directory.
- Use --without-zlib to disable zlib support.
類似的錯誤還有readline,實際的情況zlib包和readline包都是有的。
這里需要注意一點:
redhat 系列下這個軟件包叫 readline-devel ubuntu 下叫readline-dev 細分又分為libreadline5-dev 和 libreadline6-dev
所以我們需要安裝的是readline-devel和zlib-devel的包即可搞定,而不要只是懷疑,然后把--without-zlib選項給啟用了。
接下來的步驟就簡單了。
3)開始編譯安裝
這兩個過程耗時相對會多一些,大概幾分鐘吧,比MySQL的源碼編譯要快很多。
- make
- make install
4)創建用戶和組
- useradd postgres
- mkdir -p /data/pgsql9.5
- chown -R postgres:postgres /data/pgsql9.5
- su - postgres
5)初始化部署
- /usr/local/pgsql/bin/initdb -D /data/pgsql9.5
至此,數據庫軟件部署就搞定了,在這里我們只做了功能,還沒有涉及性能層面的調整和優化。
2.配置主庫
使用的環境是兩臺服務器
192.168.179.128 主庫
192.168.253.134 備庫
1)創建一個復制角色
CREATE ROLE replica login replication encrypted password 'replica';
2)配置訪問權限文件gp_hba.conf
添加一條記錄,使得備庫可以訪問,修改后需要重啟
- host replication replica 192.168.253.134/24 trust
因為是跨網段,我額外補充了一條網關的記錄
- host replication replica 192.168.179.1/24 trust
3)修改參數配置文件postgresql.conf
修改如下的幾個參數設置,端口還是保留默認的5432
- listen_addresses = '*"
- port = 5432
- wal_level = hot_standby
- max_wal_senders = 2
- wal_keep_segments = 32
- wal_sender_timeout =60s
- max_connections =100
這些步驟完成后,切記要重啟一下PG使得配置生效
4)重啟PG
- $ /usr/local/pgsql/bin/pg_ctl -D /data/pgsql9.5 -l logfile restart
3.配置備庫
備庫需要同樣的步驟來部署數據庫軟件,參考***部分即可。
這個時候備庫上還沒有初始化數據,我們模擬客戶端的方式來訪問,可能會有如下的錯誤。
- $ psql -Ureplica -h192.168.179.128 -p5432 --password
- Password for user replica:
- psql: FATAL: no pg_hba.conf entry for host "192.168.179.1", user "replica", database "replica"
1)使用pg_basebackup還原數據
先不必擔心,我們可以使用pg_basebackup或者命令行的方式來做備份恢復
- $ pg_basebackup -F p --progress -D /data/pgsql9.5 -h 192.168.179.128 -p 5432 -U replica --password
- Password:
- 22484/22484 kB (100%), 1/1 tablespace
- NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
2)配置恢復配置recovery.conf
這個步驟是關鍵,和Oracle里面的歸檔參數或者和MySQL里的change master的設置類似。
recovery.conf文件可以從模板里拿到:
- cp /usr/local/pgsql/share/recovery.conf.sample /data/pgsql9.5/recovery.conf
recovery.conf文件的內容改動參考如下:
- standby_mode = on
- primary_conninfo = 'host=192.168.179.128 port=5432 user=replica password=replica'
- recovery_target_timeline = 'latest'
- trigger_file = '/data/pgsql9.5/trigger_activestb'
3)修改參數文件postgresql.conf的配置
postgresql.conf文件的內容修改如下,配置和主庫差別較大,需要注意。
- listen_addresses = '*'
- port = 5432
- wal_level = minimal
- max_wal_senders = 0
- wal_keep_segments = 0
- max_connections = 1000
- synchronous_commit = off
- synchronous_standby_names = ''
- hot_standby = on
- max_standby_streaming_delay = 30
- wal_receiver_status_interval = 1s
- hot_standby_feedback = on
4)啟動PG備庫
- $ /usr/local/pgsql/bin/pg_ctl -D /data/pgsql9.5 -l logfile start
5)查看復制狀態
可以在主庫端查看復制狀態,參考pg_stat_replication視圖,在查看的過程中,這個視圖字段較大,看起來會有些亂,我們可以使用類似MySQL \G的方式來查看,即\x的擴展模式。
- postgres=# \x
- Expanded display is on.
- postgres=# select * from pg_stat_replication;
- -[ RECORD 1 ]----+------------------------------
- pid | 20539
- usesysid | 16384
- usename | replica
- application_name | walreceiver
- client_addr | 192.168.179.1
- client_hostname |
- client_port | 49374
- backend_start | 2018-03-25 05:19:15.215181+08
- backend_xmin | 1756
- state | streaming
- sent_location | 0/302F600
- write_location | 0/302F600
- flush_location | 0/302F600
- replay_location | 0/302F600
- sync_priority | 0
- sync_state | async