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