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