OpenResty Edge 資料庫高可用

1. 前言

我們使用 PostgreSQL 作為 Edge 的資料庫。 我們通常稱 Edge Admin 所使用的資料庫為 Edge Admin DB;稱 Edge Log Server 使用的資料庫為 Edge Log Server DB。 Edge Admin DB 和 Edge Log Server DB 可以使用同一個 PostgreSQL 例項或叢集。 通常我們建議配置至少一個從庫來保證資料的安全性。

2. 配置 Master

你需要準備以下資訊:

  • MASTER_PORT:MASTER 的埠,如 5432
  • USERNAME:備份使用者,如 replicator
  • PASSWORD:備份使用者的密碼,如 examplepwd
  • STANDBY_HOST: STANDBY 的地址,如 10.0.0.2

2.1 建立備份使用者

登入主庫

# 替換:MASTER_PORT
/usr/local/openresty-postgresql12/bin/psql -h 127.0.0.1 -p MASTER_PORT -U postgres

執行 SQL 建立備份使用者

-- 替換:USERNAME、PASSWORD
create user USERNAME replication login encrypted password 'PASSWORD' connection limit -1;

2.2 配置 pg_hba.conf

開啟配置檔案

sudo -u postgres vi /var/postgres12/data/pg_hba.conf

新增以下配置

# 替換:USERNAME、STANDBY_HOST
host    replication     USERNAME      STANDBY_HOST/32             md5

2.3 配置 postgresql.conf

開啟配置檔案

sudo -u postgres vi /var/postgres12/data/postgresql.conf

修改以下欄位

listen_addresses = '*'
wal_level = replica
max_wal_senders = 5
wal_keep_segments = 1000
archive_mode = on
archive_command = '/bin/true'
archive_timeout = 600

2.4 重啟生效

sudo systemctl restart openresty-postgresql12

3. 配置 Standby

你需要準備以下資訊:

  • MASTER_HOST:MASTER 的地址,如 10.0.0.1
  • MASTER_PORT:MASTER 的埠,如 5432
  • USERNAME:備份使用者(和 Master 中配置的是同一個),如 replicator
  • PASSWORD:備份使用者的密碼(和 Master 中配置的是同一個),如 examplepwd

3.1 停止從庫

sudo systemctl stop openresty-postgresql12

3.2 從主庫備份資料

執行此步驟前,請確認你的磁碟空間足夠大。

# 替換:MASTER_HOST、MASTER_PORT、USERNAME、PASSWORD
sudo -u postgres /usr/local/openresty-postgresql12/bin/pg_basebackup -h MASTER_HOST -p MASTER_PORT -U USERNAME -D /var/postgres12/data
# 輸入密碼 [% PASSWORD %]

如果出現錯誤 pg_basebackup: error: directory "/var/postgres12/data" exists but is not empty,請更換其他目錄或刪除此目錄,然後重新執行此命令。

接下來請耐心等待同步完成,如果你的資料比較多,可能會耗時較久。

3.3 配置 standby.signal

開啟配置檔案

sudo -u postgres vi /var/postgres12/data/standby.signal

新增以下配置

standby_mode = 'on'

3.4 配置 postgresql.conf

開啟配置檔案

sudo -u postgres vi /var/postgres12/data/postgresql.conf

修改以下欄位

# 替換:MASTER_HOST、MASTER_PORT、USERNAME、PASSWORD
# max_connections 應大於 master 的配置
max_connections = 120
primary_conninfo = 'host=MASTER_HOST port=MASTER_PORT user=USERNAME password=PASSWORD'
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
recovery_target_timeline = 'latest'

3.5 重啟生效

sudo systemctl restart openresty-postgresql12

3.6 驗證

在主庫上執行

/usr/local/openresty-postgresql12/bin/psql -x -c "select * from pg_stat_replication" -U postgres

執行結果類似下面則說明配置成功

-[ RECORD 1 ]----+------------------------------
pid              | 29015
usesysid         | 22228
usename          | replicator
application_name | walreceiver
client_addr      | 192.168.122.1
client_hostname  |
client_port      | 38440
backend_start    | 2022-02-21 23:36:46.418257-08
backend_xmin     | 5222925
state            | streaming
sent_lsn         | 2/C5151CE8
write_lsn        | 2/C5151CE8
flush_lsn        | 2/C5151CE8
replay_lsn       | 2/C5151CE8
write_lag        | 00:00:00.000435
flush_lag        | 00:00:00.001187
replay_lag       | 00:00:00.001394
sync_priority    | 0
sync_state       | async
reply_time       | 2022-02-21 23:42:21.456685-08

4. 提升從庫為主庫

4.1 檢查主從複製狀態

sudo -u postgres /usr/local/openresty-postgresql12/bin/pg_controldata /var/postgres12/data

# 主庫
Database cluster state:               in production

# 主庫故障
Database cluster state:               shut down

# 從庫
Database cluster state:               in archive recovery

4.2 提升從庫為主庫

# 在從庫上執行
sudo -u postgres /usr/local/openresty-postgresql12/bin/pg_ctl promote -D /var/postgres12/data