Introduction
เอกสารนี้จะแนะนำการตั้งค่า LBaaS เพื่อทำ Load Balancing สำหรับการอ่านข้อมูลจาก MySQL Replicas (Slaves) โดยมีเป้าหมายเพื่อเพิ่ม performance ในการรองรับการอ่านจำนวนมาก (Read Scaling) และเพิ่มความพร้อมใช้งาน (High Availability) ให้กับระบบฐานข้อมูล โดยจะต้องมีระบบ MySQL ที่ตั้งค่า Master-Slave Replication ไว้เรียบร้อยแล้ว (มี Master 1 ตัว และ Slave อย่างน้อย 1 ตัว) ซึ่งต้องติดตั้ง MySQL Health Check สำหรับตรวจสอบสถานะความพร้อมของ MySQL Server (โดยเฉพาะ Slave/Replica) เพื่อให้ LBaaS สามารถตรวจสอบได้ว่า server ไหนพร้อมใช้งาน และตั้งค่า LBaaS บน Nipa Cloud Space เพื่อทำหน้าที่กระจาย request ไปยัง backend group ที่สร้างไว้ ในส่วนของการเชื่อมต่อสำหรับการเขียน (Write) client จะเชื่อมต่อ MySQL Master ผ่าน Listener Port 3306 และสำหรับการอ่าน (Read) client จะเชื่อมต่อ MySQL Replica ผ่าน Listener Port 3307
Prerequisite
มีการติดตั้ง mysql master-slave
มีการ create และ attach security group port 9200
Objective
เพื่อให้ mysql มี healthcheck ให้ตรวจสอบได้ว่าพร้อมรับ request จาก loadbalancer จีงจำเป็นต้องมี tool ในการเช็ค โดยจะเลือกใช้การติดตั้งผ่าน docker และ run container mysqlcheck ตรวจสอบสถานะ MySQL Slave ได้อย่างแม่นยำ สำหรับรัน Healthcheck script เพื่อตรวจสอบว่า replication ยังทำงาน (Slave_IO_Running
และ Slave_SQL_Running
เป็น Yes
) และ slave ไม่ lag จาก master ด้วย port 9200 ใช้เป็น port สำหรับ healthcheck จาก loadbalancer วิธีนี้ช่วยให้มั่นใจว่า client อ่านข้อมูลจาก slave ที่ sync อยู่เสมอ (HTTP respone 200) และยังสามารถทำ self-healing เมื่อมี connection timeout จากที่ตั้งค่าไว้ จะมีการ restart service MySQL แบบ automate ได้อีกด้วย
โดย Service mysqlcheck จะมี HTTP Response ดังนี้
not healthy (not sync, error)
Instructions
วิธีการติดตั้งให้ดำเนินการ ดังนี้
1. Create MySQL user
เพื่อให้ LoadBalancer สามารถ healthcheck ผ่าน command select ได้
Copy CREATE USER 'lb_heathcheck'@'%' IDENTIFIED WITH mysql_native_password BY 'your_secure_password';
GRANT SELECT ON performance_schema.* TO 'lb_heathcheck'@'%';
FLUSH PRIVILEGES;
2. ssh & install docker, docker-compose
ให้ ssh เข้าไปที่ mysql host และ install docker เพื่อจะทำเป็น healthcheck
Copy sudo apt update && sudo apt install docker.io docker-compose -y
3. create docker-compose file
สร้าง directory mysqlcheck แล้วสร้าง docker-compose.yaml file
Copy version: "3"
services:
mysqlcheck:
container_name: mysqlcheck
network_mode: host
restart: unless-stopped
volumes:
- /var/run/mysqld/:/var/run/mysqld/
image: registry.nipa.cloud/nipa-public-services/mysqlcheck:v1
environment:
MYSQL_USERNAME: lb_heathcheck ## mysql healthcheck user
MYSQL_PASSWORD: xxxxxx ## mysql healthcheck password
RESTART_ON_TIMEOUT: 'TRUE' ## enable/disable auto restart mysql
RESTART_MYSQL_TIMEOUT: '1800 ## timeout for call restart in second
CACHE_EXPIRE: '5' ## caching timeout second
HEALTHCHECK_PORT: '9200' ## binding port for script
4. docker-compose up
ทำการ docker-compose up เพื่อสร้าง container environment
Copy docker-compose up -d --build
5. verify docker ทำงานถูกต้อง
ตรวจสอบ service ว่าทำงานถูกต้องด้วย command
Slave Node:
expect response: (status code 200)
Copy {"message":"[Slave] MySQL Server Master-Slave is synced."}
Master Node:
expect response: (status code 200)
Copy {"message":"[Master] MySQL Server Master-Slave is available."}
6. create Loadalance (ต้องสร้างภายใน VPC Networking เดียวกันกับ database)
7. create backend group
สร้าง backend group สำหรับ role writer แล้วใช้ healthcheck แบบ http โดย check ไปที่ port 9200
สร้าง backend group สำหรับ role reader แล้วใช้ healthcheck แบบ http โดย check ไปที่ port 9200 โดย role reader จะมี Algorithm แบบ round robin และเพิ่ม Member List ของ slave host
เมื่อสร้างทั้งหมดจะได้ทั้ง role-writer และ role-reader
8. create listener
ให้ไปที่ tab Listener แล้วดำเนินการสร้าง role-writer โดยจะใช้ TCP port 3306
จากนั้นสร้าง role-reader โดยใช้ TCP port 3307
เมื่อสร้างเสร็จแล้วจะได้ทั้ง role-writer และ role-reader
9. verify via mysql login
ทดสอบเข้าใช้งานด้วยการใช้ mysql cli
Copy mysql -h${LoadBalancer_IP} -P${writer_port} -u${username} -p'${password} -e'select @@hostname'
Copy mysql -h${LoadBalancer_IP} -P${reader_port} -u${username} -p'${password} -e'select @@hostname'