Triển khai giải pháp ProxySQL cho cụm MySQL Master-Slave

ProxySQL là một middleware mã nguồn mở mạnh mẽ dành cho MySQL, hỗ trợ cân bằng tải, phân tách đọc ghi (Read/Write Splitting) và quản lý kết nối hiệu quả. Nội dung dưới đây hướng dẫn chi tiết cách cấu hình ProxySQL kết hợp với cụm MySQL Replication trên nền tảng Ubuntu 22.04.

1. Chuẩn bị môi trường và hạ tầng

Hệ thống thử nghiệm bao gồm 4 máy ảo chạy Ubuntu 22.04 với các địa chỉ IP dự kiến như sau:

  • 192.168.1.10: MySQL Master
  • 192.168.1.11: MySQL Slave 1
  • 192.168.1.12: MySQL Slave 2
  • 192.168.1.20: ProxySQL Node

Để tránh các vấn đề liên quan đến phân giải ngược DNS (DNS reverse lookup) gây chậm kết nối, hãy cập nhật file /etc/hosts trên tất cả các node:

192.168.1.10 master-node
192.168.1.11 slave-node-1
192.168.1.12 slave-node-2
192.168.1.20 proxysql-lb

2. Cấu hình các nút MySQL Server

2.1. Cài đặt và thiết lập quyền truy cập

Cài đặt MySQL Server trên cả Master và Slaves:

sudo apt update && sudo apt install mysql-server -y

Chỉnh sửa tệp cấu hình /etc/mysql/mysql.conf.d/mysqld.cnf để cho phép MySQL lắng nghe trên tất cả giao diện mạng:

bind-address = 0.0.0.0

2.2. Thiết lập Master-Slave Replication

Tại Master (192.168.1.10): Cấu hình server-id và bật log-bin.

[mysqld]
server-id = 10
log-bin = /var/log/mysql/mysql-bin.log
binlog-format = ROW

Khởi tạo tài khoản đồng bộ dữ liệu:

CREATE USER 'sync_user'@'192.168.1.%' IDENTIFIED BY 'PassSync@123';
GRANT REPLICATION SLAVE ON *.* TO 'sync_user'@'192.168.1.%';
FLUSH PRIVILEGES;

Tại Slaves (192.168.1.11 & 12): Cấu hình server-id duy nhất và bật chế độ chỉ đọc.

[mysqld]
server-id = 11 # Hoặc 12 cho Slave 2
read_only = 1

Thực hiện kết nối với Master (Sử dụng GET_MASTER_PUBLIC_KEY=1 cho MySQL 8.x):

CHANGE MASTER TO 
    MASTER_HOST='192.168.1.10',
    MASTER_USER='sync_user',
    MASTER_PASSWORD='PassSync@123',
    MASTER_AUTO_POSITION=1,
    GET_MASTER_PUBLIC_KEY=1;
START SLAVE;

3. Cài đặt và cấu hình ProxySQL

3.1. Cài đặt ProxySQL

Tải và cài đặt gói ProxySQL phù hợp:

wget https://github.com/sysown/proxysql/releases/download/v2.5.4/proxysql_2.5.4-ubuntu22_amd64.deb
sudo dpkg -i proxysql_2.5.4-ubuntu22_amd64.deb
sudo systemctl start proxysql

3.2. Cấu hình giao diện quản trị Admin

Truy cập vào giao diện quản trị của ProxySQL (mặc định cổng 6032):

mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='ProxyAdmin> '

Cập nhật phiên bản MySQL giả lập để tương thích với client:

UPDATE global_variables SET variable_value='8.0.33' WHERE variable_name='mysql-server_version';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

3.3. Cấu hình Monitoring cho ProxySQL

ProxySQL cần một tài khoản để kiểm tra trạng thái các node MySQL. Tạo tài khoản này trên tất cả các máy chủ MySQL:

CREATE USER 'monitor_user'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'MonPass@123';
GRANT REPLICATION CLIENT, SELECT ON *.* TO 'monitor_user'@'192.168.1.%';
FLUSH PRIVILEGES;

Quay lại giao diện ProxySQL Admin để cấu hình thông tin giám sát:

SET mysql-monitor_username='monitor_user';
SET mysql-monitor_password='MonPass@123';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

4. Phân tách Đọc/Ghi với Hostgroups

4.1. Định nghĩa Backend Servers

Thêm các node MySQL vào danh sách quản lý. Nhóm 1 dành cho ghi (Writer) và nhóm 2 dành cho đọc (Reader):

INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, '192.168.1.10', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '192.168.1.11', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (2, '192.168.1.12', 3306);

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

4.2. Cấu hình Replication Hostgroups

ProxySQL sẽ tự động di chuyển các node giữa các nhóm dựa trên giá trị read_only của MySQL:

INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup, comment) VALUES (1, 2, 'Main-Cluster');
LOAD MYSQL SERVERS TO RUNTIME;

4.3. Tạo người dùng ứng dụng

Tạo tài khoản ứng dụng trên MySQL Master (sẽ tự đồng bộ xuống Slaves):

CREATE USER 'app_db_user'@'%' IDENTIFIED WITH mysql_native_password BY 'AppSecret@456';
GRANT ALL PRIVILEGES ON *.* TO 'app_db_user'@'%';

Khai báo tài khoản này trong ProxySQL:

INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('app_db_user', 'AppSecret@456', 1);
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

5. Thiết lập Query Rules

Đây là bước then chốt để định tuyến các truy vấn SELECT sang nhóm Slaves và các lệnh thay đổi dữ liệu sang Master:

-- Chuyển các lệnh SELECT thông thường sang Reader Group (HG 2)
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT .*', 2, 1);

-- Chuyển các lệnh SELECT FOR UPDATE sang Writer Group (HG 1) để đảm bảo tính nhất quán
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (2, 1, '^SELECT .* FOR UPDATE', 1, 1);

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

6. Kiểm tra hoạt động

Sử dụng MySQL Client kết nối thông qua ProxySQL (cổng 6033) để kiểm tra việc phân phối truy vấn:

mysql -u app_db_user -pAppSecret@456 -h 192.168.1.20 -P6033 -e "SELECT @@server_id;"

Nếu cấu hình thành công, các lệnh SELECT liên tục sẽ trả về server_id của các Slave, trong khi các lệnh nằm trong Transaction hoặc lệnh INSERT/UPDATE sẽ tác động trực tiếp đến Master.

Thẻ: mysql proxysql database-replication high-availability load-balancing

Đăng vào ngày 16 tháng 6 lúc 21:51