Cách thiết lập MySQL Master-Master Replication

theanh

Administrator
Nhân viên
Bài viết này tổng hợp thông tin từ nhiều nguồn thành định dạng mà tôi sử dụng để thiết lập MySQL Master/Master Replication. Điểm tuyệt vời của Linux và mã nguồn mở là có nhiều cách khác nhau để thực hiện việc này. Vui lòng xem qua các tài liệu tham khảo của tôi và sử dụng chúng để đáp ứng mọi nhu cầu của bạn. Nếu bạn có bất kỳ câu hỏi nào hoặc gặp phải bất kỳ vấn đề nào, vui lòng gửi cho tôi một dòng trong phần bình luận.


Assumptions​

Bài viết này giả định rằng bạn đã cài đặt MySQL trên mỗi máy chủ của mình. Nếu chưa, bạn có thể dễ dàng thực hiện thông qua trang web MySQL tại https://www.mysql.org/downloads. Bài viết này chưa được thử nghiệm trên MariaDB nhưng có thể sử dụng được nếu bạn thích sử dụng MariaDB.


Đổi SELINUX thành permissive (nếu đã cài đặt)​

Server A
Mã:
[root@mysqla ~]# vi /etc/selinux/config
Mã:
# Tệp này kiểm soát trạng thái của SELinux trên hệ thống.# SELINUX= có thể lấy một trong ba giá trị sau:# enforcing - Chính sách bảo mật SELinux được thực thi.# permissive - SELinux in cảnh báo thay vì thực thi.# disabled - Không có chính sách SELinux nào được tải.SELINUX=permissive# SELINUXTYPE= có thể lấy một trong hai giá trị sau:# targeted - Các quy trình mục tiêu được bảo vệ,# mls - Bảo vệ Bảo mật Đa cấp.SELINUXTYPE=targeted
Server B
Mã:
[root@mysqlb ~]# vi /etc/selinux/config
Mã:
# Tệp này kiểm soát trạng thái của SELinux trên hệ thống.# SELINUX= có thể lấy một trong ba giá trị sau:# enforcing - Chính sách bảo mật SELinux được thực thi.# permissive - SELinux in cảnh báo thay vì thực thi.# disabled - Không có chính sách SELinux nào được tải.SELINUX=permissive# SELINUXTYPE= có thể lấy một trong hai giá trị sau:# targeted - Các quy trình mục tiêu được bảo vệ,# mls - Bảo vệ Bảo mật Đa cấp.SELINUXTYPE=targeted

Dừng và vô hiệu hóa firewalld trên mỗi máy chủ​

Máy chủ A
Mã:
[root@mysqla ~]# systemctl stop firewalld
[root@mysqla ~]# systemctl disable firewalld
Chạy lệnh sau để đảm bảo không có quy tắc tường lửa nào
Mã:
[root@mysqla ~]# iptables -L
Kết quả sẽ như sau:
Mã:
Chain INPUT (policy ACCEPT)
target prot opt source destination
 
Chain FORWARD (policy ACCEPT)
target prot opt source destination
 
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Máy chủ B
Mã:
[root@mysqlb ~]# systemctl stop firewalld
[root@mysqlb ~]# systemctl disable firewalld
Chạy lệnh sau để đảm bảo không có quy tắc tường lửa nào.
Mã:
[root@mysqlb ~]# iptables -L
Kết quả sẽ như sau:
Mã:
Chain INPUT (policy ACCEPT)
target prot opt source destination
 
Chain FORWARD (policy ACCEPT)
target prot opt source destination
 
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chỉnh sửa /etc/my.cnf trên cả hai máy chủ​

Thêm thông tin sau vào cuối [mysqld] section

Máy chủ A
Mã:
[root@mysqla ~]# vi /etc/my.cnf
Mã:
server-id=1 log-bin="mysql-bin" binlog-do-db=tên_của_cơ_sở_dữ_liệu replicate-do-db=tên_của_cơ_sở_dữ_liệu relay-log="mysql-relay-log" auto-increment-offset = 1
Máy chủ B
Mã:
[root@mysqlb ~]# vi /etc/my.cnf
Mã:
server-id=2 log-bin="mysql-bin" binlog-do-db=tên_của_cơ_sở_dữ_liệu replicate-do-db=tên_của_cơ_sở_dữ_liệu relay-log="mysql-relay-log" auto-increment-offset = 2
Hãy đảm bảo rằng bạn thay thế name_of_database bằng tên của cơ sở dữ liệu mà bạn muốn sao chép


