天天看點

PostgresSQL 主從搭建

由于工作需要,最近開始接觸各種資料庫,并嘗試各種資料庫産品的高可用方案。

今天分享的是postgresSQL的主從配置,其實還是蠻簡單的,跟随本文的步驟,保證能實作PG主從的搭建。

1. 安裝環境

1

2

3

4

<code>192.168.0.136 主庫</code>

<code>192.168.0.160 從庫</code>

<code>PORT: 5432</code>

<code>USR: postgres</code>

2. 主庫已經運作一段時間,檢查主庫的version,保證主從資料庫的version相同。

5

6

7

<code># psql </code><code>--version</code>

<code>psql (PostgreSQL) 9.4.11</code>

<code># rpm -qa|grep postgres</code>

<code>postgresql94-libs-9.4.11-1PGDG.rhel6.x86_64</code>

<code>postgresql94-server-9.4.11-1PGDG.rhel6.x86_64</code>

<code>postgresql94-9.4.11-1PGDG.rhel6.x86_64</code>

3. 在從庫上安裝相同版本的軟體

檢查安裝情況,已經安裝和primary相同的軟體版本

4. 查詢主庫的資料庫位置

8

9

10

<code># su - postgres</code>

<code>$  echo $PGDATA</code>

<code>/var/lib/pgsql/9.4/data</code>

<code>$ cd /var/lib/pgsql/9.4/data</code>

<code>$ ls</code>

<code>base    pg_clog      pg_hba.conf    pg_log      pg_multixact </code>

<code>pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION  </code>

<code>postgresql.auto.conf  postmaster.opts </code><code>global</code>  <code>pg_dynshmem  pg_ident.conf  </code>

<code> </code><code>pg_logical  pg_notify     pg_serial    pg_stat       pg_subtrans  </code>

<code> </code><code>pg_twophase  pg_xlog     postgresql.conf       postmaster.pid</code>

确認配置檔案位置

<code>postgres=# show config_file;</code>

<code>  </code><code>config_file               </code>

<code>-----------------------------------------</code>

<code> </code><code>/var/lib/pgsql/9.4/data/postgresql.conf</code>

檢視資料檔案目錄

<code>postgres=# show data_directory;</code>

<code>     </code><code>data_directory      </code>

<code>-------------------------</code>

<code> </code><code>/var/lib/pgsql/9.4/data</code>

5. 準備修改主庫的參數檔案,先查詢一下pg_hba.conf已有的參數内容

<code>$ cat pg_hba.conf|grep -v </code><code>'^#'</code>

<code>local</code>   <code>all</code>             <code>all</code>                                     <code>peer</code>

<code>host    </code><code>all</code>             <code>all</code>             <code>0.0.0.0/0            trust</code>

<code>host    </code><code>all</code>             <code>all</code>             <code>::1/128             ident</code>

6. 在主庫的pg_hba.conf中添加

<code>$ more pg_hba.conf</code>

<code>host    replication     replica     192.168.0.160                 md5</code>

這樣,就設定了replica這個使用者可以從192.168.0.160 對應的網段進行流複制請求。

7. 在主庫給postgres設定密碼,登入和備份權限。

<code>$psql</code>

<code>postgres# </code><code>CREATE</code> <code>ROLE replica login replication encrypted </code><code>password</code> <code>'replica123'</code>

8. 修改postgresql.conf,注意設定下下面幾個地方:

<code>wal_level = hot_standby       # 這個是設定主為wal的主機</code>

<code>max_wal_senders = 10           # 這個設定了可以最多有幾個流複制連接配接,差不多有幾個從,就設定幾個</code>

<code>wal_keep_segments = 256        # 設定流複制保留的最多的xlog數目</code>

<code>wal_sender_timeout = 60s       # 設定流複制主機發送資料的逾時時間</code>

<code>max_connections = 100           # 這個設定要注意下,從庫的max_connections必須要大于主庫的</code>

<code>archive_mode = </code><code>on</code>

