ตั้งค่าความพร้อมใช้งานสูง

โซลูชั่นไคลเอ็นต์ WhatsApp Business API มาตรฐานทำงานบนคอนเทนเนอร์ Docker เดี่ยว การที่มีคอนเทนเนอร์ Docker หลายเครื่องทำงานอยู่จะทำให้เกิดปัญหาและทำให้บัญชีผู้ใช้ของคุณถูกแบนชั่วคราว คู่มือนี้จะให้คำแนะนำเกี่ยวกับวิธีการตั้งค่าความพร้อมใช้งานสูง ซึ่งช่วยให้คุณมีคอนเทนเนอร์ Docker ในโหมดสแตนด์บายในกรณีที่คอนเทนเนอร์ Docker หลักหยุดทำงาน

โซลูชั่นความพร้อมใช้งานสูงนี้จำเป็นต้องมีการติดตั้งอินสแตนซ์เดี่ยวของไคลเอ็นต์ WhatsApp Business API ที่มีอยู่เพื่อให้ทำงานบนอินสแตนซ์นั้น หากคุณยังไม่ได้ตั้งค่าหมายเลขโทรศัพท์ของไคลเอ็นต์ WhatsApp Business API ให้อ่านเอกสารประกอบเกี่ยวกับการติดตั้งก่อนที่จะดำเนินการด้วยโซลูชั่นนี้

ภาพรวม

คลัสเตอร์ที่มีความพร้อมใช้งานสูงจำเป็นต้องมีโหนด Master และโหนด Coreapp อย่างละ 2 โหนดเป็นอย่างน้อย ดังที่เห็นในแผนภาพด้านล่าง

คลัสเตอร์ที่มีความพร้อมใช้งานสูง

เราขอแนะนำให้โหนดทั้งหมดทำงานในหลายๆ เครื่อง/ตู้แร็ก เพื่อหลีกเลี่ยงไม่ให้เกิดกรณีที่ความขัดข้องของเครื่อง/ตู้แร็กหนึ่งตัวส่งผลกระทบต่อหลายโหนดในเวลาเดียวกัน

การเริ่มทำงาน

เมื่อคลัสเตอร์เริ่มทำงาน โหนด Master ทั้งหมดจะแข่งขันกันเพื่อคว้าสิทธิ์หลักในการเป็นโหนดหลัก แต่จะมีเพียงโหนดเดียวเท่านั้นที่จะบรรลุเป้าหมายและโหนดอื่นๆ ก็จะกลายเป็นโหนด Master รอง หากมีโหนด Master จำนวน N โหนดในคลัสเตอร์ คุณก็จะมีโหนด Master หลัก 1 โหนดและโหนด Master รอง N-1 โหนด โหนด Master หลักมีหน้าที่รับผิดชอบการลงทะเบียน การอัพเกรดสกีมาฐานข้อมูล การเผยแพร่การเปลี่ยนแปลงการกำหนดค่า การรายงานสถิติฐานข้อมูล การจัดการคลัสเตอร์ ฯลฯ หากโหนด Master หลักหมดอายุและสูญเสียสิทธิ์หลัก โหนด Master รองอื่นๆ จะแข่งขันกันเพื่อครองตำแหน่งโหนด Master หลัก

เมื่อโหนด Master กลายเป็นโหนดหลักแล้ว โหนดนี้จะโหลดตารางการแมปชาร์ดจากฐานข้อมูลก่อนดำเนินการอย่างอื่น เพื่อให้ทราบโหนดที่เป็นโหนด Coreapp หลักในขณะนั้น หากไม่มีโหนด Coreapp หลักในคลัสเตอร์ โหนด Master หลักจะเลื่อนโหนด Coreapp รองที่ไม่มีปัญหาขึ้นมาเป็นโหนด Coreapp หลัก และอัพเดตตารางการแมปชาร์ดในฐานข้อมูลเพื่อให้ Webapp สามารถค้นหาได้ว่าจะส่งคำขอ API ไปยังโหนด Coreapp ใด ด้วยวิธีนี้ แม้ว่าโหนด Master ทั้งหมดจะไม่สามารถทำงานได้ แต่ก็ยังคงสามารถรองรับคำขอ API ในโหนด Coreapp ได้เพื่อให้มีความพร้อมใช้งานสูง

