Giới thiệu tổng quan
Từ phiên bản 8.0.17, MySQL đã tích hợp tính năng clone plugin, hỗ trợ cả hai phương thức clone nội bộ và từ xa. Công cụ này giúp đơn giản hóa quy trình sao lưu dữ liệu và bổ sung node mới vào hệ thống replication.
Nguyên lý hoạt động
Cơ chế cốt lõi
Plugin clone được xây dựng dựa trên ba thành phần chính: Snapshot, Clone Handle và Task. Trong đó, Snapshot đóng vai trò quan trọng nhất với 5 giai đoạn xử lý:
- INIT: Khởi tạo đối tượng clone
- FILE COPY: Sao chép các file dữ liệu, kích hoạt Page Tracking
- PAGE COPY: Copy các dirty pages đã được theo dõi, bật Redo Archiving
- REDO COPY: Sao chép redo log từ file archive
- DONE: Hoàn tất và giải phóng tài nguyên
Mỗi giai đoạn được phân định rõ ràng thông qua LSN (Log Sequence Number):
- File copy: từ clone start lsn đến clone file end lsn
- Page copy: các dirty pages trong khoảng trên
- Redo copy: redo log từ clone file end lsn đến clone lsn
So sánh với Percona XtraBackup
Quá trình backup của PXB bao gồm: copy redo log, copy file InnoDB, lưu vị trí binary log (thông qua FTWRL), và copy các file không thuộc InnoDB.
Trong khi đó, clone plugin chỉ cần copy redo log đã được archive trong giai đoạn PAGE COPY, giúp rút ngắn thời gian đáng kể.
Ưu điểm nổi bật của clone plugin:
- Hỗ trợ PAGE COPY giảm lượng redo log cần backup
- Cơ chế Page Tracking theo dõi thay đổi LSN
- Redo Archiving tránh tình trạng redo log bị overwrite
Hiệu năng thực tế
Trong các thử nghiệm với 200 bảng, tổng dung lượng 24GB:
- Clone không nén: Chế độ Auto (tự động điều chỉnh thread) cho tốc độ tốt nhất. Băng thông tăng giúp giảm gần 50% thời gian
- Clone có nén: Thời gian tăng so với không nén, băng thông không ảnh hưởng đáng kể
- PXB không nén: Clone nhanh hơn khi dùng trên 2 thread
- PXB có nén: Hoàn thành nhanh hơn so với không nén, băng thông không phải yếu tố giới hạn
Hạn chế cần lưu ý
- Tương thích phiên bản: Không hỗ trợ clone giữa các major version khác nhau. Từ 8.0.37 cho phép clone giữa các minor version
- DDL trong quá trình clone: Trước 8.0.27 sẽ block DDL, từ 8.0.27 có thể cấu hình qua
clone_block_ddl - Single instance: Chỉ clone một instance tại mỗi thời điểm
- Port restriction: Không dùng mysqlx_port (33060) cho remote clone
- Configuration: Recipient giữ nguyên cấu hình, không clone parameter từ Donor
- Binary log: Không clone binlog từ Donor
- Storage engine: Chỉ clone dữ liệu InnoDB, các engine khác chỉ copy structure
- MySQL Router: Không hỗ trợ kết nối qua Router đến Donor
- Absolute path: Đường dẫn tuyệt đối cần tồn tại và có quyền ghi khi remote clone
Yêu cầu bổ sung:
- Disk space đủ trên Recipient
- Các parameter InnoDB như
innodb_page_size,innodb_data_file_pathphải đồng nhất - Character set và collation phải khớp
max_allowed_packettối thiểu 2MB cho remote clone- OS của Donor và Recipient phải giống nhau
Các tham số cấu hình
| Parameter | Mô tả | Giá trị mặc định |
|---|---|---|
| clone_autotune_concurrency | Tự động điều chỉnh số thread | ON |
| clone_block_ddl | Khóa DDL trên Donor | OFF |
| clone_buffer_size | Kích thước buffer clone | 4M |
| clone_ddl_timeout | Thời gian chờ backup lock | 300s |
| clone_enable_compression | Bật nén khi truyền dữ liệu | OFF |
| clone_max_concurrency | Số thread tối đa | 16 |
| clone_max_data_bandwidth | Giới hạn tốc độ copy (MB/s) | 0 (không giới hạn) |
| clone_max_network_bandwidth | Giới hạn băng thông mạng (MiB/s) | 0 (không giới hạn) |
| clone_valid_Donor_list | Danh sách Donor được phép | Empty |
Cài đặt plugin
-- Kiểm tra file plugin
$ ls /opt/mysql/lib/plugin/ | grep clone
mysql_clone.so
-- Cài đặt plugin
mysql> INSTALL PLUGIN CLONE SONAME "mysql_clone.so";
-- Xác nhận trạng thái
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM information_schema.plugins
WHERE PLUGIN_NAME = 'clone';
-- Tạo user và phân quyền
mysql> CREATE USER clone_admin IDENTIFIED BY 'secure_pass_2024';
mysql> GRANT BACKUP_ADMIN, CLONE_ADMIN, SHUTDOWN ON *.* TO clone_admin;
Thực hiện Local Clone
Cú pháp
CLONE LOCAL DATA DIRECTORY [=] 'target_path';
Lưu ý: Đường dẫn phải là absolute path và MySQL cần có quyền ghi. Thư mục đích không được tồn tại trước đó.
Ví dụ thực tế
-- Kiểm tra thư mục hiện tại
$ ls -l /data/mysql/
drwxr-xr-x data
drwxr-xr-x binlog
-- Thực hiện clone
mysql> CLONE LOCAL DATA DIRECTORY = '/data/mysql/cloned_data';
-- Xác nhận kết quả
$ ls -l /data/mysql/
drwxr-xr-x data
drwxr-xr-x binlog
drwxr-x--- cloned_data
-- Chuẩn bị config cho instance mới
$ cp /opt/mysql/etc/my.cnf /opt/mysql/etc/my_cloned.cnf
$ mkdir /data/mysql/binlog_cloned
-- Chỉnh sửa my_cloned.cnf (port, datadir, socket...)
-- Khởi động instance mới
$ /opt/mysql/bin/mysqld_safe --defaults-file=/opt/mysql/etc/my_cloned.cnf &
-- Kết nối và kiểm tra
$ mysql -uroot -p --socket=/data/mysql/cloned_data/mysql.sock -P3307
mysql> SHOW DATABASES;
Thực hiện Remote Clone
Cú pháp
CLONE INSTANCE FROM 'username'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'target_path']
[REQUIRE [NO] SSL];
Ví dụ thực tế
-- Cấu hình whitelist trên Recipient
mysql> SET GLOBAL clone_valid_Donor_list = '192.168.100.50:3306';
-- Thực hiện remote clone
mysql> CLONE INSTANCE FROM 'clone_admin'@'192.168.100.50':3306
IDENTIFIED BY 'secure_pass_2024'
DATA DIRECTORY = '/data/mysql/remote_clone';
-- Kiểm tra thư mục clone
$ ls -l /data/mysql/remote_clone/
drwxr-x--- #clone
-rw-r----- ibdata1
-rw-r----- ibdata2
drwxr-x--- #innodb_redo
drwxr-x--- mysql
drwxr-x--- sys
Thư mục #clone chứa:
- #view_progress: Theo dõi tiến độ clone
- #view_status: Trạng thái clone với thông tin binlog, GTID
- #status_in_progress: File tạm khi clone đang chạy
- #new_files: Danh sách file mới tạo
Giám sát quá trình Clone
Bảng performance_schema.clone_status
mysql> SELECT ID, STATE, SOURCE, DESTINATION, ERROR_NO,
BINLOG_FILE, BINLOG_POSITION, GTID_EXECUTED
FROM performance_schema.clone_status\G
-- Kết quả mẫu:
ID: 1
STATE: Completed
SOURCE: 192.168.100.50:3306
DESTINATION: /data/mysql/remote_clone/
ERROR_NO: 0
BINLOG_FILE: mysql-bin.000015
BINLOG_POSITION: 528491
GTID_EXECUTED: a1b2c3d4-1234-5678-9abc-def012345678:1-250000
Bảng performance_schema.clone_progress
mysql> SELECT STAGE, STATE, THREADS, DATA, NETWORK,
DATA_SPEED, NETWORK_SPEED
FROM performance_schema.clone_progress;
-- Các giai đoạn: DROP DATA, FILE COPY, PAGE COPY,
-- REDO COPY, FILE SYNC, RESTART, RECOVERY
Theo dõi qua Stage Events
-- Kích hoạt monitoring
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES'
WHERE NAME LIKE 'stage/innodb/clone%';
mysql> UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%stages%';
-- Xem tiến độ hiện tại
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
FROM performance_schema.events_stages_current
WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
-- Xem lịch sử
mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
FROM performance_schema.events_stages_history_long
WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
Thiết lập Replication từ Clone
MGR Cluster
mysql> CHANGE MASTER TO
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'repl_pass'
FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
Binlog Position-based
mysql> SELECT BINLOG_FILE, BINLOG_POSITION
FROM performance_schema.clone_status;
mysql> CHANGE MASTER TO
MASTER_HOST = 'donor_host',
MASTER_PORT = 3306,
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'repl_pass',
MASTER_LOG_FILE = 'mysql-bin.000015',
MASTER_LOG_POS = 528491;
mysql> START SLAVE;
GTID-based
mysql> CHANGE MASTER TO
MASTER_HOST = 'donor_host',
MASTER_PORT = 3306,
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'repl_pass',
MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
Xử lý lỗi thường gặp
Lỗi 1: Permission denied
ERROR 1006 (HY000): Can't create database (errno: 13 - Permission denied)
-- Giải pháp:
$ chown -R mysql:mysql /path/to/clone_dir
Lỗi 2: Directory exists
ERROR 1007 (HY000): Can't create database; database exists
-- Giải pháp: Đảm bảo thư mục đích không tồn tại trước khi clone
Lỗi 3: Donor not in whitelist
ERROR 3869 (HY000): Clone system configuration: [ip]:[port] is not found in clone_valid_Donor_list
-- Giải pháp:
mysql> SET GLOBAL clone_valid_Donor_list = '192.168.100.50:3306,192.168.100.51:3306';
Lỗi 4: Concurrent operations
ERROR 3634 (HY000): Too many concurrent clone operations. Maximum allowed - 1
-- Giải pháp: Chỉ một clone operation tại mỗi thời điểm
Nhật ký Clone trong Error Log
Các log quan trọng ghi nhận trong MySQL error log:
- Kết nối client và xác nhận từ source
- Kiểm tra phiên bản database
- Thực thi DROP DATA (xóa dữ liệu user cũ)
- Khởi tạo đối tượng clone
- Các giai đoạn FILE COPY, PAGE COPY, REDO COPY
- Hoàn tất snapshot
- Restart và recovery instance
Log cung cấp thông tin chi tiết về tiến độ, tốc độ truyền dữ liệu, số lượng thread, và các sự kiện quan trọng trong suốt quá trình clone.