開發人員設定:高可用性和多點連線

本文件示範如何在開發人員電腦上設定高可用性叢集,並提供相關指引,以瞭解如何在生產中啟用多點連線以及高可用性多點連線叢集所需的變更。

若是生產設定,請按照「生產設定」中的相關說明操作。

開始之前

如果您之前已按照「開發人員設定:單一實例」的說明在開發人員電腦上設定 WhatsApp Business API 用戶端,請先按照「移轉指南」的說明操作,然後再繼續本文件的其餘內容。

本指南的內容是以進行全新安裝為假設前提。

必備資料:

  • Docker Compose
    • 該程式應包含在安裝的 Docker 內,如果沒有的話,請進行安裝
  • 在開發環境中設定一個本機測試帳號
    • 這是供進行快速開發和測試新版本之用。

同時強烈建議您詳閱「可用性和調整性」指南,以進一步瞭解高可用性和多點連線。

設定高可用性叢集

步驟 1:建立一個 biz 目錄供設定指令碼使用

在您 WhatsApp Business API 用戶端的慣用位置執行以下程式碼:

mkdir ~/biz; cd ~/biz;

步驟 2:取得 WhatsApp Business API 用戶端設定檔

WhatsApp Business API 用戶端的設定檔位於 WhatsApp-Business-API-Setup-Scripts GitHub 存放庫中。您可以使用 MySQL 或 Postgres 資料庫實例設定 WhatsApp Business API。

步驟 3:設定 WA_API_VERSION 環境變數

應將 WA_API_VERSION 環境變數設為目前版本,請使用以下程式碼設定:

export WA_API_VERSION=current-whatsapp-version

步驟 4:啟動具高可用性的 WhatsApp Business API 用戶端

若要啟動具有 1 個資料庫容器、1 個網路應用程式容器、2 個主節點容器以及 2 個核心應用程式容器的高可用性叢集,類似「高可用性介紹」中所示的圖表背景,請執行下列命令:

docker-compose -f multiconnect-compose.yml up -d db waweb master1 master2 wacore1 wacore2

輸出結果應如下所示:

Creating network "biz_default" with the default driver
Creating volume "biz_mysqlData" with local driver
Creating volume "biz_whatsappMedia" with local driver
Creating biz_db_1 ... done
Creating biz_waweb_1 ... done
Creating biz_master1_1 ... done
Creating biz_master2_1 ... done
Creating biz_wacore2_1 ... done
Creating biz_wacore1_1 ... done

步驟 5:驗證容器是否執行中

您可以執行下列程式碼來檢查所有容器是否為 UP 狀態:

docker-compose -f multiconnect-compose.yml ps

輸出結果應如下所示:

      Name                    Command               State                                                 Ports
--------------------------------------------------------------------------------------------------------------------------------------------------------------
biz_db_1        docker-entrypoint.sh mysqld      Up      0.0.0.0:33060->3306/tcp, 33060/tcp
biz_master1_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32931->6250/tcp, 0.0.0.0:32930->6251/tcp, 0.0.0.0:32928->6252/tcp, 0.0.0.0:32926->6253/tcp
biz_master2_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32929->6250/tcp, 0.0.0.0:32927->6251/tcp, 0.0.0.0:32925->6252/tcp, 0.0.0.0:32924->6253/tcp
biz_wacore1_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32937->6250/tcp, 0.0.0.0:32935->6251/tcp, 0.0.0.0:32933->6252/tcp, 0.0.0.0:32932->6253/tcp
biz_wacore2_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32939->6250/tcp, 0.0.0.0:32938->6251/tcp, 0.0.0.0:32936->6252/tcp, 0.0.0.0:32934->6253/tcp
biz_waweb_1     /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:9090->443/tcp

根據預設,網路應用程式容器將在 9090 連接埠上執行,資料庫容器將在 33060 連接埠上執行。

步驟 6:執行系統健康檢查

如果您不想使用命令列,可以下載並設定 Postman 集合,如此便能與 WhatsApp Business API 互動。

您可以使用向 health 節點發出的 API 呼叫,對 WhatsApp Business API 用戶端執行系統健康檢查。

輸出結果應如下所示:

