🔄 Replication MySQL
📋 Giới Thiệu
MySQL Replication cho phép sao chép dữ liệu t ừ một máy chủ MySQL (Primary) sang một hoặc nhiều máy chủ khác (Replica).
🛠️ Cấu Hình Primary Server
1. Chỉnh Sửa Cấu Hình MySQL
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Thêm/sửa các dòng sau:
# Lắng nghe tất cả địa chỉ IP
bind-address = 0.0.0.0
# ID duy nhất cho server
server-id = 101
# Kích hoạt binary logging
log_bin = /var/log/mysql/mysql-bin.log
# Kích hoạt plugin clone
plugin-load=mysql_clone.so
2. Khởi Động Lại MySQL và Kiểm Tra
sudo systemctl restart mysql
mysql -u root -p
mysql> STATUS;
--------------
mysql Ver 8.0.21-0ubuntu0.20.04.4 for Linux on x86_64 ((Ubuntu))
Connection id: 8
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Server version: 8.0.21-0ubuntu0.20.04.4 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
3. Tạo User Replication và Clone
# Tạo user replication
mysql> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.10 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO repl_user@'%';
Query OK, 0 rows affected (0.05 sec)
# Tạo user clone
mysql> CREATE USER 'clone_user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.07 sec)
mysql> GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';
Query OK, 0 rows affected (0.06 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
🔄 Cấu Hình Replica Server
1. Chỉnh Sửa Cấu Hình MySQL
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Thêm/sửa các dòng sau:
# Lắng nghe tất cả địa chỉ IP
bind-address = 0.0.0.0
# ID duy nhất cho server (khác với Primary)
server-id = 102
# Kích hoạt binary logging
log_bin = /var/log/mysql/mysql-bin.log
# Chế độ read-only
read_only = 1
# Cấu hình hostname
report-host = node01.srv.world
# Cấu hình relay logs
relay-log = /var/log/mysql/node01-relay-bin
relay-log-index = /var/log/mysql/node01-relay-bin.index
# Kích hoạt plugin clone
plugin-load=mysql_clone.so
2. Tạo User Clone trên Replica
mysql> CREATE USER 'clone_user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.07 sec)
mysql> GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'%';
Query OK, 0 rows affected (0.06 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
🚀 Thiết Lập Replication
1. Clone Dữ Liệu từ Primary
# Cấu hình donor list
mysql> SET GLOBAL clone_valid_donor_list = '10.0.0.30:3306';
Query OK, 0 rows affected (0.00 sec)
# Thực hiện clone
mysql> CLONE INSTANCE FROM clone_user@10.0.0.30:3306 IDENTIFIED BY 'password';
Query OK, 0 rows affected (3.01 sec)
# Kiểm tra trạng thái clone
mysql> SELECT ID, STATE, SOURCE, DESTINATION, BINLOG_FILE, BINLOG_POSITION
FROM performance_schema.clone_status;
+------+-----------+----------------+----------------+------------------+-----------------+
| ID | STATE | SOURCE | DESTINATION | BINLOG_FILE | BINLOG_POSITION |
+------+-----------+----------------+----------------+------------------+-----------------+
| 1 | Completed | 10.0.0.30:3306 | LOCAL INSTANCE | mysql-bin.000001 | 1405 |
+------+-----------+----------------+----------------+------------------+-----------------+
1 row in set (0.00 sec)
2. Cấu Hình và Khởi Động Replication
# Cấu hình kết nối tới Primary
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.30',
-> MASTER_USER='repl_user',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=1405;
Query OK, 0 rows affected (0.35 sec)
# Khởi động replication
mysql> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.13 sec)
# Kiểm tra trạng thái
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.30
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1405
Relay_Log_File: node01-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1405
Relay_Log_Space: 534
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Seconds_Behind_Master: 0
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 101
Master_UUID: c9329622-ecad-11ea-9043-525400ac8f06
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
⚠️ Lưu Ý Quan Trọng
-
Server ID:
- Mỗi server phải có ID duy nhất
- ID không được trùng lặp trong hệ thống
-
Binary Logging:
- Đảm bảo đủ dung lượng cho binary logs
- Cấu hình retention period phù hợp
-
Network:
- Kiểm tra kết nối giữa Primary và Replica
- Mở port MySQL (mặc định 3306)
🔍 Kiểm Tra Replication
1. Kiểm Tra Trạng Thái
-- Trên Replica Server
SHOW SLAVE STATUS\G
Các thông số quan trọng:
Slave_IO_Running
: Phải là "Yes"Slave_SQL_Running
: Phải là "Yes"Seconds_Behind_Master
: Độ trễ so với Primary
2. Kiểm Tra Đồng Bộ Dữ Liệu
-- Trên Primary
CREATE DATABASE test_repl;
CREATE TABLE test_repl.test (id INT);
INSERT INTO test_repl.test VALUES (1);
-- Trên Replica
SELECT * FROM test_repl.test;
🛠️ Xử Lý Sự Cố
1. Lỗi Kết Nối
-- Kiểm tra kết nối
SHOW PROCESSLIST;
-- Kiểm tra log
SHOW SLAVE STATUS\G
2. Lỗi Đồng Bộ
-- Dừng slave
STOP SLAVE;
-- Đặt lại vị trí đọc log
CHANGE MASTER TO MASTER_LOG_POS=position;
-- Khởi động lại
START SLAVE;