Cách cài đặt Master Slave Replication trong MySQL
MySQL Replication là một quá trình cho phép bạn dễ dàng duy trì nhiều bản sao của dữ liệu MySQL bằng cách cho copy chúng một cách tự động từ một master database đến slave database. Nó giúp ích trong việc tạo điều kiện để sao lưu cho dữ liệu, phân tích database mà không sử dụng bản gốc của nó, hay đơn giản là scale out database.
Bài viết sẽ đề cập đến một ví dụ đơn giản của MySQL replication: Một master sẽ gửi thông tin đến một slave đơn lẻ. Để làm được việc này, ta cần hai địa chỉ IP, một cho master và một cho slave.
Cụ thể là:
12.34.56.789- Master Database
12.23.34.456- Slave Database
Cài đặt
Giả sử bạn đã có một user với quyền sudo và đã cài đặt MySQL. Nếu chưa cài, bạn có thể cài nó sử dụng lệnh sau với quyền sudo:
sudo apt-get install mysql-server mysql-client
Bước 1—Cấu hình Master Database
Mở file cấu hình mysql trên Master Database.
sudo nano /etc/mysql/my.cnf
Tìm đến mục này:
bind-address = 127.0.0.1
Thay địa chỉ IP mặc định thành địa chỉ IP của Master Database.
bind-address = 12.34.56.789
The next configuration change refers to the server-id, located in the [mysqld] section. You can choose any number for this spot (it may just be easier to start with 1),but the number must be unique and cannot match any other server-id in your replication group. I’m going to go ahead and call this one 1.
Bước tiếp theo là thay đổi tham chiếu đến server-id, nằm trong mục [mysqld]. Bạn có thể chọn bất cứ số nào ( để cho dễ ta sẽ chọn 1),nhưng hãy đảm bảo rằng nó không trùng với bất kì server-id nào khác trong nhóm server replication của bạn. Đảm bảo dòng lệnh này được uncomment.
server-id = 1
Chuyển đến dòng log_bin, nơi những thông tin thật về bản sao được lưu trữ. Slave sẽ copy tất cả thay đổi trong file log này. Ở đây ta chỉ cần uncomment dòng lệnh tham chiếu đến log_bin:
log_bin = /var/log/mysql/mysql-bin.log
Cuối cùng, ta cần chỉ rõ database nào sẽ được tạo bản sao trên Slave Server. Lặp lại dòng này với tất cả các database bạn cần.
binlog_do_db = newdatabase
Lưu và đóng file, sau đó restart mysql
sudo service mysql restart
Bước tiếp theo được thực hiện trong MySQL shell.
Mở MySQL shell.
mysql -u root -p
Ta cần cấp quyền cho slave. Dùng lệnh sau để đặt tên và mật khẩu cho slave database.
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
Tiếp theo là lệnh:
FLUSH PRIVILEGES;
Bước tiếp theo sẽ khó hơn một chút. Bạn cần mở một cửa sổ hoặc tab mới bên cạnh cửa sổ ta đang thao tác ở trên.
Ở tab hiện tại, gõ lệnh:
USE newdatabase;
Chặn quyền đọc vào database:
FLUSH TABLES WITH READ LOCK;
Sau đó kiểm tra trạng thái của nó:
SHOW MASTER STATUS;
Bạn sẽ thấy output như sau:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 107 | newdatabase | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
Đây là vị trí mà slave database sẽ bắt đầu nhân bản.
Nếu thực hiện bất kì thay đổi nào trên tab này, database sẽ tự mở khóa và quá trình replication sẽ bị lỗi. Vì vậy ta sẽ mở một tab mới lên và thực hiện các bước tiếp theo trên tab đó
Xuất dữ liệu trong newdatabase ra file newdatabase.sql:
mysqldump -u root -p --opt newdatabase > newdatabase.sql
Quay lại cửa sổ cũ rồi mở khóa Master Database:
UNLOCK TABLES;
QUIT;
Bước 2—Cấu hình Slave Database
Log in và slave server, rồi tạo một database mới tên newdatabase, xong đó thoát.
CREATE DATABASE newdatabase;
EXIT;
Nhập dữ liệu trong file newdatabase.sql vào database vừa tạo
mysql -u root -p newdatabase < /path/to/newdatabase.sql
Mở file cấu hình của slave database:
sudo nano /etc/mysql/my.cnf
Tìm đến dòng server-id, rồi đặt giá trị cho nó bằng 2:
server-id = 2
Sửa file để có 3 dòng sau, lưu ý dòng relay-log không có sẵn trong file, bạn phải tạo ra nó.
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase
Lưu và thoát.
Khởi động lại MySQL:
sudo service mysql restart
Gõ lệnh sau, chú ý thay thế những giá trị của bạn vào các giá trị trong lệnh:
CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
Lênh trên thực hiện 3 việc:
- Gán server hiện tại thành slave của master server.
- Cấp quyền truy cập cho server.
- Cho slave server biết cần copy dữ liệu từ vị trí nào từ master server thông qua
MASTER_LOG_POS
Sau khi cấu hình xong, kích hoạt server:
START SLAVE;
Kiểm tra thông số của server bằng lệnh sau (\G sắp xếp lại dữ liệu cho dễ nhìn hơn)
SHOW SLAVE STATUS\G
Nếu có lỗi kết nối xảy ra, dùng lệnh sau để bỏ qua lỗi và khởi động lại server:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;