Menyiapkan Ketersediaan Tinggi

Solusi Klien API WhatsApp Business standar berjalan pada satu kontainer Docker. Menjalankan beberapa kontainer Docker akan menyebabkan masalah dan mengakibatkan akun Anda diblokir sementara. Panduan ini akan menjelaskan cara menyiapkan ketersediaan tinggi, memungkinkan Anda memiliki beberapa kontainer Docker dalam mode siaga apabila kontainer Docker utama mengalami gangguan.

Solusi ketersediaan tinggi ini mengharuskan adanya penginstalan instance tunggal Klien API WhatsApp Business yang berjalan di atasnya. Jika Anda belum menyiapkan nomor telepon Klien API WhatsApp Business, tinjau dokumentasi Penginstalan sebelum melanjutkan dengan solusi ini.

Ringkasan

Klaster ketersediaan tinggi memerlukan setidaknya dua node Master dan dua node Coreapp seperti yang terlihat dalam diagram berikut:

Klaster Ketersediaan Tinggi

Semua node direkomendasikan untuk dijalankan di beberapa mesin/rak yang berbeda untuk menghindari kegagalan mesin/rak yang memengaruhi banyak node sekaligus.

Memulai

Saat sebuah klaster memulai, semua node Master akan bersaing untuk meraih lease master untuk menjadi Master primer. Hanya satu node akan berhasil dan yang lain akan menjadi Master sekunder. Jika ada sejumlah N node Master di dalam klaster, akan ada satu Master primer dan N-1 Master sekunder. Master primer bertanggung jawab untuk pendaftaran, peningkatan skema database, siaran perubahan konfigurasi, pelaporan statistik database, pengelolaan klaster, dsb. Jika Master primer mati dan kehilangan lease master, hanya m=Master sekunder yang akan bersaing untuk menggantikan posisi Master primer.

Saat menjadi primer, sebuah Master akan pertama-tama memuat tabel peta partisi dari database untuk mengetahui siapa Coreapp primer saat ini. Jika tidak ada Coreapp primer di klaster, Master primer akan mempromosikan satu Coreapp sekunder yang sehat menjadi Coreapp primer dan memperbarui tabel peta partisi dalam database sehingga Webapp dapat mencari node Coreapp untuk dikirimi permintaan API. Jika demikian, bahkan jika semua Master mati, Webapp masih dapat melayani permintaan API di node Coreapp untuk mencapai Ketersediaan Tinggi.

Saat mulai aktif, node Coreapp berjalan sebagai Coreapp sekunder hingga Master primer mempromosikannya menjadi Coreapp primer untuk terhubung ke server WhatsApp. Setelah itu, Coreapp ini akan bertanggung jawab untuk menangani permintaan API.

Pemantauan berbasis database

Setiap node Coreapp akan memperbarui database setiap menit untuk mengeklaim keaktifannya. Master primer akan mengecek database secara berkala untuk mendeteksi node Coreapp yang tidak sehat. Jika node Coreapp primer tidak memperbarui database selama lebih dari 2 menit, Master primer akan menganggapnya tidak sehat dan mempromosikan node Coreapp lain menjadi primer. Jika demikian, downtime berkisar 2 menit.

Pemantauan berbasis detak

Jika sebuah klaster memiliki lebih dari satu Master yang berjalan, pemantauan berbasis detak mendeteksi kegagalan node lebih cepat daripada pemantauan berbasis database. Dalam pemantauan berbasis detak, semua Master bertanggung jawab untuk memantau node Coreapp dengan mengirim detak kepada node-node itu setiap 5 detik (dikonfigurasi berdasarkan heartbeat_interval). Jika tidak menanggapi Master primer dan satu Master sekunder selama 30 detik (dikonfigurasi berdasarkan unhealthy_interval), Coreapp primer dianggap tidak sehat dan Master primer akan mempromosikan Coreapp sekunder yang sehat menjadi Coreapp primer. Jika demikian, downtime berkisar 30 detik, secara default. Anda dapat mengurangi nilai unhealthy_interval jika menginginkan downtime yang lebih rendah. Periksa dokumentasi Pengaturan, contoh: muatan.

