Tại sao MariaDB Galera Cluster là lựa chọn hàng đầu cho Production?
Với dân vận hành hệ thống, cuộc gọi lúc 2 giờ sáng báo lỗi database luôn là nỗi ác mộng. Trong mô hình Master-Slave truyền thống, khi Master gặp sự cố, bạn phải tốn thời gian chuyển đổi sang Slave (failover). Quá trình này không chỉ gây downtime mà còn tiềm ẩn rủi ro mất dữ liệu nếu replication bị trễ.
MariaDB Galera Cluster thay đổi hoàn toàn cuộc chơi bằng kiến trúc Multi-master. Bạn có thể ghi dữ liệu vào bất kỳ node nào. Ngay lập tức, dữ liệu sẽ được đồng bộ sang các node còn lại. Nếu một server sập, ứng dụng vẫn hoạt động bình thường qua các node khác mà không cần can thiệp thủ công. Đây là cách nhanh nhất để đạt chuẩn High Availability (HA) thực thụ.
Khác với kiểu replication không đồng bộ, Galera sử dụng cơ chế Synchronous. Điều này đảm bảo không bao giờ có tình trạng lag dữ liệu giữa các máy chủ. Một khi transaction đã commit, nó chắc chắn đã tồn tại trên toàn bộ cluster.
Chuẩn bị hạ tầng và tài nguyên
Để tránh lỗi “Split-brain” (tình trạng các node mất liên lạc và tự tranh quyền làm chủ), hãy luôn sử dụng số lượng node lẻ. Mình khuyến nghị bắt đầu với ít nhất 3 node. Giả sử chúng ta có 3 server Ubuntu 22.04:
- Node 1: 192.168.1.10
- Node 2: 192.168.1.11
- Node 3: 192.168.1.12
Bước 1: Cài đặt MariaDB
Thực hiện cài đặt MariaDB server và thư viện Galera trên cả 3 server bằng các lệnh sau:
sudo apt update
sudo apt install -y mariadb-server mariadb-client galera-4
Tiếp theo, hãy bảo mật database bằng script mặc định của MariaDB:
sudo mysql_secure_installation
Bước 2: Cấu hình Firewall
Galera Cluster cần 4 port riêng biệt để duy trì kết nối và đồng bộ dữ liệu. Nếu bạn dùng UFW, hãy mở các port này ngay:
- 3306: MySQL/MariaDB traffic.
- 4567: Galera Cluster replication traffic.
- 4568: Incremental State Transfer (IST).
- 4444: State Snapshot Transfer (SST).
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
Thiết lập cấu hình Galera Cluster
Dừng dịch vụ MariaDB trên cả 3 node trước khi can thiệp vào file cấu hình:
sudo systemctl stop mariadb
Tạo file cấu hình mới tại /etc/mysql/conf.d/galera.cnf trên Node 1. Nội dung mẫu như sau:
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Cấu hình Galera Provider
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Cấu hình Cluster
wsrep_cluster_name="prod_cluster_01"
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.11,192.168.1.12"
# Cấu hình định danh Node
wsrep_node_address="192.168.1.10"
wsrep_node_name="node1"
wsrep_sst_method=rsync
Sao chép file này sang Node 2 và Node 3. Lưu ý: Bạn phải sửa lại wsrep_node_address và wsrep_node_name tương ứng với IP và tên của từng server.
Kinh nghiệm thực tế: Phương thức rsync rất ổn định cho database nhỏ. Tuy nhiên, nếu dữ liệu của bạn lớn hơn 100GB, hãy cân nhắc dùng mariabackup. Nó giúp các node join vào cluster mà không gây khóa bảng quá lâu.
Khởi chạy Cluster (Bootstrapping)
Đừng khởi động MariaDB theo cách thông thường trên tất cả các máy. Cluster cần một điểm mồi (seed) để bắt đầu. Trên Node 1, hãy chạy lệnh khởi tạo:
sudo galera_new_cluster
Sau khi Node 1 đã sẵn sàng, bạn lần lượt khởi động MariaDB trên Node 2 và Node 3:
sudo systemctl start mariadb
Các node này sẽ tự động tìm đến Node 1 dựa trên danh sách IP trong file cấu hình để đồng bộ dữ liệu ban đầu.
Kiểm tra trạng thái vận hành
Để xác nhận hệ thống đã thông suốt, hãy truy cập MariaDB và kiểm tra số lượng node hiện tại:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
Nếu kết quả trả về là 3, hệ thống của bạn đã sẵn sàng. Hãy thử tạo một database trên Node 1 và kiểm tra ở Node 3 để thấy sức mạnh của việc đồng bộ tức thì.
Mẹo xử lý dữ liệu đầu vào
Khi chuyển đổi từ hệ thống cũ, bạn thường phải xử lý lượng lớn dữ liệu từ CSV hoặc file dump. Để chuẩn hóa nhanh cấu trúc dữ liệu trước khi import, mình thường dùng công cụ convert CSV sang JSON. Việc này giúp kiểm tra tính toàn vẹn dữ liệu ngay trên trình duyệt, tiết kiệm đáng kể thời gian viết script xử lý thô.
Lưu ý quan trọng để tránh downtime
- Quorum (Số đông): Nếu 2 trong 3 node chết cùng lúc, node còn lại sẽ tự ngắt kết nối (Non-primary) để tránh sai lệch dữ liệu. Do đó, hãy ưu tiên số node lẻ như 3, 5 hoặc 7.
- Trạng thái Synced: Luôn theo dõi chỉ số
wsrep_local_state_comment. Trạng thái lý tưởng nhất phải làSynced. - Quản lý Traffic: Dù là multi-master, việc ghi đồng thời vào cùng một hàng từ nhiều node dễ gây Deadlock. Giải pháp tốt nhất là đặt ProxySQL hoặc HAProxy phía trước để điều phối traffic ghi vào một node cố định, các node còn lại đóng vai trò dự phòng và đọc dữ liệu.
Triển khai Galera Cluster không khó, cái khó là sự tỉ mỉ trong cấu hình mạng. Hy vọng hướng dẫn này giúp bạn tự tin hơn khi xây dựng hạ tầng database bền bỉ cho dự án.

