MySQL Group Replication (MGR) là một giải pháp sao chép nhóm được chính thức tích hợp depuis phiên bản 5.7.17, cung cấp khả năng sẵn sàng cao và mở rộng ngang cho cơ sở dữ liệu. Cơ chế này hoạt động dựa trên nguyên tắc đồng thuận đa số (tương tự Paxos), yêu cầu một giao dịch phải được xác nhận bởi quá bán số nút trong cụm (N/2 + 1) trước khi được commit. Để triển khai thành công MGR, hệ thống cần đáp ứng các điều kiện kỹ thuật sau:
- Bảng dữ liệu bắt buộc sử dụng storage engine InnoDB.
- Mọi bảng đều phải có Primary Key để hỗ trợ phát hiện xung đột write set.
- Không hỗ trợ ngoại khóa (foreign key) cascade và savepoint trong chế độ đa chủ.
- Bắt buộc bật GTID_MODE và cấu hình binlog_format = ROW.
- Không bật tính năng Replication event checksums cho binlog.
- Hạn chế sử dụng cấp độ cô lập SERIALIZABLE trong chế độ Multi-Primary.
- Hỗ trợ tối đa 9 nút trong một cụm và chỉ hoạt động trên giao thức IPv4.
1. Chuẩn bị hạ tầng
Triển khai cụm gồm 3 máy chủ ảo chạy hệ điều hành Ubuntu 22.04 LTS, mỗi máy đã cài đặt MySQL phiên bản 8.0.33. Cần cấu hình phân giải tên miền nội bộ trong file /etc/hosts để các nút có thể nhận diện nhau qua địa chỉ IP tĩnh.
# Cấu hình hosts cho 3 nút cụm
192.168.100.101 node1
192.168.100.102 node2
192.168.100.103 node3
Đảm bảo tường lửa đã được tắt hoặc mở cổng giao tiếp giữa ba máy chủ này để tránh bị chặn kết nối.
2. Cấu hình MySQL Server
Thực hiện chỉnh sửa file cấu hình my.cnf trên cả 3 nút. Các tham số cơ bản giữ nguyên, chỉ thay đổi server_id, report_host và địa chỉ giao tiếp nội bộ của từng nút. Port giao tiếp nhóm replication được đặt là 33062 để phân biệt với port MySQL mặc định.
Ví dụ cấu hình chi tiết cho nút đầu tiên (192.168.100.101):
[mysqld]
# Vô hiệu hóa các engine không tương thích
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# Định danh duy nhất cho server
server_id=101
report_host=192.168.100.101
# Cấu hình GTID bắt buộc
gtid_mode=ON
enforce_gtid_consistency=ON
# Cấu hình Binary Log
binlog_format=ROW
expire_logs_days=10
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performance_schema
binlog_ignore_db=sys
# Cấu hình Relay Log
relay_log_info_repository=TABLE
relay_log_recovery=1
log_slave_updates=ON
master_info_repository=TABLE
# Thuật toán hash cho write set extraction
transaction_write_set_extraction=XXHASH64
# Plugin Group Replication
plugin_load_add='group_replication.so'
# Tên nhóm replication (phải giống nhau trên tất cả các nút)
# Có thể tạo UUID mới bằng lệnh SELECT UUID();
group_replication_group_name="a1b2c3d4-5e6f-7890-abcd-ef1234567890"
# Không tự động start group khi boot để kiểm soát thủ công
group_replication_start_on_boot=OFF
# Địa chỉ IP và port giao tiếp nội bộ của nút này
group_replication_local_address="192.168.100.101:33062"
# Danh sách các seed member trong cụm
group_replication_group_seeds="192.168.100.101:33062,192.168.100.102:33062,192.168.100.103:33062"
# Whitelist IP cho phép tham gia nhóm
group_replication_ip_whitelist='192.168.100.101,192.168.100.102,192.168.100.103'
# Tắt chế độ bootstrap sau khi khởi tạo xong
group_replication_bootstrap_group=OFF
# Chế độ đơn chủ (Single Primary)
group_replication_single_primary_mode=ON
Sau khi lưu file, khởi động lại dịch vụ MySQL và kiểm tra trạng thái plugin:
sudo service mysql restart
mysql -u root -p
SHOW PLUGINS;
Nếu plugin group_replication chưa được load, có thể cài đặt thủ công qua câu lệnh SQL (yêu cầu restart sau đó):
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
3. Khởi tạo và Kết nối Cụm
Trên cả 3 nút, thực hiện tạo tài khoản đồng bộ dữ liệu và cấu hình kênh recovery. Lưu ý tắt binlog khi tạo user để tránh ghi log không cần thiết.
SET SQL_LOG_BIN=0;
CREATE USER 'mgr_sync'@'192.168.100.%' IDENTIFIED BY 'SecurePass#2024';
GRANT REPLICATION SLAVE ON *.* TO 'mgr_sync'@'192.168.100.%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
# Cấu hình kênh recovery cho group replication
CHANGE MASTER TO MASTER_USER='mgr_sync', MASTER_PASSWORD='SecurePass#2024' FOR CHANNEL 'group_replication_recovery';
Khởi động nhóm replication trên nút đầu tiên (node1) với vai trò là node khởi tạo (bootstrap):
# Bật chế độ đơn chủ (tùy chọn, mặc định là ON)
SET GLOBAL group_replication_single_primary_mode=ON;
# Kích hoạt chế độ bootstrap để tạo nhóm mới
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
# Tắt chế độ bootstrap ngay sau khi nhóm đã tạo thành công
SET GLOBAL group_replication_bootstrap_group=OFF;
Kiểm tra trạng thái các thành viên trong nhóm:
SELECT * FROM performance_schema.replication_group_members;
Tiếp tục khởi động dịch vụ trên 2 nút còn lại (node2 và node3) để gia nhập cụm:
START GROUP_REPLICATION;
Lưu ý xử lý lỗi: Nếu gặp lỗi liên quan đến asynchronous replication channels đang chạy (thường xảy ra nếu máy chủ từng được cấu hình làm slave trước đó), cần reset trạng thái replication cũ trước khi start group:
STOP SLAVE;
RESET MASTER;
START GROUP_REPLICATION;
Câu lệnh RESET MASTER sẽ xóa toàn bộ binlog hiện có, chỉ sử dụng trong môi trường thiết lập mới.
Để chuyển đổi sang chế độ đa chủ (Multi-Primary), cần cấu hình trên tất cả các nút:
SET GLOBAL group_replication_single_primary_mode=OFF;
SET GLOBAL group_replication_enforce_update_everywhere_checks=ON;
4. Giám sát và Kiểm thử
Thông tin vận hành của cụm MGR được lưu trữ trong cơ sở dữ liệu performance_schema. Các bảng quan trọng bao gồm:
replication_group_members: Hiển thị trạng thái từng nút (ONLINE, OFFLINE, RECOVERING, ERROR, UNREACHABLE).replication_group_member_stats: Thống kê số lượng giao dịch đã xác thực và áp dụng.replication_connection_status: Trạng thái kết nối và thread I/O.
USE performance_schema;
SHOW TABLES LIKE '%replication_group%';
Để kiểm tra khả năng chịu lỗi, thực hiện dừng dịch vụ group replication trên nút đang giữ vai trò Primary. Quan sát bảng replication_group_members trên các nút còn lại, trạng thái nút bị dừng sẽ chuyển sang OFFLINE và một nút khác sẽ được bầu chọn làm Primary mới. Khi khởi động lại dịch vụ trên nút cũ, nó sẽ tự động gia nhập lại cụm với vai trò là Secondary.