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

6 năm trước

Trạng thái: Deprecated                                                                                                                                                          Hướng dẫn này không được chấp nhận và không còn được duy trì.Lý do: Hướng dẫn này trình bày một phương pháp lỗi thời để xây dựng một cấu trúc liên kết đa chủ. Vào thời điểm bài viết này được xuất bản lần đầu, sự sao chép nhóm vẫn chưa được thực hiện trong MySQL..

Giới thiệu

Phần thứ hai của "Scaling Web Applications" sẽ liệt kê các bước cần thiết để mở rộng triển khai mysql trên hai VPS.

MySQL replication là quá trình một tập dữ liệu duy nhất được lưu trữ trong CSDL MySQL, sẽ được sao chép trực tiếp đến máy chủ thứ hai. Cấu hình này, được gọi là "master-slave" replication, là một thiết lập điển hình. Thiết lập của chúng tôi sẽ tốt hơn thế, bởi vì master-master replication cho phép dữ liệu được sao chép từ máy chủ này sang máy chủ khác. Sự khác biệt tinh tế nhưng quan trọng này cho phép thực hiện đọc hoặc ghi mysql từ một trong hai máy chủ. Cấu hình này bổ sung thêm dự phòng và tăng hiệu quả khi xử lý việc truy cập dữ liệu.

Các ví dụ trong bài viết này sẽ dựa trên hai VPS, có tên là Server C và Server D.

Server C: 3.3.3.3

Server D: 4.4.4.4

 

Bước 1 - Cài đặt và định dạng MySQL trên Server C

Điều đầu tiên cần làm là cài đặt các gói mysql-server và mysql-client trên máy chủ bằng cách gõ như sau:

sudo apt-get install mysql-server mysql-client

Theo mặc định, quá trình mysql chỉ chấp nhận các kết nối trên localhost (127.0.0.1). Để thay đổi hành vi mặc định này và thay đổi một vài cài đặt khác cần thiết để nhân rộng hoạt động đúng, cần chỉnh sửa /etc/mysql/my.cnf trên Server C. Có bốn dòng cần phải thay đổi, hiện đang được thiết lập cho tiếp theo:

#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 của những dòng này là nhận dạng duy nhất máy chủ cụ thể, trong cấu hình sao chép. Chúng ta cần bỏ ghi chú dòng đó, bằng cách loại bỏ dấu "#" trước nó. Dòng thứ hai cho biết tệp trong đó các thay đổi đối với bất kỳ CSDL mysql hoặc bảng nào sẽ được ghi lại.

Dòng thứ ba chỉ ra CSDL muốn sao chép giữa các máy chủ của mình. Bạn có thể thêm bao nhiêu CSDL vào dòng này như bạn muốn. Bài viết sẽ sử dụng một CSDL duy nhất có tên là "example" cho mục đích đơn giản. Và dòng cuối cùng chấp nhận các kết nối từ internet (bằng cách không nghe trên 127.0.0.1).

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

Bây giờ cần khởi động lại mysql:

sudo service mysql restart

Tiếp theo cần thay đổi một số thiết lập dòng lệnh trong cá thể mysql. Quay lại trình bao của mình, chúng ta có thể truy cập root mysql user bằng cách gõ như sau:

mysql -u root -p 

Lưu ý rằng mật khẩu lệnh này nhắc bạn là của root mysql user, không phải là root user trên droplet. Để xác nhận rằng bạn đã đăng nhập vào mysql shell, dấu nhắc sẽ giống như sau.

mysql> 

Khi đã đăng nhập, chúng ta cần chạy một vài lệnh.

Chúng ta cần tạo pseudo-user được sử dụng để sao chép dữ liệu giữa hai VPS. Các ví dụ trong bài viết này giả định rằng bạn đặt tên cho user này là "replicator". Thay thế "password" bằng mật khẩu muốn sử dụng để nhân rộng.

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

Tiếp theo, cần cấp quyền cho user này để tái tạo dữ liệu mysql:

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

Không may rằng quyền nhân bản không thể được đưa ra trên per-database basis. User của bạn sẽ chỉ sao chép (các) CSDL mà chúng ta hướng dẫn trong tệp cấu hình của mình.

Đối với bước cuối cùng của cấu hình Server C ban đầu, chúng ta cần lấy một số thông tin về cá thể MySQL hiện tại cung cấp cho Server D.

Lệnh sau sẽ xuất ra một vài thông tin quan trọng, cần lưu ý:

show master status; 

Output sẽ giống như sau, và có hai mẩu thông tin quan trọng:

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

Chúng ta cần ghi chú tập tin và vị trí sẽ được sử dụng trong bước tiếp theo.

Bước 2 - Cài đặt và định dạng MySQL trên Server D

Chúng ta cần phải lặp lại các bước tương tựđã thực hiện trên Server C. Đầu tiên cần phải cài đặt nó, chúng ta có thể thực hiện với lệnh sau đây:

