標準 WhatsApp Business API 用戶端解決方案會在單一 Docker 容器中運作。若您同時運行多個 Docker 容器,將會造成問題,並導致您的帳戶遭到暫時禁用。此指南會為您講解如何設定高可用性,讓您可以讓 Docker 容器處於待命狀態,以防主要 Docker 容器突然故障。
如要使用此高可用性解決方案,需要在其之上運行現有的 WhatsApp Business API 用戶端單一實例安裝程式。如果您尚未設定 WhatsApp Business API 用戶端電話號碼,請在繼續執行此解決方案前先查閱安裝文件。
正如下圖所示,高可用性叢集需要至少兩個主節點和兩個核心應用程式節點:
我們建議使用不同的裝置/機架運行各個節點,以避免單一機器/機架故障時影響多個節點。
啟動叢集時,所有主節點都會爭相搶佔主租約並成為主要主節點。只有一個節點會成功,其他節點則會成為次要主節點。如果叢集中有 N 個主節點,其中一個會是主要主節點,而其餘 N-1 個會是次要主節點。主要主節點負責註冊事宜、數據庫架構升級、廣播配置變更改、報告數據庫狀態,以及叢集管理等等。如果主要主節點停止運作並失去主租約,則其他次要主節點會競爭以接管主主要主節點的位置。
當某個主節點成為主要主節點時,它首先會從數據庫載入分片配對表,以瞭解哪個應用程式是當前的主要核心應用程式。如果叢集中沒有主要核心應用程式,則主要主節點會將某個狀態良好的次要核心應用程式提升為主要核心應用程式,並在數據庫中更新分片配對表,以便網頁應用程式查看要向哪個核心應用程式節點傳送 API 要求。如此一來,即使所有主節點都出現故障,它仍然可以在核心應用程式節點中提供 API 要求,從而達至高可用性。
當核心應用程式節點啟動時,它會以次要核心應用程式的身份運行,直至主要主節點將之提升為主要核心應用程式,以連接至 WhatsApp 伺服器。之後,它便會負責處理 API 要求。
每個核心應用程式節點每分鐘更新一次數據庫,以宣告其活躍性。主要主節點會定期檢查數據庫,以偵測狀態不佳的核心應用程式節點。如果主要核心應用程式節點未有在 2 分鐘內更新數據庫,則主要主節點會視之為狀態不佳,並會將其他核心應用程式節點提升為主要核心應用程式節點。在此情況下,停機時間大約為 2 分鐘。
如果一個叢集有多個正在運行的主節點,則基於活動訊號的監控會比基於數據庫的監控更快能夠監測出節點故障。在基於活動訊號的監控中,所有主節點每隔 5 秒(由 heartbeat_interval
配置)便會向核心應用程式節點傳送活動訊號,以作監控。如果主要核心應用程式在 30 秒內(由 unhealthy_interval
配置)未對主要主節點和一個次要主節點作出回應,便會被視為狀態不佳,而主要主節點會將狀態良好的次要核心應用程式提升為主要核心應用程式。在此情況下,預設的停機時間大約為 30 秒。如果偏好更短的停機時間,您可以減小 unhealthy_interval
值。請查看設定文件以了解裝載範例。
高可用性叢集含有三種節點:網頁應用程式節點、主節點和核心應用程式節點。您可以在不同的裝置中分別啟用這三種節點,但它們必須處於同一個網絡,以便與彼此交流。
像原始網頁應用程式容器一樣,網頁應用程式節點負責處理 API 流量。核心應用程式節點負責處理 WhatsApp 所收發的訊息流量。最後,主節點負責監控叢集中的核心應用程式節點;如果某個核心應用程式節點出現故障,主節點便會將流量重新導向另一個核心應用程式節點,以確保高可用性。一個叢集可能存在多個網頁應用程式節點、核心應用程式節點和主節點。
我們不再將活躍節點稱為從屬節點,而是將之稱為核心應用程式節點。
備註:在大多數情況下,正式版環境將需使用與核心應用程式和網頁應用程式容器分開的實體伺服器來運行資料庫。若要確實地達到高可用性,我們建議您使用不同的實體裝置運行主節點、網頁應用程式節點和核心應用程式節點容器。
如果媒體訊息對您來說並不重要,請跳過此步驟。
若要支援傳送/接收媒體訊息功能,請設定一個 NFS 檔案系統,然後將該系統掛接至所有網頁應用程式節點、主節點和核心應用程式節點的本機目錄。請確保向共享目錄授予讀取/寫入權限。
mkdir new-local-directory mount -t nfs nfs_server_IP_addr:/share_directory new-local-directory
本指南將需要使用 Docker,這是一個允許您運行 WhatsApp Business API 用戶端的容器平台。您亦需要使用 Docker Compose。若是 macOS 和 Windows 系統,Docker Compose 與 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
根據預設,網頁應用程式容器會在 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 個核心應用程式)。如要避免發生端口衝突,您需要修改相應的服務 YML 檔案(此情況下則為 multiconnect-coreapp.yml
),以按照下列指示為每個實例披露不同的主機端口:
ports:
- "HOST_PORT_RANGE:6250-6253"
根據預設,網頁應用程式容器會在 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
檔案中定義的所有磁碟區,請使用 -v
參數運行 down
:
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 檔案中定義的所有磁碟區,請使用 -v
參數運行 down
:
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