MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

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

2016年12月1日 星期四

EFM 2.1 版的 Active/Passive Switchover 切換功能

EnterpriseDB 的訂閱服務提供的資料庫高可用套件 — EDB Failover Manager(EFM),前一陣子(2016 年九月)釋出更新版,2.1 版。EFM 在先前的筆記已經有紀錄過 2.0 版的操作(之前筆記)。

在這次更新版中,引進一個重要的新功能 — 資料庫 Active/Passive Switchover 功能。這個功能,能夠將 Active 資料庫(Read-Write)/Pssive 資料庫(Read-Only)角色對調。

該功能在維護資料庫上,提供相當方便性:當有主機維護的需要,便可以依照需要,將 Master 資料庫與 Standby 資料庫對調,將 Standby 主機下線,處理完畢再上線便不會影響 Master 運作。

該功能支援 PostgreSQL 9.3 版本以上的資料庫:這是由於自此版本開始,在 recovery.conf 設定檔中,引進了 recovery_target_timeline 參數。該參數允許資料庫交易日誌的「timeline 接軌」的功能。(忘了 recovery.conf 是什麼?請參考之前 Point-in-Time Recovery 或 Streaming Replication 的筆記)



所謂 timeline,可以當成是 PostgreSQL 資料庫管理資料庫 Streaming Replication 同步的一個設計。在這個設計中,一個資料庫的交易活動有他的時間軸標記,這個標記表現在 WAL 交易日誌檔案名稱上,當我們開啟 pg_xlog/ 目錄,就可以看到許多 WAL 檔案。檔案名稱大多形同 00000001000000000000001E 。而紅色部份便是這個資料庫的 timeline。進行 Streaming Replication 的 Standby 資料庫,他會與 Master 資料庫的交易處在同一個時間軸上運作,也就是說,兩者會有一樣的 timeline。

當 Standby 資料庫進行 Promote 之後,它便會和 Primary 資料庫的同步「脫鉤」,成為獨立運作的資料庫。此時 Standby 資料庫的 timeline 會跳躍到下一個時間軸,與原先所跟隨的 Primary 資料庫交易日誌時間軸分支出來。延續上方例子,這時已經脫鉤的 Standby 資料庫,他的 WAL 就會形同 000000020000000000000023,與原先 Primary 資料庫的裡面最新的 WAL, 000000010000000000000022 兩者的 timeline 不再相同。

recovery_target_timeline 這個參數,便能夠把「舊的 Primary 資料庫」(帶有舊的 timeline 00000001),繼續接軌「新的 Primary 資料庫/原先的 Standby 資料庫」(帶有新的 timeline 00000002)進行同步,進而使「舊的 Primary 資料庫」成為一個「新的 Standby 資料庫」。

當然,這個「接軌」是有條件的:「舊的 Primary 資料庫」在 Promote 發生之後,「舊的 Primary 資料庫」便要停止他的活動,這樣一來,兩資料庫之間才不會有分歧問題,此時的 recovery_target_timeline 才能接軌。此外,WAL 裡面會有相關 Checksum 檢查,所以不會有辦法亂拿的資料庫 WAL 檔案就能夠餵進去資料庫~

如果「舊的 Primary 資料庫」有他的活動的話還有可能重新接軌嗎?這時候,我們就需要使用 pg_rewind 工具,將雙方差異重新比對之後,就可以再次接軌(注意,要使用 pg_rewind 工具, postgresql.conf 裡面參數要作相關設定才行!參考之前的筆記)。



以上簡單解釋完畢。接著開始進行操作示範。
因為 EFM 2.0 與 2.1 的設定上差異不大,所以在此延續先前 EFM 2.0 的操作筆記,示範如進行相關設置。此處我只將需要變更的部份示範出來

首先,要使用 Switchover 功能,在設置 Streaming Replication 時,Standby 資料庫的 recovery.conf 中要設置 recovery_target_timeline

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

在此 recovery_target_timeline 設置的值為 'latest',表示我們後續要「接軌」新的 timeline。

