Triển khai Cluster MySQL đảm bảo tính sẵn sàng cho dịch vụ Web

Published By: RD TEAM

Published On: 14/07/2021

Published in:

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:
  1. 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
  1. 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.
1546 lượt xem