設定高可用性

標準 WhatsApp Business API 用戶端解決方案是在單一 Docker 容器上執行。若同時有多個 Docker 容器為執行中,將會造成問題,使您的帳戶暫時遭到封鎖。本指南將引導您設定高可用性,允許設定待機的 Docker 容器,以防主要的 Docker 容器突然關閉。

此高可用性解決方案需要已安裝的現有 WhatsApp Business API 用戶端單一執行個體,才能在其上執行。如果您尚未設定 WhatsApp Business API 用戶端電話號碼,請先檢閱安裝文件,再繼續進行此解決方案。

總覽

高可用性叢集需要至少兩個 Master 節點和兩個 Coreapp 節點,如下圖所示:

高可用性叢集

建議在不同的電腦/機架上執行所有節點,以避免單機/機架故障同時影響多個節點。

啟動

當叢集啟動時,所有 Master 將競爭以獲取主租約而成為主要 Master 節點。只有一個節點會成功,其他的則成為次要 Master 節點。如果叢集中有 N 個 Master 節點,則會有一個主要 Master 和 N-1 個次要 Master。主要 Master 節點負責註冊、資料庫架構升級、設定變更廣播、報告資料庫統計資料、叢集管理等。如果主要 Master 節點停止運作並失去主租約,其他次要 Master 節點將競爭以接管主要 Master 節點的位置。

當 Master 節點變成主要 Master 節點時,首先將從資料庫載入分片映射表,以瞭解目前的主要核心應用程式為何。如果叢集中沒有主要核心應用程式,主要 Master 節點會將一個正常的次要核心應用程式提升為主要核心應用程式,並更新資料庫中的分片映射表,讓網路應用程式可以查找要向其發送 API 要求的核心應用程式節點。如此一來,即使所有 Master 節點都停止運作,仍可以在核心應用程式節點中提供 API 要求以實現高可用性。

當核心應用程式節點啟動時,將以次要核心應用程式的方式執行,直到主要 Master 節點將其提升為主要核心應用程式才能連接到 WhatsApp 伺服器。之後,它就負責處理 API 要求。

基於資料庫的監控

每個核心應用程式節點會每分鐘更新一次資料庫,以宣告其活性。主要 Master 節點將定期檢查資料庫以偵測不正常的核心應用程式節點。如果主要核心應用程式節點超過 2 分鐘仍未更新資料庫,主要 Master 節點將視其為不正常,並將其他核心應用程式節點提升為主要節點。在此情況下,停機時間大約 2 分鐘。

基於活動訊號的監控

如果叢集具有多個執行中的 Master 節點,基於活動訊號的監控會比基於資料庫的監控更快地偵測節點故障。在基於活動訊號的監控中,所有 Master 都負責監控 Coreapp 節點,每 5 秒傳送一次活動訊號至 Coreapp 節點(以 heartbeat_interval 配置)。如果主要 Coreapp 未回應主要 Master 和一個次要 Master 達 30 秒(以 unhealthy_interval 配置),則視為不正常,而主要 Master 會將正常的次要 Coreapp 提升為主要 Coreapp。在此情況下,停機時間大約 30 秒(預設值)。如果需要較低的停機時間,可以降低 unhealthy_interval 值。如需承載範例,請查看設定文件

初始設定

高可用性叢集中有三種節點:Webapp、Master 和 Coreapp。這些節點可在不同的機器上分別啟動,但必須為在同一網路內,才能相互通訊。

Webapp 節點負責處理 API 流量,如同原始的 Webapp 容器。Coreapp 節點負責處理與 WhatsApp 往來的訊息流量。最後,Master 節點負責監控叢集中的 Coreapp 節點,假如某一 Coreapp 節點故障,它會將流量重新導向到其他的 Coreapp 節點,以維持高可用性。叢集內可能有多個 Webapp 節點、Coreapp 節點和 Master 節點。

上線的節點不再視為從屬節點。而是稱為 Coreapp 節點。

注意:對於生產環境,在大多數情況下,資料庫應該在與 Coreapp 和 Webapp 容器不同的實體伺服器上執行。為實現真正的高可用性,建議您在不同的實體機器上執行 Master、Webapp 和 Coreapp 容器。

設定媒體訊息使用共用的檔案系統

如果您不在意媒體訊息,請跳過此步驟。

若要支援傳送/接收媒體訊息,需要設定 NFS 檔案系統,並將其掛載到所有 Webapp、Master 和 Coreapp 節點的本機目錄。確定在共用目錄上授予讀取/寫入權限。

NFS 掛載指令範例:

mkdir new-local-directory
mount -t nfs nfs_server_IP_addr:/share_directory new-local-directory

Docker Compose 安裝

本指南需要 Docker,一種可讓您執行 WhatsApp Business API 用戶端的容器平台。另外,也需要 Docker Compose。Docker Compose 隨 macOS 和 Windows 版本的 Docker 提供,但在 Linux 上需另外安裝。

使用單一伺服器的開發人員設定

  1. 在您的系統上安裝 Docker。
  2. 如果您安裝的 Docker 未包含 Docker Compose,請另行安裝
  3. 下載 multiconnect-compose.ymldb.env 配置檔:WhatsApp_Configuration_Files.zip
  4. 開啟主控台,瀏覽至儲存下載檔案的目錄。
  5. 如果有已安裝的 MySQL 在執行中,請變更 db.env 檔案中的值,以反映您的 MySQL 配置。如果您未安裝 MySQL,multiconnect-compose.ymldb.env 檔案有預設的配置,可在本機容器中啟動執行個體。
  6. 請確定沒有單一連接容器執行中,再啟動用於高可用性的多個容器:
      docker-compose -f your-single-connect-yml-filename stop
    
  7. 在主控台中執行下列指令:
    docker-compose -f multiconnect-compose.yml up
    指令碼在下載 Docker 映像檔及進行各項設定時,您會取得一些輸出內容。若要在背景中執行容器,請使用 -d 參數:
    docker-compose -f multiconnect-compose.yml up -d

