Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Replication trong cơ sở dữ liệu SQL là quá trình sao chép dữ liệu từ cơ sở dữ liệu nguồn sang một (hoặc nhiều) cơ sở dữ liệu khác và ngược lại. Dữ liệu từ một máy chủ cơ sở dữ liệu liên tục được sao chép sang một hoặc nhiều máy chủ. Bạn có thể sử dụng replication để phân phối và cân bằng yêu cầu qua một nhóm máy chủ được sao chép, cung cấp failover và tính sẵn sàng cao cho cơ sở dữ liệu MariaDB. MariaDB (và MySQL) cho phép sử dụng hai chế độ replication: Master-Master và Master-Slave. Trong bài viết này, chúng ta sẽ xem cách cấu hình cả hai loại replication MariaDB trên Linux CentOS 7.

Cài đặt MariaDB

Trước đây chúng ta đã xuất bản bài viết mô tả quy trình cài đặt MariaDB trên CentOS 7. Bạn có thể đọc theo liên kết: https://woshub.com/mariadb-install-configure-tunning-centos. Vì vậy, chúng ta sẽ không tập trung vào chính việc cài đặt MariaDB, mà chuyển sang cách cấu hình replication.

Cấu hình Master-Master Replication đơn giản trên MariaDB

Trong lược đồ replication Master-Master, bất kỳ máy chủ cơ sở dữ liệu MariaDB/MySQL nào cũng có thể được dùng cả để ghi và đọc dữ liệu. Replication dựa trên một file binlog đặc biệt, máy chủ Master lưu tất cả thao tác với cơ sở dữ liệu vào đó. Máy chủ Slave kết nối đến Master và áp dụng các lệnh vào cơ sở dữ liệu của mình.

1. MariaDB: Cấu hình máy chủ Master đầu tiên (Master-1)

Thêm các dòng sau vào file my.cnf trên máy chủ MariaDB đầu tiên:

#replication
server_id = 1
report_host = master
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

Cách cấu hình Replication Master-Master/Slave cho MariaDB

service mariadb restart

Tạo người dùng để cấu hình replication:

mysql
create user 'test_master'@'%' identified by 'test_master';
grant replication slave on *.* to 'test_master'@'%';

Để thêm Slave, chúng ta cần lấy dữ liệu bin_log từ máy chủ Master-1:

MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 664      |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

Cách cấu hình Replication Master-Master/Slave cho MariaDB

2. MariaDB: Cấu hình máy chủ Master thứ hai (Master-2)

Kết nối đến máy chủ MariaDB thứ hai, mở file my.cnf và thêm cấu hình sau:

#replication
server_id = 2
report_host = master2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Tạo người dùng mới trên máy chủ thứ hai:

create user 'test_master2'@'%' identified by 'test_master2';
grant replication slave on *.* to 'test_master2'@'%';

Lấy bin_log trên Master-2:

MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 667      |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

Hãy cấu hình kết nối giữa các máy chủ MariaDB trong cụm replication phần mềm của chúng ta:

Dừng slave:

STOP SLAVE;

Thêm Master-1 vào máy chủ thứ hai:

CHANGE MASTER TO MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=664;

Bắt đầu replication:

START SLAVE;

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Kết nối đến Master-1 và làm theo các bước tương tự, nhưng chỉ định thông tin về máy chủ thứ hai:

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.2.10.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=667;
START SLAVE;

Kiểm tra trạng thái máy chủ thứ hai:

show slave status \G

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Như bạn thấy trong ảnh chụp, có kết nối giữa hai máy chủ và không có lỗi xảy ra.

3. Cách kiểm tra Replication giữa các máy chủ MariaDB?

Sau đó, để đảm bảo replication giữa hai máy chủ MariaDB hoạt động ở chế độ master+master, chúng ta sẽ tạo cơ sở dữ liệu mới trên Master-1 và tạo bảng trong nó.