{
    "health": {
      "master1:b28d835cd579": {
          "errors": [
              {
                  "code": 1011,
                  "title": "Service not ready",
                  "details": "Wacore is not instantiated. Please check wacore log for details."
              }
          ]
      },
      "master2:7fe542d305b4": {
          "gateway_status": "unregistered",
          "role": "primary_master"
      },
      "wacore1:35a5fabfc79d": {
          "errors": [
              {
                  "code": 1011,
                  "title": "Service not ready",
                  "details": "Wacore is not instantiated. Please check wacore log for details."
              }
          ]
      },
      "wacore2:05e1a6d70665": {
          "errors": [
              {
                  "code": 1011,
                  "title": "Service not ready",
                  "details": "Wacore is not instantiated. Please check wacore log for details."
              }
          ]
      }
  }
}

因為 WhatsApp Business API 用戶端目前尚未註冊,主要主節點容器的 gateway_status 會顯示處於 unregisteredgateway_status

步驟 7:註冊 WhatsApp Business API 用戶端

您可以使用向 account 節點發出的 API 呼叫,註冊 WhatsApp Business API 用戶端。

步驟 8:執行第二次系統健康檢查

完成註冊之後,請使用向 health 節點發出的 API 呼叫,對 WhatsApp Business API 用戶端執行另一次系統健康檢查,並確保其中一個核心應用程式容器處於 connectedgateway_status

輸出結果應如下所示:

{
    "health": {
        "master1:b28d835cd579": {
            "gateway_status": "disconnected",
            "role": "secondary_master"
        },
        "master2:7fe542d305b4": {
            "gateway_status": "disconnected",
            "role": "primary_master"
        },
        "wacore1:35a5fabfc79d": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore2:05e1a6d70665": {
            "gateway_status": "disconnected",
            "role": "coreapp"
        }
    }
} 

注意:在高可用性模式中,只有一個核心應用程式(本例中為 wacore1)將連接到 WhatsApp 伺服器,所有其他節點(包括主要主節點)都將處於 disconnectedgateway_status。如果 wacore1 停止運作,wacore2 將取代它並連接到 WhatsApp 伺服器,以保持高可用性。

現在,您已經在高可用性模式中設定 WhatsApp Business API 用戶端。在此模式中,只有一個核心應用程式能夠連接到 WhatsApp 伺服器,以在任何指定時間發送訊息。若要讓多個核心應用程式同時傳送訊息以提高訊息輸送量,請按照下列「設定高可用性多點連線叢集」部分中的步驟操作。

設定高可用性多點連線叢集

步驟 1:設定 2 個分片

使用分片端點設定 2 個分片,您應該會看到狀態為 201 Created 的 HTTP 回應。

步驟 2:執行系統健康檢查

您可以使用向 health 節點發出的 API 呼叫,對 WhatsApp Business API 用戶端執行系統健康檢查。

輸出結果應如下所示:

{
    "health": {
        "master1:b28d835cd579": {
            "gateway_status": "disconnected",
            "role": "secondary_master"
        },
        "master2:7fe542d305b4": {
            "gateway_status": "connected",
            "role": "primary_master"
        },
        "wacore1:35a5fabfc79d": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore2:05e1a6d70665": {
            "gateway_status": "connected",
            "role": "coreapp"
        }
    }
}          

注意:在具有 2 個分片的多點連線模式中,2 個核心應用程式(本例中為 wacore1wacore2)將連接到 WhatsApp 伺服器,且主要主節點(本例中為 master2)也將連接到 WhastsApp 伺服器。

步驟 3:啟動第三個核心應用程式來維護高可用性

截至目前為止,在此範例中,您具有 2 個核心應用程式容器,訊息負載在兩者間進行切分。然而,如果其中一個核心應用程式容器停止運作,一半的訊息將無法傳送。為了維持此新多點連線設定中的高可用性,您可以啟動第三個核心應用程式,以容忍 1 個核心應用程式故障,這與「多點連線介紹」中所示的圖表類似。

若要啟動第三個核心應用程式容器,請執行下列命令:

docker-compose -f multiconnect-compose.yml up -d wacore3

輸出結果應如下所示:

biz_db_1 is up-to-date
biz_waweb_1 is up-to-date
biz_master1_1 is up-to-date
Creating biz_wacore3_1 ... done

步驟 4:執行第二次系統健康檢查

使用向 health 節點發出的 API 呼叫執行另一次系統健康檢查,驗證所有節點是否正常運作。

輸出結果應如下所示:

{
    "health": {
        "master1:b28d835cd579": {
            "gateway_status": "disconnected",
            "role": "secondary_master"
        },
        "master2:7fe542d305b4": {
            "gateway_status": "connected",
            "role": "primary_master"
        },
        "wacore1:35a5fabfc79d": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore2:05e1a6d70665": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore3:23b50199bec2": {
            "gateway_status": "disconnected",
            "role": "coreapp"
        }
    }
} 

新的核心應用程式容器(本例中為 wacore3)現在做為待命容器,但目前未連接到 WhatsApp 伺服器。如果 wacore1wacore2 中有任何一個停止運作,wacore3 將連接到 WhatsApp 伺服器,以維持分片總數為 2。

升級 WhatsApp Business API 用戶端

升級過程中,系統將會發生停機時間。

強烈建議您在升級之前先備份目前的應用程式設定,以確保能夠快速恢復正常運作。請按照備份和還原文件操作。

建議您一律在最不忙碌的時段執行升級。

步驟 1:將 WA_API_VERSION 環境變數變更為新版本

應將 WA_API_VERSION 環境變數更新為目前版本編號,請使用以下程式碼更新:

export WA_API_VERSION=new-whatsapp-version

步驟 2:重新啟動 Docker 容器

執行下列程式碼重新啟動 Docker 容器:

docker-compose -f multiconnect-compose.yml up -d

針對升級至 v2.23.x 及以上版本的 MySQL 資料庫使用者

您現在可以利用資料庫升級服務,該服務允許當應用程式仍在執行中時升級資料庫,以避免發生停機時間。

步驟 1:下載設定檔

dbupgrade-compose.yml 檔具有指示容器版本的欄位。

範例:

services:
  dbupgrade:
    image: docker.whatsapp.biz/coreapp:v${WA_API_VERSION:-2.21.3}

步驟 2:啟動容器

若要升級安裝,請啟動具有將 WA_API_VERSION 環境變數設為最新版本的 dbupgrade-service 容器:

WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d

注意:如果您使用的協調流程在結束時(不論結束代碼為何)重新啟動容器,請啟動具有將 EXIT_ON_SUCCESS 環境變數設為 FALSE 的服務,以避免當結束代碼為 0 時結束容器。

步驟 3:允許升級完成

如果資料庫升級成功,容器將以代碼 0 結束。您可以使用下列 Docker 命令來追蹤狀態:

docker wait your-database-upgrade-container-name

如此將輸出 dbupgrade-service 容器的結束代碼。

步驟 4:重新啟動核心應用程式和網路應用程式容器

重新啟動具有將 WA_API_VERSION 環境變數設為最新版本的核心應用程式和網路應用程式 Docker 容器:

WA_API_VERSION=new-whatsapp-version docker-compose -f multiconnect-compose.yml up -d

解除安裝 WhatsApp Business API 用戶端

強烈建議您在解除安裝之前先備份目前的應用程式設定。請按照備份和還原文件操作。

如果您需要移除所有容器以重設開發環境,請在包含 multiconnect-compose.yml 檔案的目錄中執行下列命令:

docker-compose -f multiconnect-compose.yml down

若要清除容器和 multiconnect-compose.yml 檔案中定義的所有磁碟區,請執行 down 並使用 -v 參數:

docker-compose -f multiconnect-compose.yml down -v

疑難排解

若要從所有容器蒐集記錄,請執行下列命令:

docker-compose -f multiconnect-compose.yml logs > debug_output.txt

若要蒐集某一特定服務的記錄,請將服務名稱(例如 wawebmaster1wacore1)附加至 docker-compose logs 命令:

docker-compose -f multiconnect-compose.yml logs waweb > debug_output.txt

您可以在目前目錄中找到 debug_output.txt 檔案中的記錄。


本軟體使用已獲 LGPLv2.1 授權的 FFmpeg 程式碼,您可以在這裡下載該原始程式碼。