Gần đây nhất, trong chiều ngày 14/12/2020 (theo giờ Việt Nam), các dịch vụ của Google đã ngừng hoạt động trên toàn thế giới, với các lỗi được ghi nhận, bao gồm Gmail, Google Calendar, YouTube và một phần của Google Search. Sự cố với Google đã ảnh hưởng đến lượng lớn người dùng Internet trên toàn cầu. Đây là cũng là sự cố lớn nhất của Google trong năm 2020. Dễ dàng nhận thấy các tên tuổi lớn như Google hay các tên tuổi lớn khác đều không tránh khỏi việc xảy ra sự cố với hệ thống, dù xác suất là vô cùng thấp và hi hữu, tuy nhiên thiệt hại mang đến thì không hề nhỏ.
Chính vì vậy tính sẵn sàng của hệ thống lại càng thể hiện vai trò đặc biệt quan trọng, có rất nhiều giải pháp được phát triển đảm bảo tính sẵn sàng cho dịch vụ hệ quản trị cơ sở dữ liệu, giải pháp Cluster MySQL Server sử dụng Galera Cluster là một trong số đó, bài viết này sẽ hướng dẫn cách thức triển khai giải pháp Galera Cluster nhằm đảm bảo khả năng cân bằng tải và tính sẵn sàng cho hệ quản trị CSDL và dịch vụ Web của các doanh nghiệp. Phương án triển khai cụ thể gồm các bước như sau.
I. Triển khai Cluster MySQL Server
Mô hình triển khai:
Mô hình ở đây chúng ta sẽ triển khai cluster gồm 3 nodes, các bước triển khai cụ thể như sau:
- Cài đặt giải pháp đồng bộ dữ liệu trên các node backend
Việc cài đặt và đồng bộ các database thực hiện trên 3 node DB1, DB2, DB3. Trong bài viết này dùng Percona XtraDB làm giải pháp đồng bộ.
Nếu trước đây bạn đã từng cài đặt MySQL trên máy chủ, có thể có gói Apparmor gói này sẽ có thể xung đột với XtraDB Cluster. Vì vậy cần tiến hành cấu hình AppArmor cho cấu hình Cluster MySQL, tham khảo bài viết sau:
a. Cài đặt MySQL Multi Cluster – Percona XtraDB
Nếu trước đây bạn đã từng cài đặt MySQL trên máy chủ, có thể có gói Apparmor gói này sẽ có thể xung đột với XtraDB Cluster. Vì vậy cần tiến hành cấu hình AppArmor cho cấu hình Cluster MySQL, tham khảo bài viết sau:
https://severalnines.com/database-blog/how-configure-apparmor-mysql-based-systems-mysqlmariadb-replication-galera
b. Cài đặt các gói bổ trợ và update hệ điều hành
wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt-get update
c. Cài đặt Percona XtraDB
sudo apt-get install -y percona-xtradb-cluster-57
Trong khi quá trình cài đặt diễn ra, hệ thống sẽ yêu cầu bạn nhập password cho tài khoản root của MySQL.
2. Cấu hình đồng bộ từng node
Chú ý: Sau khi cài đặt Percona thì dịch vụ Mysql tự động được bật, chúng ta cần tắt dịch vụ trên cả 3 node sau đó tiến hành cấu hình DB bằng lệnh:
/etc/init.d/mysql stop
Trên Node DB1: Cấu hình file /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf với các trường cụ thể như sau, các trường còn lại ta để mặc định
wsrep_cluster_address=gcomm://192.168.4.201,192.168.4.202,192.168.4.203
# Node DB1 IP address
wsrep_node_address=192.168.4.201
#Authentication for SST method
wsrep_sst_auth="HanNV1993!@#$"
Khởi động Node đầu tiên với câu lệnh
/etc/init.d/mysql bootstrap-pxc
Lệnh này sẽ khởi động node đầu tiên và kết nối với các máy còn lại
Sau khi node đầu tiên được bật, ta có thể kiểm tra được trạng thái của cluster bằng lệnh sau:
show status like 'wsrep%';
Và chúng ta sẽ có kết quả giống như bên dưới là thành công
wsrep_cluster_status
Primary
wsrep_connected
ON
wsrep_ready
ON
Trong MySQL, chúng ta tạo user mới và cấp quyền:
mysql> CREATE USER 'vnptvci'@'localhost' IDENTIFIED BY 'vnptvci';
mysql> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'vnptvci'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> exit;
Trên Node DB2:
Cấu hình tương tự Node 1 trong file /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf và chỉ sửa dòng
wsrep_node_addres=192.168.4.202
Thành IP của Node 2 và khởi động MySQL
/etc/init.d/mysql start
Vào MySQL kiểm tra và chúng ta sẽ được kết quả
wsrep_cluster_status
wsrep_connected
ON
wsrep_ready
ON
Trên Node DB3:
Cấu hình tương tự Node 1 trong file /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf và chỉ sửa dòng
wsrep_node_addres=192.168.4.203
Thành IP của Node 2 và khởi động MySQL
/etc/init.d/mysql start
Vào MySQL kiểm tra và chúng ta sẽ được kết quả
wsrep_cluster_status
Primary
wsrep_connected
ON
wsrep_ready
ON
3. Kiểm tra kết quả
Để kiểm tra replication, chúng ta sẽ thử tạo 1 cơ sở dữ liệu mới trên node DB2, 1 bảng cho CSDL mới đó trên node DB3 và thêm một số bản ghi trên node DB1.
Trên Node DB2: Ta tạo 1 CSDL mới
mysql> CREATE DATABASE percona;
Trên Node DB3: Ta tạo bảng cho CSDL đã tạo ở trên
mysql> USE percona;
mysql> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
Trên Node DB1: Ta thử tạo bản ghi với câu lệnh
mysql> INSERT INTO percona.example VALUES (1, 'percona1');
Sau đó chúng ta thử kiểm tra quá trình đồng bộ trên cả 3 node với câu lệnh
mysql> SELECT * FROM percona.example
Và kết quả tất cả các node trong cluster sẽ được đồng bộ dữ liệu
I. Thử nghiệm tính năng đồng bộ của cụm Galera Cluster sử dụng cơ chế Async Replication
- Yêu cầu đặt ra
- Triển khai và test async replication giữa galera cluster với một máy chủ Mysql độc lập
- Giả lập tình huống Master down, Từ slave change master sang node galera khác ( Thao tác bằng tay)
- Giả lập tình huống 3 node trong Galera Cluster cùng down. Lúc này dữ liệu sẽ được xử lý ra sao
Test Performance trước và sau khi triển khai asynchronous
2. Các bước thực hiện
Triển khai và test async replication giữa galera cluster với một máy chủ Mysql độc lập
Mô hình triển khai:
Triển khai cụm Galera Cluster chi tiết tại nội dung I, tiếp theo ta sẽ triển khai cơ chế đồng bộ Asynchronous Replication
Bước 1: Chỉ định các tùy chọn Replication trong từng file my.cnf của các nodé như sau
- Trên các nốt trong cụm Galera Cluster tiến hành cấu hình trong file với đường dẫn
/etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
gtid_mode=ON
log_bin=binlog
log_slave_updates=1
enforce_gtid_consistency
expire_logs_days=7
server_id=3
binlog_format=ROW
- Trên node Slave: Cấu hình tại file /etc/mysql/my.cnf
[mysqld]
gtid_mode=ON
log_bin=binlog
log_slave_updates=1
enforce_gtid_consistency
expire_logs_days=7
server_id=101 # 101 for slave
binlog_format=ROW
replicate_do_db=hannv
replicate_do_db=hannv1
slave_net_timeout=60
Bước 2: Restart lại dịch vụ mysql trên các nodes thuộc cụm Galera Cluster, còn trên node slave cần restart lại máy chủ
/etc/init.d/mysql restart
Bước 3: Tạo slave replication user và gán cho nó quyền replication trên glera cluster nodes
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepassword';
Bước 4: Dump database muốn đồng bộ ( hannv1) trên Master node bằng câu lệnh
mysqldump -uslave -p –h 10.5.117.192 --single-transaction --skip-add-locks --triggers --routines --events hannv1 > hannv1.sql
Bước 5: Sau đó restore db vừa dump bên master lên slave node
mysql -uroot -p --database=hannv1 < hannv1.sql
Bước 6: Start Replication trên slave node
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST = '10.5.117.192', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
Bước 7: Test đồng bộ
- Trước tiên vào mysql trên slave node check status
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.5.117.191
Master_User: slave
Master_Port: 3306
Relay_Log_File: hannv-slave-relay-bin.000003
Replicate_Do_DB: hannv,hannv1
- Thử Insert data vào một trong các nodes galera cluster, sau đó sang slave node kiểm tra. Trên node galera ta insert data như sau:
mysql> INSERT INTO hannv.example VALUES (16, 'percona16');
Query OK, 1 row affected (0.01 sec
- Chuyển sang slave node kiểm tra xem dữ liệu đã được đồng bộ ra sao
3. Giả lập tình huống Master down, từ slave change master sang node khác trong Garena Cluster
Khi nodes master bị down lúc này ta cần chỉ định một Master khác cho slave, ta thao tác bằng tay chỉ định master mới cho slave như sau:
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST = '10.5.117.191', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'slavepassword', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
4. Giả lập tình huống 3 node master galera cùng down. Lúc này dữ liệu sẽ được xử lý ra sao
Khi 3 node galera cùng down lúc này dữ liệu sẽ được ghi vào node Slave, vấn đề ở đây là khi 3 node galera up trở lại ta có thể đồng bộ lại dữ liệu đã được ghi vào node slave trong thời điểm 3 node kia đang down không? Phương án là ta cần dump lại database trên slave sau đó lại restore lại trên các nodes galera, ta sử dụng câu lệnh sau:
mysqldump -uroot -p –h 127.0.0.1 --single-transaction --set-gtid-purged=OFF --skip-add-locks --triggers --routines --events hannv > hannv4.sql
Cần chú ý tham số –set-gtid-purged=OFF có tham số này thì khi restore bên master ta mới không bị lỗi.
mysql -uroot -p --database=hannv < hannv4.sql
Một vài trường hợp sau khi thực hiện các thao tác trên Master và Slave vẫn chưa đồng bộ với nhau ta cần làm theo các bước sau trên slave node.
mysql> reset master;
mysql> set global GTID_PURGED="4949669a-319e-ee18-72a5-bc4e03f7e36b:1-41";
mysql> start slave
Với giá trị GTID_PURGED được lấy từ master node bằng cách
show global variables like 'gtid_purged';
5. Test Performance trước và sau khi triển khai asynchronous replication
Trước khi triển khai Asynchronous Replication
Sau khi triển khai Asynchronous Replication
Về cơ bản thì performance không bị thay đổi nhiều trước và sau khi triển khai Asynchronous Replication trên cụm Galera Cluster nhưng vẫn cần có những bài test với lượng data lớn hơn.