เมื่อโหนด Coreapp เริ่มทำงาน ก็จะทำงานเสมือนเป็น Coreapp รองจนกว่าโหนด Master หลักจะเลื่อน Coreapp ดังกล่าวขึ้นมาเป็น Coreapp หลัก เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ของ WhatsApp หลังจากนั้น โหนดดังกล่าวจะมีหน้าที่รับผิดชอบการจัดการคำขอ API

การเฝ้าสังเกตแบบอิงฐานข้อมูล

แต่ละโหนด Coreapp จะอัพเดตฐานข้อมูลทุกนาทีเพื่อยืนยันการทำงาน โหนด Master หลักจะตรวจสอบฐานข้อมูลเป็นระยะเพื่อตรวจหาโหนด Coreapp ที่มีปัญหา หากโหนด Coreapp หลักไม่ได้อัพเดตฐานข้อมูลนานเกินกว่า 2 นาที โหนด Master หลักจะพิจารณาว่าโหนดดังกล่าวมีปัญหาและเลื่อนโหนด Coreapp อื่นๆ ขึ้นมาเป็นโหนดหลักแทน วิธีนี้จะหยุดการทำงานประมาณ 2 นาที

การเฝ้าสังเกตแบบอิงสัญญาณระยะสั้น

หากคลัสเตอร์มีโหนด Master ที่ทำงานมากกว่าหนึ่งโหนด การเฝ้าสังเกตแบบอิงสัญญาณระยะสั้นจะตรวจหาความขัดข้องของโหนดได้เร็วกว่าการเฝ้าสังเกตแบบอิงฐานข้อมูล ในการเฝ้าสังเกตแบบอิงสัญญาณระยะสั้น โหนด Master ทั้งหมดจะมีหน้าที่เฝ้าสังเกตโหนด Coreapp โดยจะส่งสัญญาณระยะสั้นไปยังโหนด Coreapp ทุกๆ 5 วินาที (กำหนดค่าโดย heartbeat_interval) หากโหนด Coreapp หลักไม่ตอบสนองต่อโหนด Master หลักและโหนด Master รองหนึ่งโหนดเป็นเวลา 30 วินาที (กำหนดค่าโดย unhealthy_interval) จะถือว่าโหนด Coreapp หลักดังกล่าวมีปัญหา และโหนด Master หลักจะเลื่อนระดับโหนด Coreapp รองที่ไม่มีปัญหาขึ้นมาเป็นโหนด Coreapp หลักแทน ทั้งนี้ โดยค่าเริ่มต้นแล้ว วิธีนี้จะส่งผลให้มีการหยุดทำงานประมาณ 30 วินาที คุณอาจลดค่า unhealthy_interval ได้หากต้องการให้เวลาหยุดทำงานน้อยลง ดูตัวอย่างเพย์โหลดได้ที่เอกสารประกอบเกี่ยวกับการตั้งค่า

การตั้งค่าเริ่มต้น

คลัสเตอร์ที่มีความพร้อมใช้งานสูงจะมีโหนดอยู่ 3 ประเภท ได้แก่ Webapp, Master และ Coreapp ซึ่งสามารถเริ่มงานแยกกันบนเครื่องคนละเครื่องได้ แต่จะต้องอยู่ในเครือข่ายเดียวกันเพื่อให้สามารถสื่อสารกันได้

โหนด Webapp มีหน้าที่ในการจัดการการเข้าใช้งาน API เช่นเดียวกับคอนเทนเนอร์ Webapp เดิม โหนด Coreapp มีหน้าที่ในการจัดการการรับส่งข้อความไปยังและจาก WhatsApp และสุดท้าย โหนด Master มีหน้าที่ในการเฝ้าสังเกตโหนด Coreapp ในคลัสเตอร์ ดังนั้นถ้าโหนด Coreapp หนึ่งหยุดทำงาน ก็จะมีการเปลี่ยนเส้นทางการรับส่งข้อมูลไปยังอีกโหนด Coreapp หนึ่งเพื่อให้มีความพร้อมใช้งานสูง อาจมีโหนด Webapp โหนด Coreapp และโหนด Master หลายโหนดในคลัสเตอร์

โหนดที่ใช้งานอยู่จะไม่เรียกว่าโหนด Slave อีกต่อไป โดยจะเรียกว่าโหนด Coreapp

