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