开发者设置:高可用性和多连接

本文档将向您介绍如何在开发者机器上设置高可用性集群,还会指导如何在该集群上启用多连接,以及设置高可用性多连接集群所需的更改。

如要设置生产环境,请遵照生产环境设置中列出的相关说明。

准备工作

如果您之前已遵循开发人员设置:单一实例说明,在开发者机器上设置 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 进行互动。

您可以在 WhatsApp Business API 客户端上使用 API 调用 health 节点,以执行运行状况检查

所得输出结果应如下所示:

{
    "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 客户端尚未注册,因此响应会将 unregisteredgateway_status 显示为主 Master 容器的 gateway_status

第 7 步:注册 WhatsApp Business API 客户端

您可以使用 API 调用 account 节点,以注册 WhatsApp Business API 客户端。

第 8 步:再次执行运行状况检查

完成注册后,在 WhatsApp Business API 客户端上使用 API 调用 health 节点,以再次执行运行状况检查,确保其中一个核心应用容器的 gateway_statusconnected

所得输出结果应如下所示:

{
    "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 服务器;所有其他节点(包括主 Master)的 gateway_status 状态将为 disconnected。如果 wacore1 停止工作,则 wacore2 将替代该节点并连接到 Whatsapp 服务器,以维持高可用性。

现在,您已成功在高可用性模式下设置 WhatsApp Business API 客户端。在此模式下,任何时候都仅有一个核心应用会连接到 WhatsApp 服务器,并能随时发送消息。如果您想同时使用多个核心应用发送消息,从而提升消息吞吐量,请遵循下方的设置高可用性多连接集群部分的说明。

高可用性多连接集群的设置

第 1 步:设置两个分片

使用分片端点设置 2 个分片。您应查看状态为 201 Created 的 HTTP 响应。

第 2 步:执行运行状况检查

您可以在 WhatsApp Business API 客户端上使用 API 调用 health 节点,以执行运行状况检查

所得输出结果应如下所示:

{
    "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 服务器,而主 Master(在此示例中为 master2)也将连接到该服务器。

第 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 步:再次执行运行状况检查

使用 API 调用 health 节点,再次执行运行状况检查以验证所有节点能否正常运行。

所得输出结果应如下所示:

{
    "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

如果 MySQL 数据库用户已升级到 v2.23.x 和更高版本

您现在可使用数据库升级服务,在应用程序运行时升级数据库,从而避免停机。

第 1 步:下载配置文件

dbupgrade-compose.yml 文件包含用于指明容器版本的字段。

示例:

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

第 2 步:启动容器

如要升级安装程序,请启动 dbupgrade-service 容器,并将 WA_API_VERSION 环境变量设为最新版本:

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 文件中定义的所有卷,请使用 -v 参数运行 down

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 代码,点击此处即可下载源代码。