Thiết lập giải pháp độ sẵn sàng cao

Giải pháp Ứng dụng API WhatsApp Business tiêu chuẩn chạy trên một vùng chứa Docker duy nhất. Việc chạy nhiều vùng chứa Docker sẽ gây ra sự cố và khiến tài khoản bị cấm tạm thời. Hướng dẫn này sẽ chỉ cho bạn cách thiết lập độ sẵn sàng cao, nhờ đó bạn sẽ có các vùng chứa Docker dự phòng trong trường hợp vùng chứa Docker chính không hoạt động.

Giải pháp độ sẵn sàng cao này yêu cầu bạn cài đặt một phiên bản Ứng dụng API WhatsApp Business hiện có để chạy trên ứng dụng đó. Nếu bạn chưa thiết lập số điện thoại cho Ứng dụng API WhatsApp Business, hãy xem lại tài liệu hướng dẫn Cài đặt trước khi tiếp tục sử dụng giải pháp này.

Tổng quan

Nhóm có độ sẵn sàng cao cần có ít nhất 2 nút Master và 2 nút Coreapp như minh họa trong sơ đồ sau:

Nhóm có độ sẵn sàng cao

Bạn nên chạy tất cả nút này trên các máy/dàn máy khác nhau để tránh trường hợp một lỗi máy/dàn máy ảnh hưởng đến nhiều nút cùng lúc.

Khởi động

Khi một nhóm khởi động, toàn bộ nút Master sẽ cạnh tranh để giành vị trí chính. Chỉ một nút sẽ thành công còn các nút khác sẽ trở thành Master phụ. Nếu nhóm có N nút Master thì sẽ có 1 Master chính và N-1 Master phụ. Master chính chịu trách nhiệm đăng ký, nâng cấp lược đồ cơ sở dữ liệu, gửi các thay đổi về cấu hình, báo cáo trạng thái cơ sở dữ liệu, quản lý nhóm, v.v. Nếu Master chính ngừng hoạt động và mất vị trí chính, những Master phụ khác sẽ cạnh tranh để giành vị trí Master chính.

Khi giành được vị trí chính, trước tiên, Master sẽ tải bảng sơ đồ phân đoạn từ cơ sở dữ liệu để biết Coreapp chính hiện tại. Nếu nhóm chưa có Coreapp chính, Master chính sẽ thăng cấp một Coreapp phụ hiệu quả làm Coreapp chính và cập nhật bảng sơ đồ phân đoạn trong cơ sở dữ liệu sao cho Webapp có thể tra cứu nút Coreapp nào đã gửi yêu cầu API. Bằng cách này, ngay cả khi tất cả các Master gặp sự cố thì Webapp vẫn có thể phân phối yêu cầu API trong nút Coreapp để đạt được Độ sẵn sàng cao.

Khi khởi động, nút Coreapp sẽ chạy với vai trò là Coreapp phụ cho đến khi được Master chính thăng cấp lên thành Coreapp chính để kết nối với máy chủ WhatsApp. Sau đó, Coreapp sẽ chịu trách nhiệm xử lý yêu cầu API.

Giám sát dựa trên cơ sở dữ liệu

Mỗi phút, từng nút Coreapp sẽ cập nhật cơ sở dữ liệu để xác nhận trạng thái hoạt động của nút đó. Master chính sẽ kiểm tra cơ sở dữ liệu theo định kỳ để phát hiện những nút Coreapp hoạt động không hiệu quả. Nếu một nút Coreapp chính không cập nhật cơ sở dữ liệu trong hơn 2 phút, Master chính sẽ xem nút Coreapp đó là không hiệu quả và thăng cấp nút Coreapp khác lên làm nút chính. Theo cách này, thời gian dừng hoạt động sẽ kéo dài khoảng 2 phút.

Giám sát dựa trên thông báo hoạt động

Nếu nhóm có nhiều Master đang chạy, tính năng giám sát dựa trên thông báo hoạt động sẽ phát hiện lỗi nút nhanh hơn tính năng giám sát dựa trên cơ sở dữ liệu. Trong tính năng giám sát dựa trên thông báo hoạt động, tất cả Master chịu trách nhiệm giám sát các nút Coreapp bằng cách gửi thông báo hoạt động đến nút Coreapp 5 giây một lần (được đặt cấu hình theo heartbeat_interval). Nếu không phản hồi Master chính và một Master phụ trong 30 giây (được đặt cấu hình theo unhealthy_interval), Coreapp chính sẽ được xem là không hiệu quả và Master chính sẽ thăng cấp một Coreapp phụ hiệu quả lên làm Coreapp chính. Theo cách này, thời gian dừng hoạt động sẽ mặc định là khoảng 30 giây. Bạn có thể giảm giá trị unhealthy_interval nếu muốn giảm thời gian dừng hoạt động. Hãy tham khảo tài liệu về Cài đặt để xem các phần tải dữ liệu mẫu.

