PostgreSQL主備環(huán)境搭建
記得在2年前寫(xiě)過(guò)一篇PostgreSQL的文章,當(dāng)時(shí)處于興趣,本來(lái)想在工作中接一下PG的業(yè)務(wù),***因?yàn)楦鞣N各樣的原因就擱置了。
今天整理了下PostgreSQL的一些基礎(chǔ)內(nèi)容,參考的書(shū)是唐成老師的那本《PostgreSQL修煉之道》,有了Oracle和MySQL的基礎(chǔ),看起來(lái)會(huì)比從零開(kāi)始要容易一些,總體的感覺(jué),PG功能確實(shí)很多很全,功能上像Oracle看齊,技術(shù)風(fēng)格和MySQL很像,在做一些總結(jié)的時(shí)候,不停的在兩個(gè)數(shù)據(jù)庫(kù)之間來(lái)回切換。
關(guān)于主備環(huán)境的搭建,我使用的基于流復(fù)制的方式搭建,這是在PG 9.0之后提供的對(duì)WAL傳遞日志的方法,是基于物理復(fù)制,在9.4開(kāi)始有了邏輯解碼,而細(xì)粒度的邏輯復(fù)制在PG 10中會(huì)有較大的改進(jìn)。
1.安裝部署數(shù)據(jù)庫(kù)軟件
安裝部署還是得啰嗦幾句,使用的是9.5版本的源碼安裝,源碼包很小,就幾十兆。
1)解壓
- tar -zxvf postgresql-9.5.0.tar.gz
2)切換到解壓目錄,嘗試編譯準(zhǔn)備
- cd postgresql-9.5.0
- ./configure -prefix /usr/local/pgsql
這個(gè)過(guò)程很可能有問(wèn)題,比如下面的錯(cuò)誤。
- 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.
類似的錯(cuò)誤還有readline,實(shí)際的情況zlib包和readline包都是有的。
這里需要注意一點(diǎn):
redhat 系列下這個(gè)軟件包叫 readline-devel ubuntu 下叫readline-dev 細(xì)分又分為libreadline5-dev 和 libreadline6-dev
所以我們需要安裝的是readline-devel和zlib-devel的包即可搞定,而不要只是懷疑,然后把--without-zlib選項(xiàng)給啟用了。
接下來(lái)的步驟就簡(jiǎn)單了。
3)開(kāi)始編譯安裝
這兩個(gè)過(guò)程耗時(shí)相對(duì)會(huì)多一些,大概幾分鐘吧,比MySQL的源碼編譯要快很多。
- make
- make install
4)創(chuàng)建用戶和組
- 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
至此,數(shù)據(jù)庫(kù)軟件部署就搞定了,在這里我們只做了功能,還沒(méi)有涉及性能層面的調(diào)整和優(yōu)化。
2.配置主庫(kù)
使用的環(huán)境是兩臺(tái)服務(wù)器
192.168.179.128 主庫(kù)
192.168.253.134 備庫(kù)
1)創(chuàng)建一個(gè)復(fù)制角色
CREATE ROLE replica login replication encrypted password 'replica';
2)配置訪問(wèn)權(quán)限文件gp_hba.conf
添加一條記錄,使得備庫(kù)可以訪問(wèn),修改后需要重啟
- host replication replica 192.168.253.134/24 trust
因?yàn)槭强缇W(wǎng)段,我額外補(bǔ)充了一條網(wǎng)關(guān)的記錄
- host replication replica 192.168.179.1/24 trust
3)修改參數(shù)配置文件postgresql.conf
修改如下的幾個(gè)參數(shù)設(shè)置,端口還是保留默認(rèn)的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.配置備庫(kù)
備庫(kù)需要同樣的步驟來(lái)部署數(shù)據(jù)庫(kù)軟件,參考***部分即可。
這個(gè)時(shí)候備庫(kù)上還沒(méi)有初始化數(shù)據(jù),我們模擬客戶端的方式來(lái)訪問(wèn),可能會(huì)有如下的錯(cuò)誤。
- $ 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還原數(shù)據(jù)
先不必?fù)?dān)心,我們可以使用pg_basebackup或者命令行的方式來(lái)做備份恢復(fù)
- $ 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)配置恢復(fù)配置recovery.conf
這個(gè)步驟是關(guān)鍵,和Oracle里面的歸檔參數(shù)或者和MySQL里的change master的設(shè)置類似。
recovery.conf文件可以從模板里拿到:
- cp /usr/local/pgsql/share/recovery.conf.sample /data/pgsql9.5/recovery.conf
recovery.conf文件的內(nèi)容改動(dòng)參考如下:
- 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)修改參數(shù)文件postgresql.conf的配置
postgresql.conf文件的內(nèi)容修改如下,配置和主庫(kù)差別較大,需要注意。
- 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)啟動(dòng)PG備庫(kù)
- $ /usr/local/pgsql/bin/pg_ctl -D /data/pgsql9.5 -l logfile start
5)查看復(fù)制狀態(tài)
可以在主庫(kù)端查看復(fù)制狀態(tài),參考pg_stat_replication視圖,在查看的過(guò)程中,這個(gè)視圖字段較大,看起來(lái)會(huì)有些亂,我們可以使用類似MySQL \G的方式來(lái)查看,即\x的擴(kuò)展模式。
- 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