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