(1). Tổng quan về tách biệt đọc-ghi
- Nguyên lý hoạt động
Tách biệt đọc-ghi phân chia nhiệm vụ: CSDL chính xử lý các thao tác ghi (insert, delete, update), trong khi CSDL phụ chuyên xử lý các truy vấn đọc (select).
- Tác dụng
- Phân tán tải trọng
- Giảm thiểu xung đột khóa X và S nhờ phân công rõ ràng giữa CSDL chính và phụ
- Cho phép sử dụng engine MyISAM trên CSDL phụ để tối ưu hiệu suất truy vấn
- Tăng độ sẵn sàng hệ thống thông qua cơ chế dự phòng
- Phương pháp triển khai
I. Triển khai tại ứng dụng: Ưu điểm: Dễ triển khai, ít phụ thuộc hạ tầng Nhược điểm: Khó mở rộng khi thay đổi kiến trúc, không hỗ trợ phân mảnh dữ liệu
II. Triển khai qua middleware: Ưu điểm: Linh hoạt thiết kế kiến trúc, hỗ trợ failover, giám sát, phân mảnh ngang hàng Nhược điểm: Yêu cầu đội ngũ vận hành chuyên môn
- Các middleware phổ biến Cobar, MyCAT, OneProxy, Vitess, Kingshard, Atlas, MaxScale, MySQL Route. MyCAT được chọn do tính mở nguồn, cộng đồng hoạt động mạnh mẽ và khả năng tương thích tốt với MySQL.
(2). Môi trường thực nghiệm
Máy chủ mycat: 192.168.5.101 CentOS7.5 MySQL 5.7.16 cổng 3306 Máy chủ chính: 192.168.5.102 CentOS7.5 MySQL 5.7.16 cổng 3306 Máy chủ phụ: 192.168.5.103 CentOS7.5 MySQL 5.7.16 cổng 3306
(3). Cài đặt và cấu hình MyCAT
Quy trình: Ứng dụng → MyCAT → CSDL chính/phụ
Các bước cài đặt:
- Tải MyCAT-server-1.6.7.1-release-20190213150257-linux.tar.gz
- Cài đặt JDK 1.7+
- Tạo thư mục logs và thiết lập quyền truy cập
[root@mycat ~]# tar zxf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz -C /usr/local/
[root@mycat ~]# mkdir /usr/local/mycat/logs
[root@mycat ~]# useradd mycat
[root@mycat ~]# chown -R mycat:mycat /usr/local/mycat/
Cấu hình môi trường:
- server.xml: Định nghĩa tài khoản truy cập và quyền truy cập
- schema.xml: Xác định cấu trúc logic database và phân mảnh
- rule.xml: Thiết lập quy tắc phân mảnh
<user name="admin">
<property name="password">123456</property>
<property name="schemas">DB_TEST</property>
</user>
<user name="read_user">
<property name="password">123456</property>
<property name="schemas">DB_TEST</property>
<property name="readOnly">true</property>
</user>
Cấu hình schema.xml:
- Định nghĩa logic database
- Thiết lập kết nối đến các node dữ liệu
- Cấu hình balance và writeType
<schema name="DB_TEST" dataNode="dn1"/>
<dataNode name="dn1" dataHost="dthost" database="test_db"/>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0">
<heartbeat>select 1</heartbeat>
<writeHost host="master" url="192.168.5.102:3306" user="mycat" password="123456" />
<readHost host="slave1" url="192.168.5.103:3306" user="mycat" password="123456" weight="1"/>
</dataHost>
Kích hoạt dịch vụ và thiết lập khởi động tự động:
[root@mycat ~]# mycat start
[root@mycat ~]# echo "/usr/local/mycat/bin/mycat start" >> /etc/rc.local
(4). Cấu hình sao chép chủ-phụ
Tại máy chủ chính:
- Tạo tài khoản sao chép
- Cấu hình my.cnf
[root@master ~]# mysql -uroot -p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.5.%' IDENTIFIED BY '123456';
mysql> CREATE DATABASE test_db;
mysql> FLUSH PRIVILEGES;
Cập nhật my.cnf:
server-id=1
log-bin=mysql-bin
binlog-do-db=test_db
Tại máy chủ phụ:
- Thiết lập kết nối master
- Kiểm tra trạng thái sao chép
[root@slave ~]# mysql -uroot -p
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.5.102',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
mysql> START SLAVE;
(5). Kiểm thử hệ thống
Kiểm tra kết nối qua MyCAT:
[root@mycat ~]# mysql -uadmin -p123456 -h192.168.5.101 -P8066
mysql> USE DB_TEST;
mysql> CREATE TABLE users(id INT, name VARCHAR(50));
mysql> INSERT INTO users VALUES (1, 'Nguyen Van A');
Xác nhận dữ liệu đã sao chép:
[root@master ~]# mysql -uroot -p
mysql> SELECT * FROM test_db.users;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Nguyen Van A |
+----+-----------+
[root@slave ~]# mysql -uroot -p
mysql> SELECT * FROM test_db.users;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Nguyen Van A |
+----+-----------+
Thử nghiệm tài khoản chỉ đọc:
[root@mycat ~]# mysql -uread_user -p123456 -h192.168.5.101 -P8066
mysql> INSERT INTO users VALUES (2, 'Tran Thi B');
ERROR 1495 (HY000): User readonly
Thử nghiệm failover:
[root@master ~]# systemctl stop mysqld
[root@mycat ~]# mysql -uadmin -p123456 -h192.168.5.101 -P8066
mysql> SELECT * FROM users;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Nguyen Van A |
+----+-----------+
mysql> INSERT INTO users VALUES (2, 'Tran Thi B');
ERROR 1184 (HY000): java.net.ConnectException: Connection refused