完成這些步驟後,使用下列指令確定容器正在執行中:

docker-compose ps

根據預設,Webapp 容器會在連接埠 9090 上執行。

每個容器有多重伺服器的生產設定

  1. 在系統上安裝 Docker。
  2. 如果您安裝的 Docker 未包含 Docker Compose,請另行安裝
  3. 下載 multiconnect-coreapp.ymlmulticonnect-master.ymlmulticonnect-webapp.ymldb.env 配置檔:WhatsApp_Configuration_Files.zip,並將每個檔案儲存到各自的伺服器。
  4. 在每部伺服器上開啟主控台,瀏覽至儲存下載檔案的目錄。
  5. 進行生產設定時,強烈建議您使用獨立的 MySQL 執行個體。有了單獨的 MySQL 執行個體後,請變更 db.env 檔案中的值,以反映您的 MySQL 配置。
  6. 請確定沒有單一連接容器執行中,再啟動用於高可用性的多個容器:
    docker-compose -f your-single-connect-yml-filename stop
    
  7. 在各機器的主控台中執行下列指令:

    環境變數 EXTERNAL_HOSTNAME 應該是可從執行其他容器之機器存取的 IP 位址或主機名稱。在服務 YML 檔案中揭露的連接埠應該開放給來自執行其他容器的機器連線。例如,multiconnect-coreapp.yml 中定義為 COREAPP_EXTERNAL_PORTS 的連接埠需要開放給執行 coreapp 容器之主機上的傳入流量。

    EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml up # on the Coreapp server
    EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml up # on the Master server
    EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml up # on the Webapp server
    指令碼在下載 Docker 映像檔及進行各項設定時,您會取得一些輸出內容。若要在背景中執行容器,請使用 -d 參數:
    EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml up -d # on the Coreapp server
    EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml up -d # on the Master server
    EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml up -d # on the Webapp server

完成這些步驟後,使用下列指令確定容器正在執行中:

EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml ps # on the Coreapp server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml ps # on the Master server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml ps # on the Webapp server

在預設情況下,無法執行相同服務的多個執行個體(例如,在相同主機上執行 2 個 Coreapp),因為主機連接埠會發生衝突。為了避免連接埠衝突,您需要修改各自的服務 YML 檔案(在本例中為 multiconnect-coreapp.yml),對每個執行個體揭露不同的主機連接埠,如下所示:

ports:
- "HOST_PORT_RANGE:6250-6253"

根據預設,Webapp 容器會在連接埠 9090 上執行。

升級

使用單一伺服器的開發人員設定

multiconnect-compose.yml 檔案中有指示容器版本的欄位。例如:

services: ... waweb: image: docker.whatsapp.biz/web:v2.19.4 ... master: image: docker.whatsapp.biz/coreapp:v2.19.4 ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.4

若要升級安裝,請變更 multiconnect-compose.yml 檔案中的版本編號:

services: ... waweb: image: docker.whatsapp.biz/web:v2.19.7 ... master: image: docker.whatsapp.biz/coreapp:v2.19.7 ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.7

接著,重新啟動 Docker 容器:

docker-compose -f multiconnect-compose.yml up

每個容器有多重伺服器的生產設定

YAML 檔案內有欄位將指出容器版本。例如:

services: ... waweb: image: docker.whatsapp.biz/web:v2.19.4
services: ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.4

services: ... master: image: docker.whatsapp.biz/coreapp:v2.19.4

若要升級安裝程式,請變更個別檔案中的版本編號:

services: ... waweb: image: docker.whatsapp.biz/web:v2.19.7
services: ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.7

services: ... master: image: docker.whatsapp.biz/coreapp:v2.19.7

接著,重新啟動 Docker 容器:

EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml up # on the Coreapp server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml up # on the Master server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml up # on the Webapp server

附加現有的磁碟區

如果您有先前安裝的媒體磁碟區,請將 YAML 檔案中的下列磁碟區定義:

volumes:
  whatsappData:
      driver: local
  whatsappMedia:
      driver: local

換成:

volumes:
  whatsappData:
      external: true
  whatsappMedia:
      external: true

繫結掛載

此選項只建議您在想要保留現有的繫結掛載磁碟區時使用。

如果您想要將主機路徑(主機上現有的位置)直接掛載至容器中,您可以變更服務區段內的磁碟區指令行來指向主機路徑。

wacore:
    volumes:
        /filepath/waent/data:/usr/local/waent/data
        /filepath/wamedia:/usr/local/wamedia

解除安裝

使用單一伺服器的開發人員設定

您必須在執行節點的所有機器上重複執行此步驟。

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

docker-compose -f multiconnect-compose.yml down

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

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

每個容器有多重伺服器的生產設定

如果您需要移除所有容器以重設開發環境,請在每部伺服器上包含 YAML 檔案的目錄中執行下列命令:

EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml down # on the Coreapp server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml down # on the Master server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml down # on the Webapp server

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

EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml down -v # on the Coreapp server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml down -v # on the Master server
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml down -v # on the Webapp server

疑難排解記錄

若要取得疑難排解的記錄,請在伺服器上執行下列命令:

  docker-compose logs > debug_output.txt