接著,EFM 2.1 版除了多一些管理 HA Cluster 架構的參數之外,其他的設置方式與 2.0 版是一樣的。
DB 上面的 /etc/efm-2.1/efm.properties
db.user=enterprisedb
db.password.encrypted=<encrypted_password>
db.port=5444
db.database=edb
db.service.owner=enterprisedb
db.service.name=ppas-9.5
db.bin=/opt/PostgresPlus/9.5AS/bin
db.recovery.conf.dir=/var/lib/ppas/9.5AS/data
user.email=<email_addr1> <email_addr2> <email_addr3>
bind.address=<ip_addr>:7800
admin.port=7801
is.witness=false
local.period=10
local.timeout=60
local.timeout.final=10
pingServerIp=8.8.8.8
virtualIp=
virtualIp.interface=
virtualIp.netmask=
script.fence=
script.post.promotion=
script.db.failure=

Witness 上面的 /etc/efm-2.1/efm.properties
db.user=enterprisedb
db.password.encrypted=<encrypted_password>
db.port=5444
db.database=edb
db.service.owner=enterprisedb
db.service.name=
db.bin=
db.recovery.conf.dir=
user.email=<email_addr1> <email_addr2> <email_addr3>
bind.address=<ip_addr>:7800
admin.port=7801
is.witness=true
local.period=10
local.timeout=60
local.timeout.final=10
pingServerIp=8.8.8.8
virtualIp=
virtualIp.interface=
virtualIp.netmask=
script.fence=
script.post.promotion=
script.db.failure=

啟動程序:

Primary DB
[root@edb1 ~]# service efm-2.1 start
[root@edb1 ~]# /usr/efm-2.1/bin/efm allow-node efm <edb2-ip>
[root@edb1 ~]# /usr/efm-2.1/bin/efm allow-node efm <efm_wit-ip>
這裡提醒一點,在 EFM 2.0 中,引介新的 Node 執行的叫做 efm add-node,在 EFM 2.1 則更動為 efm allow-node。

Standby DB
[root@edb2 ~]# echo "<edb1-bind-addr>" >> /etc/efm-2.1/efm.nodes
[root@edb2 ~]# service efm-2.1 start

HA Witness Node
[root@efm_wit ~]# echo "<edb1-bind-addr>" >> /etc/efm-2.1/efm.nodes
[root@efm_wit ~]# echo "<edb2-bind-addr>" >> /etc/efm-2.1/efm.nodes
[root@efm_wit ~]# service efm-2.1 start

等到 Streaming Replication 與 EFM 設置完畢之後,就來進行 Switchover 功能的驗證。
Switchover 功能,只要 Primary/Standby 都有在 Cluster 裡面便可以進行。


以下範例中,Primary 資料庫,edb1 的 IP 位址為10.146.0.3;Standby 資料庫,edb4 的 IP 位址為10.146.0.4


執行 Switchover 之前,我們觀察資料庫叢集狀態:
[root@edb1 ~]# /usr/efm-2.1/bin/efm cluster-status efm
Cluster Status: efm
VIP: 
        Agent Type  Address              Agent  DB       Info
        --------------------------------------------------------------
        Standby     10.146.0.4           UP     UP        
        Witness     10.146.0.5           UP     N/A       
        Master      10.146.0.3           UP     UP        
Allowed node host list:
        10.146.0.3 10.146.0.4 10.146.0.5
Membership coordinator: 10.146.0.3
Standby priority host list:
        10.146.0.4
Promote Status:
        DB Type     Address              XLog Loc         Info
        --------------------------------------------------------------
        Master      10.146.0.3           0/60001A8        
        Standby     10.146.0.4           0/60001A8        
        Standby database(s) in sync with master. It is safe to promote.

以上標記 Safe to promote 便能夠進行 Switchover 操作。

我們要執行 Switchover 可以下達下列指令:
[root@edb1 ~]# /usr/efm-2.1/bin/efm promote efm -switchover
Promote/switchover command accepted by local agent. Proceeding with promotion and will reconfigure original master. Run the 'cluster-status' command for information about the new cluster state.

