OpenResty Edge 搭建高可用数据库集群

本文档介绍了一种支持主从自动切换的高可用数据库集群方案。该方案能够在主库故障时自动将从库提升为新的主库,确保数据库服务的连续性。

以下步骤适用于 OpenResty Edge Admin Database 和 OpenResty Edge Log Server Database 这两种数据库的配置。

备份数据库

如果您之前已经安装了 OpenResty Edge 管理数据库或 OpenResty Edge 日志服务器数据库,我们强烈建议您参考本文档先进行备份,避免数据丢失。

环境准备

在开始配置之前,请确认以下事项:

  1. 至少有三台服务器:一台用于 Monitor 节点,一台用于主库节点,一台用于从库节点。
  2. 主库节点可以是之前已经安装好的 OpenResty Edge Admin Database 或者 OpenResty Edge Log Server Database 实例。
  3. 所有节点的防火墙已允许 5432 端口通信。
  4. 如果需要添加更多从库,可以重复从库的配置步骤。

配置步骤

1. 配置 Monitor 节点

注意:Monitor 节点必须在全新的机器上配置安装,在含有数据库的机器上执行会导致数据丢失。

  • 在全新的 Monitor 机器上,进行 Monitor 数据库环境的初始化。

    可以使用安装器安装 OpenResty Edge Admin DatabaseOpenResty 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 相关的错误消息,请根据日志提示到 Monitor 服务器上打开 /var/postgres12/monitor/pg_hba.conf 文件,添加新的来源 IP 地址,比如:

    hostssl "pg_auto_failover" "autoctl_node" 192.168.50.201/32 trust
    

    保存文件后,再重试第二步的配置操作。

  • 更新 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 DatabaseOpenResty 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 相关的错误消息,请根据日志提示到 Monitor 服务器上打开 /var/postgres12/monitor/pg_hba.conf 文件,添加新的来源 IP 地址,比如:

    hostssl "pg_auto_failover" "autoctl_node" 192.168.50.201/32 trust
    

    保存文件后,再重试上面一步的配置操作。

  • 更新 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
    

    如果看到错误,请根据错误信息进行相应的故障排除。

    更多配置详情,请参考官方文档

到这里,数据库集群服务就配置完成了!

故障转移和恢复

  1. 自动故障转移: 当主库无法使用时,从库会自动提升为主库。如果只有两个节点,状态会显示为 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
    
  2. 自动恢复: 当原主库恢复后,它会自动作为从库加入集群:

       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
    

注意:

  • 如果需要添加更多从库,请重复从库配置步骤。
  • 确保所有节点的系统时间同步,以避免潜在的复制问题。
  • 定期备份数据库以确保数据安全。
  • 监控集群状态,及时处理潜在的问题。