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.

1.406 lượt xem