Pengaturan Awal

Dalam klaster Ketersediaan Tinggi ada tiga jenis node: Webapp, Master, dan Coreapp. Node ini dapat dijalankan terpisah di mesin yang berbeda, tetapi harus berada di jaringan yang sama agar dapat saling berkomunikasi.

Node Webapp bertanggung jawab untuk menangani traffic API seperti kontainer Webapp asli. Node Coreapp berfungsi untuk menangani traffic pengiriman pesan ke dan dari WhatsApp. Terakhir, node Master berfungsi untuk memantau node Coreapp di dalam klaster, sehingga jika sebuah node Coreapp mati, node Master akan mengarahkan traffic ke node Coreapp lain demi ketersediaan yang tinggi. Mungkin ada beberapa node Webapp, node Coreapp, dan node Master di klaster.

Node aktif tidak lagi disebut sebagai node budak. Node aktif disebut node Coreapp.

Catatan: Untuk lingkungan produksi, dalam kebanyakan kasus, database seharusnya dijalankan pada server fisik yang terpisah dari kontainer Coreapp dan Webapp. Untuk Ketersediaan Tinggi yang sebenarnya, direkomendasikan untuk menjalankan kontainer Master, Webapp, dan Coreapp pada mesin fisik yang berbeda.

Menyiapkan sistem file bersama untuk pesan media

Jika Anda tidak peduli tentang pesan media, lewati langkah ini.

Untuk mendukung pengiriman/penerimaan pesan media, diperlukan untuk menyiapkan sistem file NFS dan memasangnya ke direktori lokal di semua node Webapp, Master, dan Coreapp. Pastikan izin baca/tulis diberikan pada direktori bersama.

Contoh perintah pasang NFS:

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

Penginstalan dengan Docker Compose

Panduan ini memerlukan Docker, platform kontainer yang memungkinkan Anda menjalankan Klien API WhatsApp Business. Docker Compose juga diperlukan. Docker Compose dibundel dengan Docker untuk macOS dan Windows tetapi memerlukan penginstalan terpisah pada Linux.

Pengaturan developer dengan server tunggal

  1. Instal Docker pada sistem Anda.
  2. Jika Docker Compose tidak dibundel dengan penginstalan Docker Anda, instal Docker Compose.
  3. Unduh file konfigurasi multiconnect-compose.yml dan db.env: WhatsApp_Configuration_Files.zip.
  4. Buka konsol dan buka direktori tempat Anda menyimpan file unduhan.
  5. Jika Anda sudah menjalankan penginstalan MySQL, ubah nilai dalam file db.env untuk merefleksikan konfigurasi MySQL Anda. Jika Anda tidak menginstal MySQL, file multiconnect-compose.yml dan db.env memiliki konfigurasi default untuk memunculkan instance dalam kontainer lokal.
  6. Pastikan tidak ada kontainer koneksi tunggal yang berjalan sebelum memulai beberapa kontainer untuk Ketersediaan Tinggi:
      docker-compose -f your-single-connect-yml-filename stop
    
  7. Jalankan perintah berikut di konsol:
    docker-compose -f multiconnect-compose.yml up
    Anda akan mendapatkan beberapa output saat skrip mengunduh gambar Docker dan mengatur semuanya. Untuk menjalankan kontainer di latar belakang, gunakan parameter -d:
    docker-compose -f multiconnect-compose.yml up -d

Setelah Anda menyelesaikan langkah-langkah ini, pastikan kontainer berjalan dengan perintah berikut:

docker-compose ps

Secara default, kontainer Webapp akan berjalan pada port 9090.

