以前的文章中咱們談論了單機PostgreSQL實例的部署,有人可能會說這不是生產級別的配置,由於沒有任何高可用機制呀。那麼本篇文章,咱們來談談如何配置高可用流複製。sql
PostgreSQL一直以來不支持複製,複製經過Pgpool、Slony等外部工具來實現。由於這些解決方案並非開箱即用的,因此大部分方案的實現都須要進行復雜的配置。因爲這個缺點,致使不少人轉向已經提供複製功能好久的MySQL。工具
從PostgreSQL9.0開始,PostgreSQL自身完善了複製功能 - 主從之間的WAL流複製。下面讓咱們來一塊兒看一下如何給一個PostgreSQL主節點增長一個從節點。post
這裏咱們須要有兩臺PostgreSQL主機。例子中,主節點IP爲10.0.0.101,從節點IP爲10.0.0.102。咱們假設10.0.0.101和10.0.0.102上的PostgreSQL已經運行,下面咱們將102配置添加爲101的從節點。postgresql
首先咱們須要建立一個用於複製的用戶。在主節點咱們運行如下命令:code
postgres=# CREATE ROLE repl WITH REPLICATION PASSWORD 'password' LOGIN; CREATE ROLE
接下來,須要修改主節點的pg_hba.conf文件並重載PostgreSQL,以開放訪問:blog
host replication repl 10.0.0.102/32 md5 service postgresql reload
咱們也能夠在從節點的pg_hba.conf文件上添加一條主節點的相似信息,由於在將來的某一刻,從節點會提高爲主節點:md5
host replication repl 10.0.0.101/32 md5
接下來,咱們須要對主節點和從節點的postgresql.conf文件進行部分配置。其中一些配置是當主節點切換爲從節點時才能用到的,咱們在這裏提早配置好。部署
接下來須要將主節點的數據轉移到從節點。要完成該操做,咱們使用pg_basebackup工具,在這以前咱們須要先將從節點的數據目錄內容刪除:it
rm -rf /var/lib/postgresql/9.4/main/*
上面命令執行完後,咱們能夠在從節點上執行如下pg_basebackup命令:io
pg_basebackup --xlog-method=stream -D /var/lib/postgresql/9.4/main/ -U repl -h 10.0.0.101
上面命令完成後,能夠看到在從節點的數據目錄下面出現不少新的數據文件。下面還有一些事情要作,咱們須要建立一個recovery.conf文件來讓從節點能夠連接到主節點。配置信息以下:
standby_mode = 'on' primary_conninfo = 'host=10.0.0.101 port=5432 user=repl password=password' trigger_file = '/tmp/failover.trigger'
最後,咱們須要確認一下數據目錄的權限是否配置正確。若是沒問題,下面能夠啓動從節點了:
chmod -R g-rwx,o-rwx /var/lib/postgresql/9.4/main/ ; chown -R postgres.postgres /var/lib/postgresql/9.4/main/ service postgresql start
從下面的信息,咱們能夠確認主從複製已經配置完畢:
$ psql psql (9.4.8) Type "help" for help. postgres=# select client_addr, state, sent_location, write_location, postgres-# flush_location, replay_location from pg_stat_replication; client_addr | state | sent_location | write_location | flush_location | replay_location -------------+-----------+---------------+----------------+----------------+----------------- 10.0.0.102 | streaming | 0/130011E0 | 0/130011E0 | 0/130011E0 | 0/130011E0 (1 row)
正如咱們所見,PostgreSQL的主從複製配置並不複雜。一主多從的機制能夠爲生產環境提供更好的保障。