หมายเหตุ: สำหรับสภาพแวดล้อมการใช้งานจริง ในกรณีส่วนใหญ่แล้ว ฐานข้อมูลควรทำงานบนเซิร์ฟเวอร์เครื่องจริงที่แยกจากคอนเทนเนอร์ Coreapp และ Webapp เพื่อให้มีความพร้อมใช้งานสูงอย่างแท้จริง ขอแนะนำให้ใช้คอนเทนเนอร์ Master, Webapp และ Coreapp บนเครื่องคนละเครื่องกัน

ตั้งค่าระบบไฟล์ที่ใช้ร่วมกันสำหรับข้อความสื่อ

ถ้าคุณไม่สนใจเกี่ยวกับข้อความสื่อ ให้ข้ามขั้นตอนนี้

เพื่อให้สามารถรองรับการส่ง/รับข้อความสื่อได้ จะต้องตั้งค่าระบบไฟล์ NFS และติดตั้งลงในไดเรกทอรีเฉพาะที่บนโหนด Webapp, Master และ Coreapp ทุกโหนด ตรวจสอบให้แน่ใจว่ามีการให้สิทธิ์ในการอ่าน/เขียนในไดเรกทอรีที่ใช้งานร่วมกัน

ตัวอย่างคำสั่งการติดตั้ง NFS:

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

การติดตั้งด้วย Docker Compose

คำแนะนำนี้จำเป็นต้องใช้ Docker ซึ่งเป็นแพลตฟอร์มคอนเทนเนอร์ที่ช่วยให้คุณเรียกใช้ไคลเอ็นต์ WhatsApp Business API ได้ นอกจากนี้ยังต้องมี Docker Compose ด้วย Docker Compose มาพร้อมกับ Docker สำหรับ macOS และ Windows แต่ต้องติดตั้งแยกต่างหากบน Linux

การตั้งค่าสำหรับผู้พัฒนาด้วยเซิร์ฟเวอร์เดียว

  1. ติดตั้ง Docker บนระบบของคุณ
  2. หาก Docker Compose ไม่ได้มาพร้อมกับการติดตั้ง Docker ให้ทำการติดตั้ง
  3. ดาวน์โหลดไฟล์การกำหนดค่า multiconnect-compose.yml และ db.env ที่ WhatsApp_Configuration_Files.zip
  4. เปิดคอนโซลและไปที่ไดเรกทอรีที่คุณได้บันทึกไฟล์ที่ดาวน์โหลดมา
  5. หากคุณมีการติดตั้ง MySQL ที่กำลังทำงานอยู่ ให้เปลี่ยนค่าในไฟล์ db.env ให้สอดคล้องกับการกำหนดค่า MySQL ของคุณ หากคุณไม่ได้ติดตั้ง MySQL ไว้ ไฟล์ multiconnect-compose.yml และ db.env จะมีการกำหนดค่าเริ่มต้นเพื่อแสดงอินสแตนซ์ในคอนเทนเนอร์เฉพาะที่
  6. ตรวจสอบให้แน่ใจว่าไม่มีคอนเทนเนอร์แบบเชื่อมต่อครั้งเดียวทำงานอยู่ ก่อนที่จะเริ่มใช้งานคอนเทนเนอร์หลายตัวสำหรับความพร้อมใช้งานสูง
      docker-compose -f your-single-connect-yml-filename stop
    
  7. เรียกใช้คำสั่งต่อไปนี้ในคอนโซล
    docker-compose -f multiconnect-compose.yml up
    คุณจะได้ผลลัพธ์บางอย่างในขณะที่สคริปต์ดาวน์โหลดรูปภาพ Docker และตั้งค่าทุกอย่างให้คุณ หากต้องการให้คอนเทนเนอร์ทำงานในพื้นหลัง ให้ใช้พารามิเตอร์ -d ดังนี้
    docker-compose -f multiconnect-compose.yml up -d

เมื่อคุณทำตามขั้นตอนเหล่านี้เสร็จแล้ว ให้ตรวจสอบให้แน่ใจว่าคอนเทนเนอร์กำลังทำงานอยู่โดยใช้คำสั่งต่อไปนี้

docker-compose ps

โดยค่าเริ่มต้น คอนเทนเนอร์ Webapp จะทำงานบนพอร์ต 9090

