MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2016年3月10日 星期四

Streaming Replication 筆記

串流複寫( Streaming Replication )是 PostgreSQL 的資料複寫( Replication )的功能。這功能是用來備份資料到別台機器上,並且在主要資料庫所在的主機發生異常時,利用備份機頂替主要資料庫。

由於 PostgreSQL 的交易日誌設計是和所運行的作業系統及硬體架構有關,所以要進行 Streaming Replication 規劃時,必須要兩端的作業系統一致(如:Linux 對 Linux、Windows 對 Windows);以及硬體架構也要一致才行(例如:32 位元和 64 位元之間就不能用 Streaming Replication) 。

要作實際演練的話,有兩種簡單的環境設置可以選擇:
1. 在同一台機器上開兩個 PostgreSQL instance,兩個 instance 之間進行備份;
2. 或是開兩台虛擬機器( VM ),兩個 VM 間進行備份。
這兩者的操作流程是一樣的。

[20191205 Update] 已經針對 PostgreSQL 12 重新演練一次了~



這次我演練的方式,是選在同一個作業系統上面跑兩個 PostgreSQL instance:ㄧ個提供主要的資料庫服務,稱為 primary;一個作為備份用資料庫,叫做 standby。

我的相關環境設定如下:
OS: Linux x86-64
PostgreSQL:ver. 9.5
[primary instance]
   IP: localhost
   Port: 5432
   Process owner: postgres
   Cluster folder 位置:/var/lib/pgsql/9.5/data/

[standby instance]
   IP: localhost
   Port: 5433
   Process owner: aaa
   Cluster folder 位置:/home/aaa/pgsql/9.5/data/

要注意的是,在同一台主機上跑多個 PostgreSQL instance,建議要將 port 設定到不同的值,以免發生呼相衝突的問題。

Streaming Replication 設定過程分成兩大步驟,為分別在 primary 與 standby 個別進行設定:


在 primary 資料庫上,要設定的的有:
  1) 建立用來作備份的帳戶
  2) 兩個設定檔:postgresql.conf、pg_hba.conf
  3) 重新啟動這個 PostgreSQL instance

而在 standby 資料庫上,要設定的的有:
  1) 從 primary 資料庫拷貝一份 primary 資料庫的內容
  2) 兩個設定檔:postgresql.conf、recovery.conf
  3) 啟動這個 PostgreSQL instance。大功告成!


接著下面就是個別設定的流程:

[primary]
(1) 使用 psql 進入 primary instance PostgreSQL,在 PostgreSQL 內先建立專門進行複寫的帳戶

[postgres]$ psql -p 5432 postgres

psql (9.5.1)
Type "help" for help.

postgres=# CREATE ROLE strmrepl
postgres=# WITH REPLICATION
postgres=# PASSWORD 'strmrepl'
postgres=# LOGIN;

在這裡建立了一個有 REPLICATION 權限的帳戶 strmrepl,備份機會透過這個帳戶進來抓交易日誌檔。

(2) 設定 pg_hba.conf,允許 strmrepl 這個帳戶能允許備份機登入進來

host  replication  strmrepl  127.0.0.1/32  trust


(3) 設定 postgresql.conf 有關的內容

listen_addresses = "*"
port = 5432
wal_level = hot_standby
max_wal_senders = 3      # 一次最多丟多少量的交易日誌
wal_keep_segment = 5     # 一次最多保留多少交易日誌


(4) 重新啟動 primary instance

[postgres]$ pg_ctl -D /var/lib/pgsql/9.5/data/ -l logfile restart

primary 設定到此完成。

接著是 standby:

[standby]
(1) 先使用 pg_basebackup 指令,拷貝一份 primary 資料庫到目標資料位置

[aaa]$ /usr/lib64/postgresql/9.5/bin/pg_basebackup -h 127.0.0.1 -p 5432 -D /home/aaa/pgsql/9.5/data/ -U strmrepl -v -P

值得注意的是,pg_basebackup 這個工具預設不會放到系統 $PATH 變數所在的地方,要去系統上找一下這個程式的絕對路徑來執行。

(2) 設定 postgresql.conf 內容

listen_addresses = "*"
port = 5433
wal_level = hot_standby
hot_standby = on


(3) 新增 recovery.conf

