Khám phá Plugin Clone trong MySQL 8.0: Cơ chế và Ứng dụng Thực tế

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_path phải đồng nhất
  • Character set và collation phải khớp
  • max_allowed_packet tố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

ParameterMô tảGiá trị mặc định
clone_autotune_concurrencyTự động điều chỉnh số threadON
clone_block_ddlKhóa DDL trên DonorOFF
clone_buffer_sizeKích thước buffer clone4M
clone_ddl_timeoutThời gian chờ backup lock300s
clone_enable_compressionBật nén khi truyền dữ liệuOFF
clone_max_concurrencySố thread tối đa16
clone_max_data_bandwidthGiới hạn tốc độ copy (MB/s)0 (không giới hạn)
clone_max_network_bandwidthGiới hạn băng thông mạng (MiB/s)0 (không giới hạn)
clone_valid_Donor_listDanh sách Donor được phépEmpty

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.

Thẻ: MySQL 8.0 Clone Plugin innodb Database Backup replication

Đăng vào ngày 17 tháng 6 lúc 19:21