OpenResty Edge 搭建高可用数据库集群
本文档介绍了一种支持主从自动切换的高可用数据库集群方案。该方案能够在主库故障时自动将从库提升为新的主库,确保数据库服务的连续性。
以下步骤适用于 OpenResty Edge Admin Database 和 OpenResty Edge Log Server Database 这两种数据库的配置。
此外,我们还实现了交互式配置工具。你可以参考:OpenResty Edge 高可用数据库集群管理工具.
备份数据库
如果您之前已经安装了 OpenResty Edge 管理数据库或 OpenResty Edge 日志服务器数据库,我们强烈建议您参考本文档先进行备份,避免数据丢失。
环境准备
在开始配置之前,请确认以下事项:
- 至少有三台服务器:一台用于 Monitor 节点,一台用于主库节点,一台用于从库节点。
- 主库节点可以是之前已经安装好的 OpenResty Edge Admin Database 或者 OpenResty Edge Log Server Database 实例。
- 所有节点的防火墙已允许 5432 端口通信。
- 如果需要添加更多从库,可以重复从库的配置步骤。
配置步骤
1. 配置 Monitor 节点
注意:Monitor 节点必须在全新的机器上配置安装,在含有数据库的机器上执行会导致数据丢失。
在全新的 Monitor 机器上,进行 Monitor 数据库环境的初始化。
可以使用安装器安装 OpenResty Edge Admin Database 或 OpenResty Edge Log Server Database 来初始化环境。
安装完成后停止并禁用现有的数据库服务:
sudo systemctl stop openresty-postgresql12 sudo systemctl disable openresty-postgresql12
配置 Monitor 节点:
sudo su - postgres bash -c 'env PATH="/usr/local/openresty-postgresql12/bin:$PATH" pg_autoctl create monitor \ --pgdata=/var/postgres12/monitor \ --pgport 5432 \ --hostname <MONITOR_IP> \ --auth trust \ --ssl-self-signed \ --run'
<MONITOR_IP>
:请填写 Monitor 服务器的 IP 地址。
如果正常运行没有报错,按下 CTRL+C 关闭当前服务。
更新 systemd 服务文件并启动 Monitor 服务:
sudo bash -c 'env PATH="/usr/local/openresty-postgresql12/bin:$PATH" pg_autoctl show systemd \ --pgdata /var/postgres12/monitor' | sudo tee /etc/systemd/system/openresty-postgresql12-monitor.service sudo systemctl daemon-reload sudo systemctl enable openresty-postgresql12-monitor sudo systemctl start openresty-postgresql12-monitor
检查 Monitor 服务状态:
sudo systemctl status openresty-postgresql12-monitor
2. 配置主库节点
在主库机器上配置数据库节点。
主库节点可以是之前已经安装好的 OpenResty Edge Admin Database 或者 OpenResty Edge Log Server Database 实例,你可以继续使用这个实例,也可以使用安装器进行全新安装。
注意:这里如果进行全新安装,之前的数据将会丢失,请注意备份数据。
停止并禁用现有的数据库服务:
sudo systemctl stop openresty-postgresql12 sudo systemctl disable openresty-postgresql12
配置主库节点。
sudo su - postgres bash -c 'env PATH="/usr/local/openresty-postgresql12/bin:$PATH" pg_autoctl create postgres \ --pgdata /var/postgres12/data \ --hostname <DATABASE_NODE1_IP> \ --auth trust \ --ssl-self-signed \ --monitor "postgres://autoctl_node@<MONITOR_IP>:5432/pg_auto_failover?sslmode=require" \ --run'
<MONITOR_IP>
:使用之前配置的 Monitor 节点的 IP。<DATABASE_NODE1_IP>
: 请填写当前服务器的 IP 地址。
如果正常运行没有报错,按下 CTRL+C 关闭当前服务。
在 CTRL+C 关闭服务之后,如果在日志里有
pg_hba
相关的错误消息,比如:ERROR Connection to database failed: FATAL: no pg_hba.conf entry for host "xx.xx.xx.xx", user "autoctl_node", database "pg_auto_failover", SSL on
请根据日志提示到 Monitor 服务器上打开
/var/postgres12/monitor/pg_hba.conf
文件,添加新的来源 IP 地址,比如:hostssl "pg_auto_failover" "autoctl_node" <SOURCE_IP>/32 trust
<SOURCE_IP
: SOURCE_IP 是错误日志中提到的 IP,请根据错误日志提示填写。
保存文件后,重启 Monitor 服务。
sudo systemctl restart openresty-postgresql12-monitor
然后再重试配置主库节点的操作。
更新 systemd 服务文件并启动主库节点服务:
sudo bash -c 'env PATH="/usr/local/openresty-postgresql12/bin:$PATH" pg_autoctl show systemd \ --pgdata /var/postgres12/data' | sudo tee /etc/systemd/system/openresty-postgresql12-node.service sudo systemctl daemon-reload sudo systemctl enable openresty-postgresql12-node sudo systemctl start openresty-postgresql12-node
检查主库节点服务状态:
sudo systemctl status openresty-postgresql12-node
3. 配置从库节点
如果需要添加更多从库,请重复以下从库的配置步骤。
注意:该步骤必须在全新的机器上配置安装,在含有数据库的机器上执行会导致数据丢失。
在全新的从库机器上,进行数据库环境的初始化。
可以使用安装器安装 OpenResty Edge Admin Database 或 OpenResty Edge Log Server Database 来初始化环境。
停止并禁用现有的数据库服务:
sudo systemctl stop openresty-postgresql12 sudo systemctl disable openresty-postgresql12 sudo rm -rf /var/postgres12/data
配置从库节点。
sudo su - postgres bash -c 'env PATH="/usr/local/openresty-postgresql12/bin:$PATH" pg_autoctl create postgres \ --pgdata /var/postgres12/data \ --hostname <DATABASE_NODE2_IP> \ --auth trust \ --ssl-self-signed \ --monitor "postgres://autoctl_node@<MONITOR_IP>:5432/pg_auto_failover?sslmode=require" \ --run'
<MONITOR_IP>
:使用之前配置的 Monitor 节点的 IP。<DATABASE_NODE2_IP>
: 请填写当前服务器的 IP 地址。
如果正常运行没有报错,按下 CTRL+C 关闭当前服务。
在 CTRL+C 关闭服务之后,在日志里有
pg_hba
相关的错误消息,比如:ERROR Connection to database failed: FATAL: no pg_hba.conf entry for host "xx.xx.xx.xx", user "autoctl_node", database "pg_auto_failover", SSL on
请根据日志提示到 Monitor 服务器上打开
/var/postgres12/monitor/pg_hba.conf
文件,添加新的来源 IP 地址,比如:hostssl "pg_auto_failover" "autoctl_node" <SOURCE_IP>/32 trust
<SOURCE_IP
: SOURCE_IP 是错误日志中提到的 IP,请根据错误日志提示填写。
保存文件后,重启 Monitor 服务。
sudo systemctl restart openresty-postgresql12-monitor
然后再重试配置从库节点的操作。
更新 systemd 服务文件并启动从库节点服务:
sudo bash -c 'env PATH="/usr/local/openresty-postgresql12/bin:$PATH" pg_autoctl show systemd \ --pgdata /var/postgres12/data' | sudo tee /etc/systemd/system/openresty-postgresql12-node.service sudo systemctl daemon-reload sudo systemctl enable openresty-postgresql12-node sudo systemctl start openresty-postgresql12-node
检查从库节点服务状态:
sudo systemctl status openresty-postgresql12-node
4. 检查集群状态
在 Monitor 机器上执行以下命令来检查集群状态:
sudo su - postgres bash -c 'env PATH="/usr/local/openresty-postgresql12/bin:$PATH" pg_autoctl show state \
--pgdata /var/postgres12/monitor'
正常情况下,输出应类似于:
Name | Node | Host:Port | TLI: LSN | Connection | Reported State | Assigned State
--------+-------+---------------------+-----------------+--------------+---------------------+--------------------
node_1 | 1 | <DATABASE_NODE1_IP>:5432 | 1: 0/140091B8 | read-write | primary | primary
node_2 | 2 | <DATABASE_NODE2_IP>:5432 | 1: 0/140091B8 | read-only | secondary | secondary
5. 修改配置文件,让服务连接到数据库集群
请根据你当前配置的数据库集群类型,选择修改 OpenResty Admin 或者 OpenResty Log Server 的配置文件。
修改 OpenResty Admin 配置文件
登录到 OpenResty Admin 所在机器。
打开配置文件: 配置文件路径:
/usr/local/oredge-admin/conf/config.ini
在
[postgresql]
部分添加或修改以下配置:[postgresql] endpoints="postgresql://[DATABASE_NODE1_IP]:5432,[DATABASE_NODE2_IP]:5432/or_edge_admin?user=or_edge_admin&password=[PASSWORD]&pool_size=10"
注意:将
[DATABASE_NODE1_IP]
、[DATABASE_NODE2_IP]
和[PASSWORD]
替换为实际值。如果集群有多个 IP,可以在[DATABASE_NODE2_IP]
后面继续添加,用逗号分隔。获取 PASSWORD:
sudo cat /usr/local/oredge-admin/conf/or-config.ini | grep password
保存修改并退出编辑器。
重启 oredge-admin 服务:
sudo systemctl start upgrade-oredge-admin
观察错误日志:
sudo tail -f /usr/local/oredge-admin/logs/error.log
如果看到错误,请根据错误信息进行相应的故障排除。
修改 OpenResty Log Server 配置文件
登录到 OpenResty Log Server 所在机器。
打开配置文件: 配置文件路径:
/usr/local/oredge-log-server/conf/config.ini
在
[postgresql]
部分添加或修改以下配置:[postgresql] endpoints="postgresql://[DATABASE_NODE1_IP]:5432,[DATABASE_NODE2_IP]:5432/or_edge_log_server?user=or_edge_log_server&password=[PASSWORD]&pool_size=10"
注意:将
[DATABASE_NODE1_IP]
、[DATABASE_NODE2_IP]
和[PASSWORD]
替换为实际值。如果集群有多个 IP,可以在[DATABASE_NODE2_IP]
后面继续添加,用逗号分隔。获取 PASSWORD:
sudo cat /usr/local/oredge-log-server/conf/or-config.ini | grep password
保存修改并退出编辑器。
重启 oredge-log-server 服务:
sudo systemctl start upgrade-oredge-log-server
观察错误日志:
sudo tail -f /usr/local/oredge-log-server/logs/error.log
如果看到错误,请根据错误信息进行相应的故障排除。
更多配置详情,请参考官方文档。
到这里,数据库集群服务就配置完成了!
故障转移和恢复
自动故障转移: 当主库无法使用时,从库会自动提升为主库。如果只有两个节点,状态会显示为 wait_primary:
Name | Node | Host:Port | TLI: LSN | Connection | Reported State | Assigned State --------+-------+---------------------+-----------------+--------------+---------------------+-------------------- node_1 | 1 | <DATABASE_NODE1_IP>:5432 | 1: 0/140092D8 | read-write ! | primary | demoted node_2 | 2 | <DATABASE_NODE2_IP>:5432 | 2: 0/14009FF8 | read-write | wait_primary | wait_primary
自动恢复: 当原主库恢复后,它会自动作为从库加入集群:
Name | Node | Host:Port | TLI: LSN | Connection | Reported State | Assigned State --------+-------+---------------------+-----------------+--------------+---------------------+-------------------- node_1 | 1 | <DATABASE_NODE1_IP>:5432 | 2: 0/1405E208 | read-only | secondary | secondary node_2 | 2 | <DATABASE_NODE2_IP>:5432 | 2: 0/1405E208 | read-write | primary | primary
注意:
- 如果需要添加更多从库,请重复从库配置步骤。
- 确保所有节点的系统时间同步,以避免潜在的复制问题。
- 定期备份数据库以确保数据安全。
- 监控集群状态,及时处理潜在的问题。