sudo apt-get install mysql-server mysql-client

Khi hai gói được cài đặt đúng, cần cấu hình nó theo cách tương tự như đã cấu hình Server C. Chúng ta sẽ bắt đầu bằng cách chỉnh sửa tập tin /etc/mysql/my.cnf.

sudo nano /etc/mysql/my.cnf

Chúng ta cần phải thay đổi bốn dòng giống nhau trong tệp cấu hình như đã thay đổi trước đó.

Các giá trị mặc định được liệt kê bên dưới, tiếp theo là các thay đổi cần thực hiện.

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

Chúng ta cần phải thay đổi bốn dòng này để phù hợp với các dòng bên dưới. Lưu ý rằng, không giống như Server C, không thể đặt id máy chủ cho Máy chủ D thành 1.

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

Sau khi lưu và thoát tệp đó, cần phải khởi động lại mysql:

sudo service mysql restart

Đã đến lúc đi vào vỏ mysql và thiết lập một số tùy chọn cấu hình khác.

mysql -u root -p 

Đầu tiên, như trên Server C, tạo ra pseudo-user chịu trách nhiệm sao chép. Thay thế "password" bằng mật khẩu bạn muốn sử dụng.

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

Tiếp theo, cần phải tạo CSDL sẽ tái tạo trên VPS của chúng ta.

create database example; 

Và cần cung cấp cho 'replication' user mới được tạo bản sao để nhân rộng nó.

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

Bước tiếp theo liên quan đến việc lấy thông tin mà đã lưu ý trước đó và áp dụng nó vào cá thể mysql. Điều này cho phép nhân rộng để bắt đầu. Sau đây sẽ được gõ vào vỏ mysql:

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; 

Bạn cần thay thế 'password' bằng mật khẩu đã chọn để nhân rộng. Giá trị đối với MASTERLOGFILE và MASTERLOGPOS có thể khác với các giá trị trên. Bạn nên sao chép các giá trị "SHOW MASTER STATUS" trả về trên Server C.

Điều cuối cùng phải làm trước khi hoàn thành mysql master-master replication là ghi lại tệp master log  và vị trí sử dụng để nhân bản theo hướng khác (từ Server D đến Server C).

Chúng ta có thể làm điều đó bằng cách gõ như sau:

SHOW MASTER STATUS; 

Output sẽ giống như sau:

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

Hãy lưu ý các tập tin và vị trí, vì chúng ta sẽ phải nhập chúng vào server C, để hoàn thành việc sao chép hai chiều.

Bước tiếp theo sẽ giải thích cách thực hiện điều đó.

Bước 3 - Hoàn thành Replication trên Server C

Quay lại Server C, cần kết thúc việc cấu hình sao chép trên dòng lệnh. Chạy lệnh này sẽ sao chép tất cả dữ liệu từ Server D.

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; 

Nhớ rằng các giá trị của bạn có thể khác với các giá trị trên. Vui lòng thay thế giá trị MASTER_PASSWORD bằng mật khẩu đã tạo khi thiết lập replication user.

Output sẽ giống như sau:

Query OK, 0 rows affected (0.01 sec)

Điều cuối cùng là kiểm tra bản sao đó đang hoạt động trên cả VPS. Bước cuối cùng sẽ giải thích một cách dễ dàng để kiểm tra cấu hình này.

 

Bước 4 - Kiểm tra Master-Master Replication

Bây giờ có các cấu hình được thiết lập, chúng ta sẽ kiểm tra nó ngay bây giờ. Để làm điều này, tạo một bảng trong CSDL ví dụ trên Server C và kiểm tra Server D để xem nó có hiển thị không. Sau đó, xóa nó khỏi Server D và đảm bảo nó không còn hiển thị trên Server C.

Bây giờ cần tạo CSDL sẽ được nhân rộng giữa các servers. Chúng ta có thể làm điều đó bằng cách gõ như sau vào vỏ mysql:

create database example; 

Khi đã xong, hãy tạo một bảng giả trên Server C:

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

Bây giờ kiểm tra Server D để xem bảng của chúng ta có tồn tại không.

show tables in example; 

Chúng ta sẽ thấy output tương tự như sau:

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

Thử nghiệm cuối cùng cần làm là xóa bảng giả khỏi Server D. Nó cũng bị xóa khỏi Server C.

Chúng ta có thể thực hiện điều này bằng cách nhập thông tin sau vào Server D:

DROP TABLE dummy; 

Để xác nhận điều này, chạy lệnh "show tables" trên Server C sẽ không hiển thị bảng nào:

Empty set (0.00 sec)

Và bạn đã làm được rồi đấy! Làm việc mysql master-master replication. Như mọi khi, mọi phản hồi đều được hoan nghênh. Tham khảo thêm tại vicloud.vn để biết nhiều thông tin hữu ích!