OpenResty Edge 搭建高可用資料庫叢集

本文件介紹了一種支援主從自動切換的高可用資料庫叢集方案。該方案能夠在主庫故障時自動將從庫提升為新的主庫,確保資料庫服務的連續性。

以下步驟適用於 OpenResty Edge Admin Database 和 OpenResty Edge Log Server Database 這兩種資料庫的配置。

此外,我們還實現了互動式配置工具。你可以參考:OpenResty Edge 高可用資料庫叢集管理工具.

備份資料庫

如果您之前已經安裝了 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 相關的錯誤訊息,比如:

    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 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 相關的錯誤訊息,比如:

    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
    

    如果看到錯誤,請根據錯誤資訊進行相應的故障排除。

    更多配置詳情,請參考官方文件

到這裡,資料庫叢集服務就配置完成了!

故障轉移和恢復

  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
    

注意:

  • 如果需要新增更多從庫,請重複從庫配置步驟。
  • 確保所有節點的系統時間同步,以避免潛在的複製問題。
  • 定期備份資料庫以確保資料安全。
  • 監控叢集狀態,及時處理潛在的問題。