standby_mode = 'on'
primary_conninfo = 'host=127.0.0.1 port=5432 user=strmrepl'
trigger_file = '/tmp/pg_failover.trigger'

     如果發生 primary 的交易日誌進行太快,使的 standby 跟不上的話,就需要將 primary 設定進行 WAL archiving 的備份,讓 standby 能夠使用 recovery.conf 內的 restore_command 選項,讓 standby 能利用 WAL archive 補足沒跟上的交易。

trigger_file 的選項是用來讓 standby 能夠在指定的檔案產生時,便切換成為 primary 繼續工作。

有關 recovery.conf 設定檔的內容,能夠在
/usr/share/postgresql-9.5/recovery.conf.sample 
找到各選項的設定與解說。

(4) 啟動備份資料庫

[aaa]$ pg_ctl -D /home/aaa/pgsql/9.5/data/ -l logfile start

這樣一來,streaming replication 就完工了。

接著就是登入檢視狀況了。在 PostgreSQL 中,有提供幾個能夠檢視 streaming replication 情況的相關系統函數與 view。

在 primary instance 上,有 pg_stat_replication 這個 view 以及 pg_current_xlog_location() 這個函數可供查閱:

[postgres] # SELECT usename, client_addr, state, sent_location
postgres-# FROM pg_stat_replication;
 usename  | client_addr |   state   | sent_location
----------+-------------+-----------+---------------
 strmrepl | 127.0.0.1   | streaming | 0/30004C0
(1 row)

[postgres] # SELECT pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 0/30003E0
(1 row)

在 standby instance 上,則是使用 pg_is_in_recovery()、pg_last_xlog_replay_location() 以及 pg_last_xlog_receive_location() 三個函數查詢:

[postgres] # SELECT pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)

[postgres] # select pg_last_xlog_replay_location();
 pg_last_xlog_replay_location 
------------------------------
 0/30003E0
(1 row)

[postgres] # select pg_last_xlog_receive_location();
 pg_last_xlog_receive_location 
-------------------------------
 0/30003E0
(1 row)


觀察上述指令,primary 上的 pg_current_xlog_location() 即為當前交易日誌位置;standby 上的 pg_last_xlog_replay_location() 則為已經同步的交易日誌位置。比較兩者是否一致就能得知 streaming replication 的狀況:兩者相同則表示目前已經同步,不一致就表示複寫還沒有跟上。


參考資料:
Difference between Warm, hot standby and Streaming Replication

New Replication and Recovery Features in PostgreSQL 9.1 by Vibhor Kumar

How To Set Up Master Slave Replication on PostgreSQL on an Ubuntu 12.04 VPS

Streaming Replication - PostgreSQL wiki 

How To Set Up Master Slave Replication on PostgreSQL on an Ubuntu 12.04 VPS | DigitalOcean

Switchover/Switchback in PostgreSQL 9.3 By Vibhor Kumar

How PostgreSQL's SR (Streaming Replication) works by Stavros Korokithakis

Relational Database Technologies: Implementing Switchover/Switchback in PostgreSQL 9.3.

Db research & testing: PostgreSQL 9.0: Physical Hot Standby & streaming replication

select * from depesz; » Blog Archive » Write Ahead Log + Understanding postgresql.conf: checkpoint_segments, checkpoint_timeout, checkpoint_warning


官網文件:
Chapter 25. High Availability, Load Balancing, and Replication - 25.5. Hot Standby

Chapter 29. Reliability and the Write-Ahead Log - 29.4. WAL Configuration

Binary Replication Tutorial - PostgreSQL wiki 

5 則留言:

  1. 感謝分享~
    wal_keep_segments = 5 # 一次最多保留多少交易日誌
    好像少了一個s喔

    回覆刪除
  2. 謝謝提醒~
    不過現在都建議不要直接改參數檔
    而是透過「Postgres 設定系統參數 (GUC) 的小小注意事項」這篇筆記提到的方式作設定(不好意思,請直接用部落格的搜尋框找這篇。。)
    這樣一來就不會有參數名稱錯誤造成的困擾了~

    回覆刪除
    回覆
    1. 喔喔!很方便~ 感謝分享!!

      刪除
  3. 回覆
    1. 您好:
      1) EDB*Loader (指令名稱叫做 edbldr)是 EDB 企業版的資料匯入功能~先說明一下
      2) 在 EDB Postgres Advance Server 11.5.12 測試(設置成 Streaming Replication)時,發現透過 EDB*Loader Direct Path Load 匯入的資料,是沒有被同步到 Standby DB 的,但是,磁碟空間在兩台 DB 上會佔據一樣多
      希望以上有回答到您的問題

      刪除