Skip to main content

🔄 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

  1. Server ID:

    • Mỗi server phải có ID duy nhất
    • ID không được trùng lặp trong hệ thống
  2. Binary Logging:

    • Đảm bảo đủ dung lượng cho binary logs
    • Cấu hình retention period phù hợp
  3. 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;

📚 Tài Liệu Tham Khảo