Thiết lập ban đầu

Một nhóm có Độ sẵn sàng cao sẽ có 3 loại nút: Webapp, Master và Coreapp. Bạn có thể khởi động từng nút này trên các máy khác nhau. Tuy nhiên, các nút đó cần phải ở trong cùng một mạng để có thể giao tiếp với nhau.

Nút Webapp chịu trách nhiệm xử lý lưu lượng truy cập API, chẳng hạn như vùng chứa Webapp gốc. Nút Coreapp chịu trách nhiệm xử lý lưu lượng truy cập tin nhắn đến và từ WhatsApp. Cuối cùng, nút Master chịu trách nhiệm giám sát các nút Coreapp trong nhóm. Do đó, nếu một nút Coreapp ngừng hoạt động, nút Master sẽ chuyển lưu lượng truy cập đến một nút Coreapp khác để đảm bảo độ sẵn sàng cao. Một nhóm có thể có nhiều nút Webapp, nút Coreapp và nút Master.

Các nút đang hoạt động không còn được gọi là nút lệ thuộc nữa. Chúng được gọi là nút Coreapp.

Lưu ý: Đối với môi trường chính thức, trong hầu hết các trường hợp, bạn nên chạy cơ sở dữ liệu trên một máy chủ thực tách biệt với vùng chứa Coreapp và Webapp. Để đạt được Độ sẵn sàng cao thật sự, bạn nên chạy vùng chứa Master, Webapp và Coreapp trên các máy thực khác nhau.

Thiết lập một hệ thống file dùng chung cho các tin nhắn có file phương tiện

Nếu bạn không quan tâm đến tin nhắn có file phương tiện, hãy bỏ qua bước này.

Để hỗ trợ gửi/nhận tin nhắn có file phương tiện, bạn cần phải thiết lập một hệ thống file NFS và liên kết hệ thống này với một thư mục cục bộ trên tất cả các nút Webapp, Master và Coreapp. Hãy nhớ cấp quyền đọc/ghi trên thư mục dùng chung.

Lệnh liên kết NFS mẫu:

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

Cài đặt bằng Docker Compose

Theo hướng dẫn này, bạn cần có nền tảng vùng chứa Docker thì mới chạy được Ứng dụng API WhatsApp Business. Ngoài ra, bạn cần có Docker Compose. Docker Compose đi kèm với Docker dành cho macOS và Windows, nhưng bạn cần phải cài đặt riêng khi sử dụng Linux.

Thiết lập dành cho nhà phát triển có một máy chủ

  1. Cài đặt Docker trên hệ thống của bạn.
  2. Cài đặt Docker Compose nếu công cụ này không đi kèm với bản cài đặt Docker.
  3. Tải xuống các file cấu hình multiconnect-compose.ymldb.env: WhatsApp_Configuration_Files.zip.
  4. Mở bảng điều khiển và chuyển đến thư mục lưu file bạn đã tải xuống.
  5. Nếu bạn đang chạy bản cài đặt MySQL, hãy thay đổi các giá trị trong file db.env theo đúng cấu hình MySQL của bạn. Nếu bạn chưa cài đặt MySQL, các file docker-compose.ymldb.env sẽ có cấu hình mặc định để hiển thị phiên bản trong một vùng chứa cục bộ.
  6. Đảm bảo không có vùng chứa kết nối đơn nào đang chạy trước khi khởi động nhiều vùng chứa để đảm bảo Độ sẵn sàng cao:
      docker-compose -f your-single-connect-yml-filename stop
    
  7. Chạy lệnh sau trong bảng điều khiển:
    docker-compose -f multiconnect-compose.yml up
    Bạn sẽ nhận được một số thông tin đầu ra khi tập lệnh tải hình ảnh Docker xuống và thiết lập mọi nội dung. Để chạy các vùng chứa dưới nền, hãy sử dụng thông số -d:
    docker-compose -f multiconnect-compose.yml up -d

Sau khi bạn hoàn tất các bước này, hãy dùng lệnh sau để đảm bảo rằng các vùng chứa đang chạy:

docker-compose ps

Theo mặc định, vùng chứa Webapp sẽ chạy trên cổng 9090.

