標準 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 節點的本機目錄。確定在共用目錄上授予讀取/寫入權限。
mkdir new-local-directory mount -t nfs nfs_server_IP_addr:/share_directory new-local-directory
本指南需要 Docker,一種可讓您執行 WhatsApp Business API 用戶端的容器平台。另外,也需要 Docker Compose。Docker Compose 隨 macOS 和 Windows 版本的 Docker 提供,但在 Linux 上需另外安裝。
multiconnect-compose.yml
和 db.env
配置檔:WhatsApp_Configuration_Files.zip。
db.env
檔案中的值,以反映您的 MySQL 配置。如果您未安裝 MySQL,multiconnect-compose.yml
和 db.env
檔案有預設的配置,可在本機容器中啟動執行個體。docker-compose -f your-single-connect-yml-filename stop
docker-compose -f multiconnect-compose.yml up指令碼在下載 Docker 映像檔及進行各項設定時,您會取得一些輸出內容。若要在背景中執行容器,請使用
-d
參數:
docker-compose -f multiconnect-compose.yml up -d
完成這些步驟後,使用下列指令確定容器正在執行中:
docker-compose ps
根據預設,Webapp 容器會在連接埠 9090 上執行。
multiconnect-coreapp.yml
、multiconnect-master.yml
、multiconnect-webapp.yml
和 db.env
配置檔:WhatsApp_Configuration_Files.zip,並將每個檔案儲存到各自的伺服器。
db.env
檔案中的值,以反映您的 MySQL 配置。docker-compose -f your-single-connect-yml-filename stop
環境變數 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