Đặt Vấn Đề
Khi thiết kế hệ thống, việc truy vấn vào cơ sở dữ liệu thường chiếm một phần lớn chi phí trong tổng thời gian xử lý của một yêu cầu. Do đó, việc tăng tốc độ truy vấn cơ sở dữ liệu đồng nghĩa với việc tối ưu hiệu suất của toàn hệ thống. Một ứng dụng hiệu suất tốt có khả năng truy xuất dữ liệu một cách nhanh chóng, giúp giảm độ trễ trong quá trình tương tác giữa người dùng và ứng dụng.
Để tăng tốc độ truy xuất dữ liệu, có hai phương pháp chính:
- Tối ưu câu truy vấn.
- Tăng cường phần cứng: mở rộng cơ sở dữ liệu theo chiều dọc hoặc chiều ngang.
Trong bài viết trước, chúng ta đã cài đặt mô hình replication cơ sở dữ liệu với MySQL, một phương pháp mở rộng theo chiều ngang. Hệ thống replication bao gồm một máy chủ chính (master) và nhiều máy chủ sao lưu (replica) đồng bộ dữ liệu với nhau. Người dùng có thể điều hướng các yêu cầu đọc/ghi đến các cơ sở dữ liệu phù hợp (ghi ở master, đọc ở slave) để cải thiện hiệu suất so với mô hình cơ sở dữ liệu đơn giản.
Mặc dù cách làm này giúp tăng hiệu suất, nhưng người dùng vẫn gặp khó khăn trong việc cấu hình ứng dụng để đọc và ghi đến nhiều cơ sở dữ liệu khác nhau. Điều này có thể tạo ra sự phức tạp hoặc ảnh hưởng đến tính năng hiện có, cũng như gây khó khăn trong việc mở rộng. Trong bài viết này, chúng ta sẽ mở rộng giải pháp trên thông qua việc sử dụng ProxySQL để giải quyết những nhược điểm đã nêu.
Nguyên Lý Thiết Kế
ProxySQL hoạt động tại tầng SQL, phối hợp với MySQL client để quản lý lưu lượng truy cập từ ứng dụng đến các máy chủ MySQL phía sau (backends). Ở đây, chúng ta sẽ dùng ProxySQL để phân chia các máy chủ MySQL thành các nhóm đọc và ghi, định nghĩa các quy tắc cho các nhóm này. Nhờ vào những quy tắc này, MySQL client sẽ điều hướng các câu truy vấn từ ứng dụng đến một trong các máy chủ MySQL tương ứng.
Chuẩn Bị Trước Khi Cài Đặt:
- Cài đặt sẵn một cơ sở dữ liệu MySQL với hai máy chủ sao lưu. Bạn có thể tự cài đặt theo hướng dẫn hoặc sử dụng dịch vụ của Sunteco để tạo cơ sở dữ liệu với replication dễ dàng. Tôi đã tạo sẵn cơ sở dữ liệu MySQL với hai replica bằng dịch vụ của Sunteco và sử dụng IP công cộng để cấu hình.
- Tạo một máy ảo (VM) với hệ điều hành Ubuntu để cài đặt ProxySQL. Sunteco cung cấp dịch vụ VM, giúp bạn nhanh chóng tạo máy ảo.
Các Bước Cài Đặt và Cấu Hình ProxySQL
Bước 1: Cài Đặt ProxySQL và MySQL Client
Truy cập vào máy chủ VM và chạy các câu lệnh sau để cài đặt ProxySQL:
sudo apt-get install -y --no-install-recommends lsb-release wget apt-transport-https ca-certificates gnupg
sudo wget -O - 'https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/repo_pub_key' | sudo apt-key add -
sudo echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/$(lsb_release -sc)/ ./ | sudo tee /etc/apt/sources.list.d/proxysql.list
sudo apt-get update
sudo apt-get install proxysql
Sau khi cài đặt, bạn cần kích hoạt và khởi động dịch vụ ProxySQL:
sudo systemctl enable proxysql
sudo systemctl start proxysql
sudo systemctl status proxysql
Tiếp theo, cài đặt MySQL client:
sudo apt-get update
sudo apt-get install mysql-client
Bước 2: Cấu Hình MySQL Server Backends
Kết nối tới giao diện quản trị của ProxySQL:
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt 'ProxySQL Admin> '
Sau đó, thêm các máy chủ MySQL vào ProxySQL bằng các câu lệnh sau:
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'10.254.216.153',3306);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'10.254.216.224',3306);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'10.254.216.73',3306);
Để kiểm tra các máy chủ MySQL vừa thêm:
SELECT * FROM mysql_servers;
Bước 3: Cấu Hình Giám Sát Cho Các MySQL Server Backends
Cấu hình giám sát giúp ProxySQL phân chia các máy chủ MySQL thành các nhóm phục vụ cho việc đọc và ghi. Truy cập vào MySQL master để tạo tài khoản giám sát:
mysql -h 10.254.216.153 -u root -p
Tiếp tục tạo và cấp quyền cho tài khoản giám sát:
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%';
Quay lại giao diện quản trị ProxySQL và cập nhật tài khoản:
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';
Lưu ý có thể điều chỉnh một số thông số giám sát:
UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');
Để áp dụng cấu hình và lưu lại trạng thái sau khi khởi động lại ProxySQL, thực hiện:
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
Cuối cùng, kiểm tra các thông số giám sát:
SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 3;
SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 3;
Tổng Kết
Với các bước cài đặt và cấu hình ProxySQL, chúng ta đã có một giải pháp tối ưu hóa và điều hướng truy vấn đến các máy chủ MySQL backends. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại ý kiến dưới bài viết để chúng ta có thể thảo luận thêm.
Tác Giả: Sang Lee - Thành viên của đội ngũ Kỹ thuật Sunteco
source: viblo