<code>archive_command = </code><code>'cp %p /var/lib/pgsql/9.4/archive/%f'</code>

9. 建立對應archive log存放路徑

<code>mkdir -p /var/lib/pgsql/9.4/archive/</code>

10. 重新開機主庫,讓配置生效

<code># service postgresql-9.4 start</code>

<code>Starting postgresql-9.6 service:                           [  OK  ]</code>

11. 在從庫遠端連接配接主資料庫,驗證replica使用者是否可以正常通路

<code> </code><code>psql -h IP-address -p 5432 dbname usename  </code>

<code> </code><code>psql -h 192.168.0.136 -p 5432 postgres replica</code>

12. 然後在主庫做一次基礎備份(後面的Hot-standby主要使用data目錄下檔案):

<code>postgres=# </code><code>SELECT</code> <code>pg_start_backup(</code><code>'bak20170905'</code><code>);</code>

<code>$tar czvf /var/lib/pgsql/9.4/backups/backup_data.tar.gz.20170905 /var/lib/pgsql/9.4/data</code>

<code>postgres=# </code><code>SELECT</code> <code>pg_stop_backup();</code>

13. 将備份檔案sftp到從庫,并解壓,替換原有的data目錄

<code>cd  /var/lib/pgsql/9.4/</code>

<code>mv data data_bk</code>

<code>mv backup_data.tar.gz.20170905 backup_data.tar.gz</code>

<code>tar -xzvf backup_data.tar.gz</code>

14. 删除一些就的身份資訊,歸檔日志檔案等

<code>rm -rf data/pg_xlog/</code>

<code>mkdir -p data/pg_xlog/archive_status</code>

<code>rm data/postmaster.pid</code>

15. 查找并拷貝recovery.conf.sample檔案到data目錄下

<code>find / -</code><code>name</code> <code>recovery.conf.sample</code>

<code>/root/postgresql/postgresql-9.2.20/src/backend/access/transam/recovery.conf.sample </code>

<code>/usr/pgsql-9.4/share/recovery.conf.sample</code>

<code>複制</code>

<code>cp /usr/pgsql-9.4/share/recovery.conf.sample /var/lib/pgsql/9.4/data/recovery.conf</code>

16. 然後編輯recovery.conf:

<code>standby_mode = </code><code>on</code>

<code>restore_command = </code><code>'cp /var/lib/pgsql/9.4/archive/%f %p'</code>   <code>#這個參數,我還需要确認具體含義</code>

<code>primary_conninfo = </code><code>'host=192.168.0.136 port=5432 user=replica password=replica123'</code>                      <code># 主伺服器的資訊以及連接配接的使用者,這條資訊最重要</code>

<code>recovery_target_timeline = </code><code>'latest'</code>

17. 拷貝下面配置檔案

<code>cp  /var/lib/pgsql/9.4/data.bk/postgresql.conf  /var/lib/pgsql/9.4/data/postgresql.conf</code>

<code>cp  /var/lib/pgsql/9.4/data.bk/pg_hba.conf  /var/lib/pgsql/9.4/data/pg_hba.conf</code>

18. 然後編輯pstgresql.conf:

<code>hot_standby = </code><code>on</code>

19. 啟動Hot-Standby:

<code>/usr/pgsql-9.4/bin/postmaster -D /var/lib/pgsql/9.4/data </code><code>--port=5432</code>

20. 驗證是否部署成功

在主節點上執行,驗證已經成功搭建,說明5.160是從伺服器,在接收流,而且是異步流複制。

<code>postgres=# </code><code>select</code> <code>client_addr,sync_state </code><code>from</code> <code>pg_stat_replication;</code>

<code> </code><code>client_addr | sync_state </code>

<code>-------------+------------</code>

<code> </code><code>192.168.0.160 | async</code>

21. 查詢更多資料同步資訊:

<code>postgres=# </code><code>select</code> <code>usename,application_name,client_addr,client_port,backend_start,backend_xmin,state,sent_location,write_location,flush_location,replay_location,sync_priority,sync_state  </code><code>from</code> <code>pg_stat_replication;</code>

<code> </code><code>usename | application_name | client_addr | client_port |         backend_start         | backend_xmin |   state   | sent_location | write_location | flush_location | replay_location | sync_priority | sync_state </code>

<code>---------+------------------+-------------+-------------+-------------------------------+--------------+-----------+---------------+----------------+----------------+-----------------+---------------+------------</code>

<code> </code><code>replica | walreceiver      | 192.168.0.160 |       39375 | 2017-09-05 17:49:22.512393+08 |              | streaming |         5/1049488     | 5/1049488        | 5/1049488      |   5/1049488       |             0 |          async</code>

22. 此外,還可以分别在主、從節點上運作 ps aux | grep postgres 來檢視程序:

主伺服器上,可以看到有一個 wal sender 程序,還有archiver程序等

<code># ps aux | grep postgres</code>

<code>postgres  1104  0.0  0.1 324652 15120 ?        S    14:26   0:00 /usr/pgsql-9.4/bin/postmaster -D /var/lib/pgsql/9.4/data                      </code>

<code>postgres  1111  0.0  0.0 324652  5844 ?        Ss   14:26   0:00 postgres: wal writer process                              </code>

<code>postgres  1113  0.0  0.0 179796  1544 ?        Ss   14:26   0:00 postgres: archiver process   </code><code>last</code> <code>was 000000010000000500000000.00000060.backup</code>

<code>postgres  8515  0.0  0.0 325448  3108 ?        Ss   17:49   0:00 postgres: wal sender process replica 192.168.0.160(39375) streaming 5/103A1D0</code>

從伺服器上,可以看到 wal receiver 程序,和recovering程序正在恢複archive log

<code>$ ps aux | grep postgres</code>

<code>postgres 11508  0.0  0.1 324684 15128 ?        S    17:49   0:00 /usr/pgsql-9.4/bin/postmaster -D /var/lib/pgsql/9.4/data</code>

<code>postgres 11510  0.0  0.0 324796  4336 ?        Ss   17:49   0:00 postgres: startup process   recovering 000000010000000500000001</code>

<code>postgres 11513  0.0  0.0 331892  3700 ?        Ss   17:49   0:00 postgres: wal receiver process   streaming 5/103A1D0</code>

23. 可以在下面路徑中,看到從庫接收的archive log檔案

<code># pwd</code>

<code>/var/lib/pgsql/9.4/data/pg_xlog</code>

<code># ls</code>

<code>000000010000000500000001  000000010000000500000002  archive_status</code>

至此,PostgreSQL主從流複制安裝部署完成。

在主伺服器上插入資料或删除資料,在從伺服器上能看到相應的變化。從伺服器上隻能查詢,不能插入或删除資料。

24. 第12、13、14步驟,可以通過另一種拷貝主庫到從庫的方法,pg_basebackup指令拷貝檔案

<code>pg_basebackup -F p </code><code>--progress -D /var/lib/pgsql/9.4/data2 -h 192.168.0.136 -p 5432 -U replica --password</code>

進入到/var/lib/pgsql/9.4/data2目錄,修改recovery.conf,這個檔案可以從pg的安裝目錄的share檔案夾中擷取,比如

<code>cp /usr/pgsql-9.6/share/recovery.conf.sample /var/lib/pgsql/9.6/data2/recovery.conf</code>

確定檔案夾權限是700,這個很關鍵,其他權限,不能正常啟動

<code>$ chmod 0700 /var/lib/pgsql/9.6/data2</code>

使用下面指令啟動standby

<code>$ /usr/pgsql-9.6/bin/postmaster -D /var/lib/pgsql/9.6/data2</code>

<code></code>

本文轉自 hsbxxl 51CTO部落格,原文連結:http://blog.51cto.com/hsbxxl/1963039,如需轉載請自行聯系原作者