Hướng dẫn thiết lập MySQL Multi-Master Replication

Cập nhật

Nội dung bài viết chủ yếu được tham khảo từ www.digitalocean.com, nhưng tôi không sử dụng VPS của họ để demo. Thay vào đó, tôi dùng vagrant để mô phỏng.

Giới thiệu

Chúng ta sẽ thảo luận về việc mở rộng MySQL thông qua hai VPS. Trước đây, chúng ta đã đề cập đến việc thiết lập cân bằng tải giữa hai VPS bằng nginx. Bạn có thể xem lại bài viết đó.

MySQL Replication là quá trình sao chép dữ liệu từ một cơ sở dữ liệu duy nhất sang máy chủ khác theo thời gian thực. Cấu hình này được gọi là Master-Slave Replication. Đây là một cấu hình điển hình. Chúng ta sẽ có một giải pháp tốt hơn, đó là Multi-Master Replication (chủ-chủ), cho phép sao chép dữ liệu đến các máy chủ khác. Điểm khác biệt chính là nó cải thiện hiệu suất đọc ghi trên một máy chủ duy nhất. Cấu hình này giúp tăng dư thừa dữ liệu và cải thiện hiệu suất đọc.

Giả sử chúng ta có hai VPS với cấu hình như sau: Server CServer D.

  • Server C: 3.3.3.3
  • Server D: 4.4.4.4

Bước 1: Cài đặt và cấu hình MySQL trên Server C

Đầu tiên, cài đặt mysql-servermysql-client trên server bằng lệnh:

sudo apt-get install mysql-server mysql-client

Mặc định, MySQL chỉ chấp nhận kết nối từ localhost (127.0.0.1). Chúng ta cần sửa đổi cấu hình để thực hiện replication. Mở file /etc/mysql/my.cnf và chỉnh sửa các dòng sau:

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
#binlog_do_db           = include_database_name
bind-address            = 127.0.0.1

Dòng đầu tiên dùng để đánh dấu server hiện tại. Trong cấu hình MySQL Replication, chúng ta cần ID này, hãy bỏ comment. Dòng thứ hai chỉ định thư mục bin log. Dòng thứ ba chỉ định database cần đồng bộ. Bạn có thể chỉ định nhiều database, nhưng ở đây chúng ta chỉ cần một. Dòng cuối cùng xác định nơi kết nối được phép. Chúng ta không cần kết nối local, hãy comment nó lại.

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = example
# bind-address            = 127.0.0.1

Khởi động lại MySQL:

sudo service mysql restart

Tiếp theo, đăng nhập vào MySQL command line để chỉnh sửa một số cấu hình:

mysql -u root -p

Sau khi đăng nhập thành công, bạn sẽ thấy:

mysql>

Tạo một user để sao chép dữ liệu, đặt tên là replicator, mật khẩu tự chọn:

create user 'replicator'@'%' identified by 'password';

Cấp quyền sao chép cho user này:

grant replication slave on *.* to 'replicator'@'%';

User này chỉ có thể sao chép database đã được chỉ định trong file cấu hình, không phải tất cả các database.

Tiếp theo, lấy trạng thái hiện tại của MySQL server. Thông tin này sẽ được sử dụng để cấu hình Server D:

show master status;

Kết quả sẽ hiển thị như sau:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Bước 2: Cài đặt và cấu hình Server D

Các bước đầu tương tự: cài đặt MySQL server và client, sau đó chỉnh sửa file cấu hình /etc/mysql/my.cnf:

vim /etc/mysql/my.cnf

Có một số khác biệt so với Server C. Sửa nội dung thành:

server-id              = 2
log_bin                = /var/log/mysql/mysql-bin.log
binlog_do_db           = example
# bind-address            = 127.0.0.1

Khởi động lại MySQL và tạo user:

sudo service mysql restart
mysql -u root -p
create user 'replicator'@'%' identified by 'password';

Tiếp theo, tạo database example (database muốn đồng bộ) trên Server D:

create database example;

Cấp quyền sao chép cho user:

grant replication slave on *.* to 'replicator'@'%';

Đây là bước quan trọng nhất: kết nối hai server bằng thông tin lấy từ Server C. Trong MySQL client trên Server D, chạy lệnh sau:

slave stop;
change master to master_host = '3.3.3.3', master_user = 'replicator', master_password = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107;
slave start;

Giá trị MASTER_LOG_FILEMASTER_LOG_POS lấy từ kết quả show master status của Server C.

Lúc này, Server D đã kết nối với Server C. Giờ chúng ta cần kết nối ngược lại Server C với Server D. Lấy trạng thái master trên Server D:

show master status;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Bước 3: Hoàn tất replication trên Server C

Tương tự bước trên, thực hiện các lệnh sau trên Server C:

slave stop;
CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107;
slave start;

Lưu ý điều chỉnh thông tin từ show master status của Server D và mật khẩu của bạn.

Sau khi chạy lệnh, MySQL sẽ trả về thông báo:

Query OK, 0 rows affected (0.01 sec)

Đến đây, cấu hình đã hoàn tất.

Kiểm tra

Chúng ta có thể kiểm tra bằng cách tạo một bảng trên Server C và xóa nó trên Server D, sau đó kiểm tra xem bảng còn tồn tại trên Server C không.

create database example;
create table example.dummy (id varchar(10));

Trên Server D, kiểm tra xem bảng đã được sao chép chưa:

show tables in example;

Kết quả:

+-------------------+
| Tables_in_example |
+-------------------+
| dummy             |
+-------------------+
1 row in set (0.00 sec)

Trên Server D, xóa bảng:

drop table dummy;

Trên Server C, kiểm tra lại:

show tables;

Kết quả:

Empty set (0.00 sec)

Thẻ: mysql Multi-Master Replication Database Replication Linux Server MySQL Configuration

Đăng vào ngày 23 tháng 5 lúc 21:19