MariaDB [(none)]> create database master1;
MariaDB [(none)]> use master1;
MariaDB [master1]> CREATE TABLE hello (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Đảm bảo cơ sở dữ liệu này đã tự động replicate sang master thứ hai và chứa cùng bảng:

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master1            |
| mysql              |
| performance_schema |
+--------------------+
MariaDB [(none)]> use master1;
MariaDB [master1]> show tables;
+-------------------+
| Tables_in_master1 |
+-------------------+
| hello             |
+-------------------+

Cơ sở dữ liệu đã được tạo trên master thứ hai. Để kiểm tra chu trình đầy đủ, tạo bảng trong cơ sở dữ liệu Master1 trên master thứ hai và kiểm tra xem nó có xuất hiện trên máy chủ đầu tiên không.

MariaDB [master1]> CREATE TABLE hello_master1 (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );

Bảng hello_master1 đã được replicate sang máy chủ đầu tiên:

MariaDB [master1]> show tables;
+-------------------+
| Tables_in_master1 |
+-------------------+
| hello             |
| hello_master1     |
+-------------------+

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Như bạn thấy, bảng mới đã xuất hiện trên Master-1. Replication hoạt động.

Cách thiết lập Master-Slave Replication trong MariaDB?

Trong chế độ replication master-slave của MariaDB, một máy chủ đóng vai trò slave, và dữ liệu từ máy chủ Master liên tục được ghi vào nó. Tất cả thay đổi bạn làm trên máy chủ Slave sẽ không được chuyển sang máy chủ Master. Loại replication này linh hoạt hơn và được dùng nhiều hơn. Trong cấu hình này, bạn luôn có một máy chủ sao lưu với cơ sở dữ liệu cập nhật, và nếu máy chủ slave thất bại, Master sẽ không mất dữ liệu. Bạn cũng có thể phân phối tải cơ sở dữ liệu cho dự án sao cho ứng dụng sẽ đọc dữ liệu từ các máy chủ Slave và chỉ ghi dữ liệu vào máy chủ Master. Như vậy, bạn làm cho phản hồi cơ sở dữ liệu nhanh nhất có thể.

Khi cấu hình replication master+slave của cơ sở dữ liệu MariaDB, máy chủ master (master1) được cấu hình như đã mô tả ở trên.

Chuyển sang máy chủ slave. Thêm cấu hình sau vào file my.cnf của slave:

#replication
server_id = 2
report_host = slave2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

Khởi động lại dịch vụ MariaDB. Lấy thông tin bin_log từ máy chủ đầu tiên:

MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 664      |              |                  |
+--------------------+----------+--------------+------------------+

Chạy các lệnh sau trong console mariadb trên máy chủ slave:

MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='IP_master', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=664;
MariaDB [(none)]> START SLAVE;

Khi cấu hình replication cho cơ sở dữ liệu MariaDB hiện có, bạn phải đặt cơ sở dữ liệu vào chế độ chỉ đọc trước khi bắt đầu replication để số bin_log không bị cập nhật.

SET GLOBAL read_only = ON;

Bạn cũng phải tạo bản sao lưu bộ nhớ cơ sở dữ liệu và sử dụng nó để tải dữ liệu ban đầu vào MariaDB trên máy chủ slave.

Để kiểm tra trạng thái Slave: SHOW SLAVE STATUS\G;

Để tạo cơ sở dữ liệu trên Master:

MariaDB [(none)]> create database master_hello;

Đảm bảo cơ sở dữ liệu đã được tạo trên máy chủ Slave:

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| master_hello       |
| master_test        |
| mysql              |
| performance_schema |
| test               |
+--------------------+

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Tạo cơ sở dữ liệu trên máy chủ Slave và kiểm tra xem cơ sở dữ liệu có được replicate sang Master không.

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Như bạn thấy, chúng ta đã tạo cơ sở dữ liệu và nó tồn tại trên Slave. Hãy kiểm tra xem nó có xuất hiện trên Master không. Nó không có. Dữ liệu không được replicate từ slave sang master.

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Điều này có nghĩa là replication MariaDB chỉ hoạt động theo một chiều. Hãy làm thêm một kiểm tra và xóa cơ sở dữ liệu master_hello từ máy chủ Slave:

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Kiểm tra xem nó có bị xóa từ máy chủ Master không:

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Như bạn thấy, mọi thứ ổn và cơ sở dữ liệu vẫn tồn tại.

P. S.: Khi cấu hình replication mariadb, bạn có thể gặp một số cạm bẫy, phổ biến nhất là firewall. Mặc định, firewalld được cài trong CentOS, chặn cổng replication MariaDB (TCP 3396). Bạn có thể mở cổng bằng iptables, hoặc tắt firewall (không phải lựa chọn tốt nhất).

Địa chỉ IP mà cơ sở dữ liệu lắng nghe kết nối được chỉ định trong tham số bind-address trong my.cnf. Để cho phép kết nối cục bộ và bên ngoài, bạn phải comment dòng này và thêm quy tắc iptables cho phép kết nối từ IP master/slave đến cổng 3306.

iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP

Trong quá trình thiết lập ban đầu, tôi gặp vấn đề này, nhưng nó dễ dàng phát hiện. Nếu bạn chạy kiểm tra trạng thái Slave SHOW SLAVE STATUS\G, bạn sẽ thấy lỗi này:

Cách cấu hình Replication Master-Master/Slave cho MariaDB

Bạn có thể thêm một số tham số vào khối #replication trong file my.cnf. Dưới đây tôi đưa ra một số ví dụ và mô tả ngắn gọn các tham số hữu ích. Tôi sẽ đưa ra một số ví dụ về các chức năng khác có thể hữu ích khi cấu hình replication cơ sở dữ liệu mariadb.

  • server_id = 1 — chỉ định ID máy chủ, thường bắt đầu từ 1, nhưng bạn có thể dùng bất kỳ số nào không trùng với các máy chủ khác dùng cho replication.
  • report_host = master — thường chỉ định tên máy chủ, nhưng bạn có thể nhập địa chỉ IP thay thế.
  • log_bin = /var/lib/mysql/mariadb-bin — đường dẫn đến nhật ký cập nhật (log_bin).
  • log_bin_index = /var/lib/mysql/mariadb-bin.index — cho phép biết nhật ký nào đang hoạt động và nhật ký nào đã dùng trước đó.
  • relay_log = /var/lib/mysql/relay-bin
  • relay_log_index = /var/lib/mysql/relay-bin.index — là nhật ký replication.

Nếu bạn muốn cấu hình replica của một cơ sở dữ liệu cụ thể hoặc các cơ sở dữ liệu được chọn, dùng các tham số sau:

  • replicate-do-db = dbname — nếu cần nhiều cơ sở dữ liệu, chỉ định tên cách nhau bằng dấu phẩy.
  • binlog-ignore-db = dbname — để loại trừ một số cơ sở dữ liệu khỏi replication (thường loại trừ các cơ sở dữ liệu dịch vụ: information_schema, mysql và performance_schema).
  • expire_logs_days = 10 — đặt thời gian lưu trữ lịch sử cho bin_log, nơi 10 là số ngày nhật ký được lưu.
  • replicate-rewrite-db=dbmastername->dbslavename — nếu dữ liệu từ Master được ghi vào cơ sở dữ liệu với tên khác, bạn có thể đặt nó trong file cấu hình.

Cấu hình replication hoàn tất. Tôi nghĩ rằng sử dụng bài viết này, bạn sẽ có thể cấu hình replication MariaDB cả ở chế độ Master + Master và Master + Slave mà không gặp vấn đề gì.