I. Khái niệm
GTID (Global Transaction Identifier) Replication là một tính năng trong MariaDB giúp đồng bộ dữ liệu giữa các máy chủ MariaDB trong môi trường replica. Nó sử dụng GTID để xác định một cách duy nhất các giao dịch trong hệ thống và đảm bảo rằng mọi giao dịch được sao chép đúng thứ tự trên các máy chủ replica.
GTID là một chuỗi số duy nhất đại diện cho mỗi giao dịch xảy ra trong hệ thống. Nó được tạo ra bằng cách kết hợp ID máy chủ (server ID) và số sequence. Với GTID, mỗi giao dịch được đánh dấu một cách duy nhất, không bị trùng lặp và không bị mất trong quá trình sao chép.
Với GTID Replication, quá trình sao chép dữ liệu giữa các máy chủ replica trở nên đơn giản hơn. Khi một giao dịch xảy ra trên máy chủ master, nó được gắn kết với một GTID và gửi đi đến các máy chủ replica. Các máy chủ replica sẽ nhận biết GTID mới và xác định xem liệu giao dịch đã được sao chép hay chưa. Nếu giao dịch chưa được sao chép, các máy chủ replica sẽ tự động sao chép và áp dụng giao dịch đó theo đúng thứ tự.
GTID Replication cung cấp tính năng tự động tái kết nối (automatic reconnection) trong trường hợp mất kết nối giữa các máy chủ replica và máy chủ master. Khi kết nối được khôi phục, các máy chủ replica sẽ tiếp tục sao chép từ vị trí cuối cùng được xác định bởi GTID, không cần phải quét lại toàn bộ log bin của máy chủ master.
GTID Replication cũng giúp đơn giản hóa quá trình thay thế máy chủ master. Khi bạn muốn thay đổi máy chủ master, bạn chỉ cần thay đổi server ID của máy chủ mới và các máy chủ replica sẽ tự động nhận biết và chuyển đổi sang sao chép từ máy chủ mới.
Tóm lại, GTID Replication trong MariaDB là một tính năng quan trọng giúp đồng bộ dữ liệu giữa các máy chủ replica. Nó cung cấp một cách duy nhất để xác định và sao chép các giao dịch, đảm bảo tính nhất quán và đúng thứ tự của dữ liệu trong môi trường replica.
II. Yêu cầu cơ bản
- 2 máy chủ (ở đây tôi dùng Ubuntu 20.04) cài phiên bản mariadb >= 10.5.x và thông nhau ở port 22 + 3306. Giá định PRIMARY có ip là 10.0.2.10 và REPLICA có ip là 10.0.2.20.
- 2 máy chủ còn trống vừa đủ dung lượng.
- 2 máy chủ đều cài các tool sau:
- zip.
- unzip.
- qpress (tải phiên bản tương thích với Ubuntu của bạn đang dùng tại Index of /pub/percona/tools/apt/pool/main/q/qpress/).
- Tạo ở máy PRIMARY 1 account chuyên đọc. Ở đây tôi ví dụ có 1 acc là replica và pass là mypasswordforrep.
III. Nếu bạn cài mới lần đầu (chưa có dữ liệu)
- B1. Sửa file /etc/mysql/mariadb.conf.d/50-server.cnf ở cả PRIMARY và REPLICA
[mysqld]
server_id=1 #add. Nếu là primary thì quy ước dùng số 1, nếu là replica tôi hay dùng số 100 trở lên. Số này phải khác nhau ở tất cả các master + replica
bind-address: 0.0.0.0 # edit
expire_logs_days = 5 # add or edit
character-set-server = utf8mb4 # add or edit
collation-server = utf8mb4_general_ci # add or edit
[mariadb-10.5]
log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 5 max_binlog_size = 2000M binlog_format = mixed
gtid_strict_mode=1
- B2. restart mariadb services ở cả PRIMARY và REPLICA
$ systemctl restart mariadb
- B3. ở REPLICA vào myql chạy lệnh sau
stop slave;
reset slave;
reset slave all;
reset master;
change master to master_host='10.0.2.10', master_port=3306, master_user='replica', master_password='mypasswordforrep', master_connect_retry=10;
set global read_only=1;
start slave;
Xong. Lúc này bạn chạy lệnh sau trong REPLICA để kiểm tra
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.2.10
Master_User: replica
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: dc1p-kpro-mariadb-02-bin.000186
Read_Master_Log_Pos: 231218477
Relay_Log_File: 10-12-53-23-relay-bin.000004
Relay_Log_Pos: 11564106
Relay_Master_Log_File: dc1p-kpro-mariadb-02-bin.000186
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: 24870862
Relay_Log_Space: 108255113
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 21440
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos: 0-104-123455811
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: optimistic
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: closing tables
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 28651
1 row in set (0.000 sec)
III. Nếu bạn cài thêm replica cho server đang chạy (đã có rất nhiều dữ liệu)
- B1. Sửa file /etc/mysql/mariadb.conf.d/50-server.cnf ở cả PRIMARY và REPLICA
[mysqld]
server_id=1 #add. Nếu là primary thì quy ước dùng số 1, nếu là replica tôi hay dùng số 100 trở lên. Số này phải khác nhau ở tất cả các master + replica
bind-address: 0.0.0.0 # edit
expire_logs_days = 5 # add or edit
character-set-server = utf8mb4 # add or edit
collation-server = utf8mb4_general_ci # add or edit
[mariadb-10.5]
log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 5 max_binlog_size = 2000M binlog_format = mixed
gtid_strict_mode=1
- B2. restart mariadb services ở cả PRIMARY và REPLICA
$ systemctl restart mariadb
- B3. Tạo backup ở PRIMARY
$ mkdir -p /mariadb/backup/
$ mariabackup --defaults-file=/etc/my.cnf --backup --compress \
--target-dir=/mariadb/backup/full_backup --user=replica \
--password=mypasswordforrep--backup --compress --parallel=4
- B4. zip cả thư mục /mariadb và copy qua máy khác. Giả định là bạn đã copy qua và giải nén vào thư mục /mariadb ở REPLICA . REPLICA nên xóa hết dữ liệu cũ để trống trơn như lúc mới cài mariadb.
- B5. dừng mariadb ở REPLICA. Các bước bên dưới thực hiện hoàn toàn ở REPLICA
$ systemctl stop mariadb
- B6. Sau khi giải nén /mariadb ở REPLICA bạn sẽ thấy rất nhiều file .qp . Đây là file nén được qpress (là pakage nén được mariabackup dùng mặc định) tạo ra. Chúng ta phải tiến hành giải nén và chuẩn bị để thành file mysql hiểu được qua lệnh
$ mariabackup --decompress --parallel=4 --remove-original --target-dir=/mariadb/backup/full_backup/
$ mariabackup --prepare --parallel=4 --target-dir=/mariadb/backup/full_backup/
- B7. Backup thư mục /var/lib/mysql/mysql và /var/lib/mysql/performance_schema ở REPLICA sang chỗ khác. Ví dụ tôi mv 2 thư mục trên sang thư mục /mysql_temp_backup/.
- B8. Copy bản backup từ máy chủ vào mysql ở REPLICA
$ mv /mariadb/backup/full_backup/* /var/lib/mysql
- B9. Tìm xem bản này đang dừng ở file và pos nào. Bạn để ý tới dòng sau binlog_pos = filename 'dc1p-kpro-mariadb-02-bin.000185', position '415'. Note filename và position lại lát nữa sẽ cần
$ cat /var/lib/mysql/xtrabackup_info
uuid = 8f58d986-1820-11ee-9c4f-005056a58b8f
name =
tool_name = mariabackup
tool_command = --defaults-file=/etc/mysql/my.cnf --backup --compress --target-dir=/mariadb/backup/full_backup --user=devops --password=... --backup --compress --parallel=4
tool_version = 10.5.16-MariaDB
ibbackup_version = 10.5.16-MariaDB
server_version = 10.5.16-MariaDB-1:10.5.16+maria~focal-log
start_time = 2023-07-01 22:01:54
end_time = 2023-07-01 22:04:21
lock_time = 0
binlog_pos = filename 'dc1p-kpro-mariadb-02-bin.000185', position '415', GTID of the last change '0-2-154303781' <-- remember *filename 'dc1p-kpro-mariadb-02-bin.000185', position '415'* for next step
innodb_from_lsn = 0
innodb_to_lsn = 186956083455
partial = N
incremental = N
format = file
compressed = compressed
- B10. copy lại 2 thư mục backup ở bước 7 về chỗ cũ
$ mv /mysql_temp_backup/* /var/lib/mysql
$ chown mysql /var/lib/mysql/*
- B11. bật lại mariadb
$ systemctl start mariadb
- B12. vào mariadb chạy các lệnh sau. Thay các thông số filename và position đã note ra ở bước 9 vào
stop slave;
reset slave;
reset slave all;
reset master;
change master to master_host='10.0.2.10', master_port=3306, master_user='replica', master_password='mypasswordforrep', master_log_file='dc1p-kpro-mariadb-02-bin.000185', master_log_pos=415 , master_connect_retry=10;
set global read_only=1;
start slave;
Done. Bạn có thể kiểm tra tình trạng bằng cách vào mariadb và gõ lệnh
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.2.10
Master_User: replica
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: dc1p-kpro-mariadb-02-bin.000186
Read_Master_Log_Pos: 231218477
Relay_Log_File: 10-12-53-23-relay-bin.000004
Relay_Log_Pos: 11564106
Relay_Master_Log_File: dc1p-kpro-mariadb-02-bin.000186
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: 24870862
Relay_Log_Space: 108255113
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 21440
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos: 0-104-123455811
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: optimistic
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: closing tables
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 28651
1 row in set (0.000 sec)