Máy chủ A
Mã:
[root@mysqla ~]# systemctl restart mysqld
Mã:
[root@mysqla ~]# systemctl enable mysqld

Máy chủ B
Mã:
[root@mysqlb ~]# systemctl restart mysqld
Mã:
[root@mysqlb ~]# systemctl enable mysqld

Tạo người dùng sao chép trên mỗi máy chủ​

Mã:
[root@mysqla ~]# mysql -u root -p
 
mysql> TẠO NGƯỜI DÙNG 'replicator'@'%' ĐƯỢC XÁC ĐỊNH BỞI 'change_me';
mysql> CẤP PHÉP SAO CHÉP SLAVE TRÊN foo.* CHO 'replicator'@'%'
Mã:
[root@mysqlb ~]# mysql -u root -p
 
mysql> TẠO NGƯỜI DÙNG 'replicator'@'%' ĐƯỢC XÁC ĐỊNH BỞI 'change_me';
mysql> CẤP QUYỀN SAO CHÉP SLAVE TRÊN foo.* CHO 'replicator'@'%'

Lấy thông tin tệp nhật ký để sử dụng trên máy chủ khác​

Máy chủ A
Mã:
[root@mysqla ~]# mysql -u root -p
 
mysql> HIỂN THỊ TRẠNG THÁI CHÍNH;
 
+------------------+----------+------------------+
| Tệp | Vị trí | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+------------------+------------------+
| mysql-bin.000001 | 154 | name_of_database | |
+------------------+----------+------------------+------------------+
1 hàng trong tập hợp (0,00 giây)
Lưu ý "Tệp" và "Vị trí" từ lệnh này

Máy chủ B
Mã:
[root@mysqlb ~]# mysql -u root -p
 
mysql> STOP SLAVE;
 
mysql> THAY ĐỔI MASTER THÀNH MASTER_HOST = 'Địa chỉ IP hoặc TÊN MÁY CHỦ của Máy chủ A', MASTER_USER = 'replicator', MASTER_PASSWORD = 'change_me', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 154;
mysql> START SLAVE;
Lặp lại các bước tương tự trên Máy chủ B

Máy chủ B
Mã:
[root@mysqlb ~]# mysql -u root -p mysql> SHOW MASTER STATUS;
 
+------------------+----------+------------------+
| Tệp | Vị trí | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+------------------+
| mysql-bin.000001 | 154 | name_of_database | |
+-----------------+----------+-------------------+------------------+
1 hàng trong tập hợp (0,00 giây)
Lưu ý "File" và "Position" từ lệnh này

Máy chủ A
Mã:
[root@mysqla ~]# mysql -u root -p 
 
mysql> DỪNG SLAVE; THAY ĐỔI MASTER THÀNH MASTER_HOST = 'Địa chỉ IP hoặc TÊN MÁY CHỦ của Máy chủ B', MASTER_USER = 'replicator', MASTER_PASSWORD = 'passw0rd', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 154; 
mysql> KHỞI ĐỘNG SLAVE;

Khởi động lại cả hai máy chủ​

Máy chủ A
Mã:
[root@mysqla ~]# systemctl reboot
Máy chủ B
Mã:
[root@mysqlb ~]# systemctl reboot

Trên bất kỳ máy chủ nào, hãy tạo cơ sở dữ liệu của bạn​

Mã:
[root@mysqla ~]# mysql -u root -p 
 
mysql> TẠO CƠ SỞ DỮ LIỆU foo;

Trên máy chủ khác, hãy kiểm tra xem cơ sở dữ liệu có ở đó không​

Mã:
[root@mysqlb ~]# mysql -u root -p
 
mysql> HIỂN THỊ CƠ SỞ DỮ LIỆU; 
 
+---------------------+
| Cơ sở dữ liệu |
+---------------------+
| information_schema |
| foo |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 hàng trong tập hợp (0,00 giây)

Nguồn​

 
Back
Bên trên