Quick Start: Chạy thử MaxScale trong 5 phút với Docker
Để thấy ngay hiệu quả mà không cần cài đặt rườm rà, chúng ta sẽ dùng Docker Compose. Cách này giúp bạn dựng nhanh một cụm Lab gồm: 1 Master, 1 Slave và 1 MaxScale để test tính năng Read/Write Splitting.
Tạo file docker-compose.yml với nội dung sau:
version: '3.8'
services:
mysql-master:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: testdb
ports:
- "3306:3306"
mysql-slave:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: root_password
depends_on:
- mysql-master
maxscale:
image: mariadb/maxscale:latest
volumes:
- ./maxscale.cnf:/etc/maxscale.cnf
ports:
- "6033:6033" # Port ứng dụng kết nối
- "8989:8989" # Dashboard GUI
depends_on:
- mysql-master
- mysql-slave
Kích hoạt hệ thống bằng lệnh: docker-compose up -d. Giờ đây, bạn đã có một Proxy thông minh đứng trước Database. Mọi truy vấn gửi vào port 6033 sẽ được MaxScale tự động điều hướng đến node phù hợp.
Tại sao nên chọn MaxScale thay vì ProxySQL?
Quản lý Database Cluster thường gặp một bài toán khó. Làm sao để ứng dụng không cần quan tâm IP nào là Master (để ghi) hay Slave (để đọc)?
MaxScale là câu trả lời từ chính đội ngũ MariaDB. Dù cùng mục đích với ProxySQL, MaxScale ghi điểm nhờ cấu hình file .cnf tường minh, không cần thao tác qua interface SQLite phức tạp.
Thực tế tại một dự án E-commerce mình từng vận hành với 50GB dữ liệu, việc tách Read/Write giúp giảm tải Master tới 70%. Thay vì gồng mình gánh cả các query SELECT báo cáo nặng nề, Master lúc này chỉ tập trung xử lý Transaction. Mọi gánh nặng truy vấn được đẩy hết sang các Slave.
Cấu hình chi tiết MaxScale cho hệ thống MySQL
Bước đầu tiên, hãy tạo một User trên MySQL Master. User này cho phép MaxScale theo dõi (monitor) trạng thái sức khỏe của các node.
-- Chạy lệnh này trên MySQL Master
CREATE USER 'maxuser'@'%' IDENTIFIED BY 'password123';
GRANT SELECT ON mysql.user TO 'maxuser'@'%';
GRANT SELECT ON mysql.db TO 'maxuser'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxuser'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxuser'@'%';
GRANT REPLICATION CLIENT ON *.* TO 'maxuser'@'%';
FLUSH PRIVILEGES;
Tiếp theo, cấu hình file maxscale.cnf để kích hoạt bộ não điều hướng:
[maxscale]
threads=auto
# 1. Khai báo các node Database
[server1]
type=server
address=mysql-master
port=3306
protocol=MariaDBBackend
[server2]
type=server
address=mysql-slave
port=3306
protocol=MariaDBBackend
# 2. Monitor: Kiểm tra trạng thái node mỗi 2 giây
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2
user=maxuser
password=password123
monitor_interval=2s
# 3. Service: Tách luồng Đọc/Ghi tự động
[Read-Write-Service]
type=service
router=readwritesplit
servers=server1,server2
user=maxuser
password=password123
# 4. Listener: Cổng tiếp nhận từ App
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=6033
Cơ chế hoạt động bên trong:
- Monitor: Liên tục kiểm tra các node. Nếu Master gặp sự cố, MaxScale sẽ nhận diện và chặn luồng ghi để bảo vệ dữ liệu.
- Router (readwritesplit): Phân tích cú pháp SQL theo thời gian thực. Các lệnh
INSERT/UPDATE/DELETEđi tới Master, cònSELECTưu tiên sang Slave. - Listener: Điểm cuối (Endpoint) duy nhất. App chỉ cần một Connection String trỏ vào port 6033.
Xử lý triệt để độ trễ đồng bộ (Slave Lag)
Vấn đề gây đau đầu nhất là khi bạn vừa INSERT dữ liệu vào Master, nhưng ngay sau đó SELECT ở Slave lại chưa thấy gì do độ trễ đồng bộ.
MaxScale giải quyết việc này cực gọn bằng tham số trong [Read-Write-Service]:
[Read-Write-Service]
type=service
router=readwritesplit
max_slave_replication_lag=5
...
Với max_slave_replication_lag=5, nếu Slave chậm quá 5 giây, MaxScale sẽ tự động đẩy query đọc ngược về Master. Điều này đảm bảo User luôn thấy dữ liệu mới nhất khi hệ thống đang bị quá tải đồng bộ.
Kinh nghiệm thực chiến khi vận hành
Sau nhiều dự án triển khai Proxy, mình rút ra 3 lưu ý quan trọng:
- Bảo mật Dashboard: Giao diện Web (port 8989) mặc định dùng
admin/mariadb. Hãy đổi pass ngay hoặc dùng Firewall chặn đứng truy cập từ Internet. - Ép query chạy trên Master: Với các tác vụ nhạy cảm như kiểm tra số dư ví, hãy dùng SQL Hint:
/* maxscale route to master */ SELECT ...để lấy dữ liệu chính xác 100%. - Tận dụng Debug Log: Nếu thấy query đi sai hướng, hãy bật
log_debug=1. MaxScale sẽ giải thích chi tiết lý do nó chọn node đó trong log file.
Áp dụng MaxScale giúp hệ thống chịu tải tốt hơn và giải phóng Dev khỏi việc quản lý kết nối thủ công. Nếu gặp khó khăn trong quá trình cấu hình, đừng ngần ngại để lại bình luận phía dưới nhé!

