MySQL Replication là một kỹ thuật trong MySQL cho phép dữ liệu từ một Server CSDL MySQL (master) được nhân bản đến một hoặc nhiều Server MySQL khác (slave). Ở bài này mình sẽ hướng dẫn các bạn cấu hình mysql replication với 1 master và 2 slave. Điều kiện tiên quyết là máy của bạn đã được cài đặt MariaDB. Nếu máy của bạn chưa cài đặt MariaDB thì có thể xem chi tiết cách cài đặt tại đây.
Mục lục
- Mô hình chuẩn bị
- IP planning
- Cấu hình trên master
- Cấu hình trên slave 1
- Cấu hình thêm slave vào hệ thống
- Kiểm tra.
1. Mô hình chuẩn bị.
2. IP Planning.
3. Cấu hình trên Master.
- Cấu hình firewall, cho phép lắng nghe port 3306
firewall-cmd --add-port=3306/tcp --zone=public --permanent
- Reload xác nhận cấu hình.
firewall-cmd --reload
- Chỉnh sửa file
/etc/my.cnf
vi /etc/my.cnf
- Trong phần
[mariadb]
thêm các dòng sau:
[mariadb]
server-id=1
log-bin=master
binlog-format=row
binlog-do-db=replica_db
- Trong đó :
server_id
là tùy chọn được sử dụng trong replication cho phép master server và slave server có thể nhận dạng lẫn nhau. Server_id Với mỗi server là khác nhau, nhận giá trị từ 1 đến 4294967295(mariadb >=10.2.2) và 0 đến 4294967295(mariadb =<10.2.1)log-bin
haylog-basename
là tên cơ sở nhật ký nhị phân để tạo tên tệp nhật ký nhị phân.binlog-format
là định dạng dữ liệu được lưu trong file bin log.binlog-do-db
là tùy chọn để nhận biết cơ sở dữ liệu nào sẽ được replication. Nếu muốn replication nhiều CSDL, bạn phải viết lại tùy chọn binlog-do-db nhiều lần. Hiện tại không có option cho phép chọn toàn bộ CSDL để replica mà bạn phải ghi tất cả CSDL muốn replica ra theo option này.
- Restart lại dịch vụ mariadb để nhận cấu hình mới.
systemctl restart mariadb
- Sử dụng root user đăng nhập vào MariaDB.
mysql -u root -p
- Tạo CSDL có tên là
replica_db
.
create database replica_db;
- Tạo Slave user, password và gán quyền cho user đó. Ví dụ sử dụng username là
slave_user
và password làabc@123
.
> create user 'slave_user'@'%' identified by 'abc@123';
> stop slave;
Query OK, 0 rows affected, 1 warning (0.062 sec)
> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'abc@123';
Query OK, 0 rows affected (0.061 sec)
- Xác nhận lại các thay đổi với câu lệnh:
FLUSH PRIVILEGES;
- Sử dụng câu lệnh dưới đây để chắc chắn rằng không có bất cứ điều gì được ghi vào master database trong quá trình replication dữ liệu. Ghi nhớ
filename
andposition
củabinary log
để có thể thực hiện cấu hình trên slave.
FLUSH TABLES WITH READ LOCK;
- Tiến hành
backup
CSDL trên master server và chuyển nó đến slave server.
mysqldump --all-databases --user=root --password --master-data > masterdatabase.sql
Enter password:
ls
masterdatabase.sql
- Đăng nhập vào MariaDB với root user và thực hiện unlock table bằng lệnh:
UNLOCK TABLES;
- Copy
masterdatabase.sql
file tới Slave server 1.
scp masterdatabase.sql root@10.10.22.101:/root/masterdatabase.sql
ls
masterdatabase.sql
- Sử dụng câu lệnh dưới để kiểm tra trạng thái của master.
show master status;
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 939 | replica_db | |
+--------------------+----------+--------------+------------------+
1 row in set (0.058 sec)
4. Cấu hình trên Slave1
- Cấu hình firewall, cho phép lắng nghe port 3306.
firewall-cmd --add-port=3306/tcp --zone=public --permanent
- Reload xác nhận lại cấu hình.
firewall-cmd --reload
- Chỉnh sửa /etc/my.cnf .
vi /etc/my.cnf.d/mariadb-server.cnf
Sau đó thêm vào các dòng sau:
[mariadb]
server-id = 2
replicate-do-db=replica_db
- Import CSDL master. Enter password của root user trong Mariadb.
mysql -u root -p < /root/masterdatabase.sql
Enter password:
- Restart MariaDB service để tiếp nhận thay đổi.
systemctl restart mariadb
- Sử dụng root user đăng nhập vào MariaDB Server.
mysql -u root -p
- Hướng dẫn Slave tìm file Master Log file và Start Slave.
> STOP SLAVE;
> CHANGE MASTER TO MASTER_HOST='10.10.22.100', MASTER_USER='slave_user', MASTER_PASSWORD='abc@123', MASTER_LOG_FILE='master.000001', MASTER_LOG_POS=939;
Query OK, 0 rows affected (0.051 sec)
> START SLAVE;
Query OK, 0 rows affected (0.044 sec)
- Kiểm tra trạng thái của Slave, sử dụng lệnh:
show slave status\G;
5. Cấu hình thêm Slave vào hệ thống.
5.1 Cấu hình trên Master.
- Bật tính năng read only để không ghi thêm dữ liệu mới vào CSDL và tắt replication:
stop slave;
flush table with read lock;
- Tiến hành backup CSDL trên master server và chuyển nó đến slave server.
mysqldump --all-databases --user=root --password --master-data > masterdatabase.sql
Enter password:
ls
anaconda-ks.cfg masterdatabase.sql
- Đăng nhập vào MariaDB với root user và thực hiện unlock table bằng lệnh sau.
> UNLOCK TABLES;
- Copy masterdatabase.sql file tới Slave server.
scp masterdatabase.sql root@10.10.22.102:/root/masterdatabase.sql
5.2 Cấu hình trên Slave 2.
Các bạn thực hiện cấu hình tương tự như ở slave 1.
Lưu ý : phần chỉnh sửa trong file /etc/my.cnf
ở mục server-id bạn phải đặt id khác với id của master và slave 1.
6. Kiểm tra.
Sử dụng tài khoản root đăng nhập vào mysql. Sau đó tạo và insert thông tin vào các bảng trên master. Đăng nhập vào các slave để kiểm tra thông tin đã được đồng bộ từ master qua slave hay chưa.
- Ở bài này mình sẽ tạo bảng SV và insert các thông tin vào bảng trên máy master như hình dưới đây :
- Sau đó sử dụng tài khoản root đăng nhập vào mariadb để kiểm tra thông tin từ máy master đã được đồng bộ qua các máy slave chưa.
Sử dụng câu lệnh show tables
để hiển thị các bảng.
Như vậy là các thông tin ở máy Master đã được đồng bộ qua máy Slave.
Chúc các bạn thành công.
Bài viết rất chi tiết, tuy nhiên mình chưa thấy nêu qua về việc thực tế có Slave để làm gì? Khi node Master down thì ntn?
Ngoài ra, mong chủ thớt chia sẻ thêm các bài về master-master và galera ^^