Pengaturan produksi dengan beberapa server untuk setiap kontainer

  1. Instal Docker di sistem Anda.
  2. Jika Docker Compose tidak dibundel dengan penginstalan Docker Anda, instal Docker Compose.
  3. Unduh file konfigurasi multiconnect-coreapp.yml, multiconnect-master.yml, multiconnect-webapp.yml, dan db.env: WhatsApp_Configuration_Files.zip, dan simpan masing-masing ke server yang sesuai.
  4. Di setiap server, buka konsol dan arahkan ke direktori tempat Anda menyimpan file yang diunduh.
  5. Dalam pengaturan produksi, sangat direkomendasikan untuk menggunakan instance MySQL mandiri. Jika Anda sudah punya, ubah nilai dalam file db.env untuk merefleksikan konfigurasi MySQL Anda.
  6. Pastikan tidak ada kontainer koneksi tunggal yang berjalan sebelum memulai beberapa kontainer untuk Ketersediaan Tinggi:
    docker-compose -f your-single-connect-yml-filename stop
    
  7. Jalankan perintah berikut di konsol untuk masing-masing mesin:

    Variabel lingkungan EXTERNAL_HOSTNAME haruslah sebuah alamat IP atau hostname yang dapat diakses dari mesin yang menjalankan kontainer lainnya. Port yang diekspos dalam file YML layanan harus terbuka ke koneksi dari mesin yang menjalankan kontainer lain. Contoh: port didefinisikan sebagai COREAPP_EXTERNAL_PORTS di multiconnect-coreapp.yml harus terbuka untuk traffic masuk di host yang menjalankan kontainer 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
    Anda akan mendapatkan beberapa output saat skrip mengunduh gambar Docker dan mengatur semuanya. Untuk menjalankan kontainer di latar belakang, gunakan parameter -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

Setelah Anda menyelesaikan langkah-langkah ini, pastikan kontainer berjalan dengan perintah berikut:

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

Menjalankan beberapa contoh dari layanan yang sama (misal: menjalankan 2 Coreapps pada host yang sama) tidak akan berfungsi secara default karena konflik port host. Untuk menghindari konflik port, Anda perlu mengubah file YML layanan terkait, dalam kasus ini multiconnect-coreapp.yml, untuk mengekspos port host yang berbeda untuk setiap instance sebagai berikut:

ports:
- "HOST_PORT_RANGE:6250-6253"

Secara default, kontainer WebApp akan berjalan pada porta 9090.

Meningkatkan

Pengaturan developer dengan server tunggal

File multiconnect-compose.yml memiliki kolom yang menunjukkan versi kontainer. Contoh:

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

Untuk meningkatkan penginstalan, ubah nomor versi di 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

Lalu, mulai ulang kontainer Docker:

docker-compose -f multiconnect-compose.yml up

Pengaturan produksi dengan beberapa server untuk setiap kontainer

File YAML memiliki kolom yang menunjukkan versi kontainer. Contoh:

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

Untuk meningkatkan penginstalan, ubah nomor versi di masing-masing file:

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

Lalu, mulai ulang kontainer 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

Melampirkan volume yang sudah ada

Jika Anda memiliki volume media dari penginstalan sebelumnya, ganti definisi volume berikut di file YAML:

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

dengan:

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

Bind mount

Ini hanya direkomendasikan jika Anda ingin mempertahankan volume bind mount.

Jika ingin langsung memasang jalur host (lokasi yang ada di host Anda) ke dalam kontainer, Anda dapat melakukannya dengan mengubah baris volume di dalam bagian layanan untuk mengarahkan ke jalur host.

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

Menghapus instalasi

Pengaturan developer dengan server tunggal

Anda harus mengulangi ini untuk semua mesin tempat Anda menjalankan node.

Jika Anda perlu mereset lingkungan pengembangan Anda dengan menghapus semua kontainer, jalankan perintah berikut dari direktori yang berisi file multiconnect-compose.yml:

docker-compose -f multiconnect-compose.yml down

Untuk menghilangkan semua volume yang ditentukan dalam file multiconnect-compose.yml selain kontainer, jalankan down dengan parameter -v:

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

Pengaturan produksi dengan beberapa server untuk setiap kontainer

Jika Anda perlu mereset lingkungan pengembangan Anda dengan menghapus semua kontainer, jalankan perintah berikut dari direktori yang berisi file YAML pada setiap server:

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

Untuk membuang semua volume yang ditentukan dalam file YAML selain kontainer, jalankan down dengan parameter -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

Catatan Pemecahan Masalah

Untuk mendapatkan catatan guna pemecahan masalah, jalankan perintah berikut di server:

  docker-compose logs > debug_output.txt