接著馬上看資料庫叢集狀態:
[root@edb1 ~]# sudo /usr/efm-2.1/bin/efm cluster-status efm
Cluster Status: efm
VIP: 
        Agent Type  Address              Agent  DB       Info
        --------------------------------------------------------------
        Witness     10.146.0.5           UP     N/A       
        Standby     10.146.0.3           UP     UP        
        Master      10.146.0.4           UP     UP        
Allowed node host list:
        10.146.0.3 10.146.0.4 10.146.0.5
Membership coordinator: 10.146.0.3
Standby priority host list:
        10.146.0.3
Promote Status:
        DB Type     Address              XLog Loc         Info
        --------------------------------------------------------------
        Master      10.146.0.4           0/70001E0        
        Standby     10.146.0.3           0/70001E0        
        Standby database(s) in sync with master. It is safe to promote.

我們可以發現 Master/Standby 對調了

接著,我們分別觀察兩資料庫目錄,可以發現「舊的 Primary 資料庫/新的 Standby 資料庫」目錄下面,就會有由 EFM 從「舊的 Standby 資料庫/新的 Primary 資料庫」複製的 recovery.conf 檔案,並且修改連線資訊:

[enterprisedb@edb1 ~]# ls $PGDATA
base       pg_clog       pg_hba.conf    pg_logical    pg_replslot   pg_stat      pg_tblspc    pg_xlog               postmaster.opts  recovery.conf_2016-11-29-15:33:19
dbms_pipe  pg_commit_ts  pg_ident.conf  pg_multixact  pg_serial     pg_stat_tmp  pg_twophase  postgresql.auto.conf  postmaster.pid
global     pg_dynshmem   pg_log         pg_notify     pg_snapshots  pg_subtrans  PG_VERSION   postgresql.conf       recovery.conf

當然,「舊的 Standby 資料庫/新的 Primary 資料庫」目錄下,recovery.conf 被重新命名為 recovery.done
[enterprisedb@edb2 ~]# ls $PGDATA
backup_label.old  global        pg_dynshmem    pg_log        pg_notify    pg_snapshots  pg_subtrans  PG_VERSION            postgresql.conf  recovery.done
base              pg_clog       pg_hba.conf    pg_logical    pg_replslot  pg_stat       pg_tblspc    pg_xlog               postmaster.opts
dbms_pipe         pg_commit_ts  pg_ident.conf  pg_multixact  pg_serial    pg_stat_tmp   pg_twophase  postgresql.auto.conf  postmaster.pid

最後,我們也可以從交易日誌檔案看一下 timeline 變化
[enterprisedb@edb1 ~]# ls $PGDATA/pg_xlog
000000010000000000000003.00000028.backup  00000002.history          00000003.history          000000040000000000000008  00000004000000000000000A  archive_status
000000020000000000000006.partial          000000030000000000000007  000000040000000000000007  000000040000000000000009  00000004.history

[enterprisedb@edb2 ~]# ls $PGDATA/pg_xlog
00000002.history                  00000003.history          000000040000000000000008  00000004000000000000000A  00000004.history
000000030000000000000007.partial  000000040000000000000007  000000040000000000000009  00000004000000000000000B  archive_status


也可以透過 PostgreSQL 指令觀察目前的 Timeline
edb=# select * from pg_stat_archiver;
 archived_count |    last_archived_wal     |        last_archived_time        | failed_count | last_failed_wal | last_failed_time |           stats_reset            
----------------+--------------------------+----------------------------------+--------------+-----------------+------------------+----------------------------------
              3 | 000000050000000000000008 | 29-NOV-16 16:32:47.046571 +00:00 |            0 |                 |                  | 29-NOV-16 15:56:59.214743 +00:00
(1 row)

以上都可以發現 timeline 有好些變動。(其實我已經切換兩三次了~)

於是,資料庫服務的主從角色已經對調成功。



參考資料


以下參考資料是 Switchover 的手動操作,可以供有興趣的人參考

Switchover/Switchback in PostgreSQL 9.3 | EnterpriseDB

社群專案 repmgr 也提供 Switchover 管理功能

除了先前的 pg_rewind 筆記所列的資料,以下再多補充一點
Back to the Future Part 3: pg_rewind with PostgreSQL 9.6 | 2ndQuadrant Blog

沒有留言:

張貼留言