การตั้งค่าการใช้งานจริงกับเซิร์ฟเวอร์หลายตัวสำหรับแต่ละคอนเทนเนอร์

  1. ติดตั้ง Docker ในระบบของคุณ
  2. หาก Docker Compose ไม่ได้มาพร้อมกับการติดตั้ง Docker ให้ทำการติดตั้ง
  3. ดาวน์โหลดไฟล์การกำหนดค่า multiconnect-coreapp.yml, multiconnect-master.yml, multiconnect-webapp.yml และ db.env ที่ WhatsApp_Configuration_Files.zip แล้วบันทึกแต่ละไฟล์ลงในเซิร์ฟเวอร์ที่เกี่ยวข้องกับไฟล์นั้นๆ
  4. เปิดเซิร์ฟเวอร์แต่ละเซิร์ฟเวอร์ เปิดคอนโซล และไปที่ไดเรกทอรีที่คุณได้บันทึกไฟล์ที่ดาวน์โหลดมา
  5. ในการตั้งค่าการใช้งานจริง เราขอแนะนำให้คุณใช้อินสแตนซ์ MySQL แบบสแตนด์อโลน เมื่อคุณมีอินสแตนซ์ดังกล่าวแล้ว ให้เปลี่ยนค่าในไฟล์ db.env ให้สอดคล้องกับการกำหนดค่า MySQL ของคุณ
  6. ตรวจสอบให้แน่ใจว่าไม่มีคอนเทนเนอร์แบบเชื่อมต่อครั้งเดียวทำงานอยู่ ก่อนที่จะเริ่มใช้งานคอนเทนเนอร์หลายตัวสำหรับความพร้อมใช้งานสูง
    docker-compose -f your-single-connect-yml-filename stop
    
  7. เรียกใช้คำสั่งต่อไปนี้ในคอนโซลสำหรับเครื่องที่เกี่ยวข้องแต่ละเครื่อง

    ตัวแปรสภาพแวดล้อม EXTERNAL_HOSTNAME ควรเป็นที่อยู่ IP หรือชื่อโฮสต์ที่สามารถเข้าถึงได้จากเครื่องที่เรียกใช้คอนเทนเนอร์อื่นๆ พอร์ตที่ได้รับการแสดง (Expose) ในไฟล์ YML ของบริการควรเปิดรับการเชื่อมต่อต่างๆ จากเครื่องที่เรียกใช้คอนเทนเนอร์อื่นๆ ตัวอย่างเช่น พอร์ตที่กำหนดให้เป็น COREAPP_EXTERNAL_PORTS ใน multiconnect-coreapp.yml จะต้องเปิดไว้สำหรับการรับส่งข้อมูลขาเข้าบนโฮสต์ที่เรียกใช้คอนเทนเนอร์ 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

โดยค่าเริ่มต้น การเรียกใช้อินสแตนซ์หลายรายการจากบริการเดียวกัน (เช่น การเรียกใช้ Coreapp 2 รายการบนโฮสต์เดียวกัน) จะไม่ทำงานเนื่องจากมีการขัดแย้งกันเกี่ยวกับพอร์ตของโฮสต์ ทั้งนี้ เพื่อหลีกเลี่ยงไม่ให้พอร์ตมีการขัดแย้งกัน คุณจำเป็นต้องแก้ไขไฟล์ YML ของบริการที่เกี่ยวข้อง โดยในกรณีนี้คือไฟล์ multiconnect-coreapp.yml เพื่อแสดง (Expose) พอร์ตของโฮสต์ที่แตกต่างกันสำหรับอินสแตนซ์แต่ละรายการดังนี้

พอร์ต:
- "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

Bind Mount (การติดตั้งแบบเชื่อมโยง)

เราขอแนะนำให้ใช้วิธีนี้เฉพาะในกรณีที่คุณต้องการรักษาไดรฟ์ข้อมูลแบบ Bind Mount (การติดตั้งแบบเชื่อมโยง) ที่มีอยู่เอาไว้

หากคุณต้องการติดตั้งพาธของโฮสต์ (ตำแหน่งที่มีอยู่บนโฮสต์ของคุณ) ในคอนเทนเนอร์โดยตรง คุณสามารถทำได้โดยเปลี่ยนบรรทัดไดรฟ์ข้อมูลในส่วนบริการให้ชี้ไปยังพาธของโฮสต์

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