Thiết lập chính thức với nhiều máy chủ cho mỗi vùng chứa

  1. Cài đặt Docker trên các hệ thống của bạn.
  2. Cài đặt Docker Compose nếu công cụ này không đi kèm với các bản cài đặt Docker.
  3. Tải xuống các file cấu hình multiconnect-coreapp.yml, multiconnect-master.yml, multiconnect-webapp.ymldb.env: WhatsApp_Configuration_Files.zip rồi lưu từng file vào máy chủ tương ứng.
  4. Trên mỗi máy chủ, hãy mở bảng điều khiển và chuyển đến thư mục lưu file bạn đã tải xuống.
  5. Trong quá trình thiết lập chính thức, bạn nên sử dụng một phiên bản MySQL độc lập. Sau khi bạn có phiên bản này, hãy thay đổi các giá trị trong file db.env theo đúng cấu hình MySQL của bạn.
  6. Đảm bảo không có vùng chứa kết nối đơn nào đang chạy trước khi khởi động nhiều vùng chứa để đảm bảo Độ sẵn sàng cao:
    docker-compose -f your-single-connect-yml-filename stop
    
  7. Chạy các lệnh sau trong bảng điều khiển cho từng máy tương ứng:

    Biến môi trường EXTERNAL_HOSTNAME phải là địa chỉ IP hoặc tên máy chủ có thể truy cập được từ các máy đang chạy những vùng chứa khác. Các cổng hiển thị trong file YML dịch vụ phải mở để tiếp nhận kết nối từ các máy đang chạy những vùng chứa khác. Ví dụ: các cổng được xác định là COREAPP_EXTERNAL_PORTS trong multiconnect-coreapp.yml cần mở để tiếp nhận lưu lượng truy cập đến trên máy chủ chạy vùng chứa 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
    Bạn sẽ nhận được một số thông tin đầu ra khi tập lệnh tải hình ảnh Docker xuống và thiết lập mọi nội dung. Để chạy các vùng chứa dưới nền, hãy sử dụng thông số -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

Sau khi bạn hoàn tất các bước này, hãy dùng lệnh sau để đảm bảo rằng các vùng chứa đang chạy:

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

Theo mặc định, bạn không thể chạy nhiều phiên bản của cùng một dịch vụ (ví dụ: chạy 2 Coreapp trên cùng một máy chủ) do xung đột cổng máy chủ. Để tránh xung đột cổng, bạn cần sửa đổi file YML dịch vụ tương ứng (trong trường hợp này là multiconnect-coreapp.yml) để hiển thị các cổng máy chủ khác nhau cho từng phiên bản như sau:

ports:
- "HOST_PORT_RANGE:6250-6253"

Theo mặc định, vùng chứa Webapp sẽ chạy trên cổng 9090.

Nâng cấp

Thiết lập dành cho nhà phát triển với một máy chủ duy nhất

File multiconnect-compose.yml có các trường cho biết phiên bản vùng chứa. Ví dụ:

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

Để nâng cấp bản cài đặt, hãy thay đổi số phiên bản trong file 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

Sau đó, khởi động lại các vùng chứa Docker:

docker-compose -f multiconnect-compose.yml up

Thiết lập chính thức với nhiều máy chủ cho mỗi vùng chứa

Các file YAML có những trường cho biết phiên bản của vùng chứa. Ví dụ:

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

Để nâng cấp bản cài đặt, hãy thay đổi số phiên bản trong file tương ứng:

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

Sau đó, khởi động lại các vùng chứa 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

Đính kèm dung lượng hiện có

Nếu bạn có dung lượng chứa file phương tiện từ bản cài đặt trước, hãy thay thế định nghĩa dung lượng sau đây trong file YAML:

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

bằng:

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

Liên kết ràng buộc

Bạn chỉ nên dùng nếu muốn duy trì dung lượng liên kết ràng buộc hiện có.

Nếu muốn liên kết trực tiếp đường dẫn máy chủ (một vị trí hiện có trên máy chủ của bạn) với vùng chứa, bạn có thể làm điều đó bằng cách thay đổi dòng dung lượng trong phần dịch vụ để trỏ đến đường dẫn máy chủ này.

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

Gỡ cài đặt

Thiết lập dành cho nhà phát triển với một máy chủ duy nhất

Bạn sẽ phải lặp lại thao tác này cho tất cả các máy mà bạn đang chạy nút.

Nếu bạn cần gỡ tất cả các vùng chứa để đặt lại môi trường phát triển, hãy chạy lệnh sau từ thư mục chứa file multiconnect-compose.yml:

docker-compose -f multiconnect-compose.yml down

Ngoài vùng chứa, để loại bỏ toàn bộ dung lượng được xác định trong file multiconnect-compose.yml, hãy chạy lệnh down bằng thông số -v:

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

Thiết lập chính thức với nhiều máy chủ cho mỗi vùng chứa

Nếu bạn cần gỡ tất cả các vùng chứa để đặt lại môi trường phát triển, hãy chạy lệnh sau từ thư mục chứa file YAML trên mỗi máy chủ:

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

Ngoài vùng chứa, để loại bỏ toàn bộ dung lượng được xác định trong file YAML, hãy chạy lệnh down bằng thông số -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

Nhật ký khắc phục sự cố

Để lấy nhật ký khắc phục sự cố, hãy chạy lệnh sau trên các máy chủ của bạn:

  docker-compose logs > debug_output.txt