1. Tổng quan.
Bạn có thể tạo một MariaDB cluster để có một hệ thống cơ sở dữ liệu phân tán và có tính sẵn sàng cao. MariaDB Cluster sử dụng công nghệ Galera để cung cấp đồng bộ hóa và sao lưu dữ liệu trên nhiều nodes trong cluster.
Để tạo một MariaDB Cluster, bạn cần cài đặt và cấu hình MariaDB trên mỗi node của cluster. Sau đó, bạn sẽ cần thiết lập cấu hình Galera để các node trong cluster có thể liên kết và sao lưu dữ liệu với nhau.
Quá trình cài đặt và cấu hình MariaDB Cluster có nhiều bước phức tạp và yêu cầu kiến thức về hệ thống cơ sở dữ liệu phân tán. Bạn có thể tìm hiểu các tài liệu và hướng dẫn chi tiết từ trang web chính thức của MariaDB hoặc tìm kiếm các nguồn tài nguyên trực tuyến khác để hướng dẫn cụ thể cho việc tạo cluster.
Lưu ý rằng việc tạo và quản lý một cluster cơ sở dữ liệu phân tán như MariaDB Cluster đòi hỏi kiến thức và kỹ năng phù hợp. Nếu bạn không có kinh nghiệm hoặc không tự tin trong việc triển khai cluster này, nên tìm kiếm sự hỗ trợ từ các chuyên gia hoặc tổ chức chuyên về quản lý cơ sở dữ liệu phân tán.
2. Triển khai.
2.1. Cài đặt MariaDB.
Để tạo một MariaDB Cluster với 3 node với các địa chỉ IP tương ứng:
- mariadb-node1: 192.168.13.208
- mariadb-node1: 192.168.13.209
- mariadb-node1: 192.168.13.210
Bạn có thể làm theo các bước sau:
- Cài đặt MariaDB trên các Node, trên mỗi Node, cài đặt MariaDB bằng cách sử dụng gói phần mềm phù hợp cho hệ điều hành của bạn.
sudo apt install software-properties-common -y
sudo curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
sudo bash mariadb_repo_setup --mariadb-server-version=10.6
sudo apt update
sudo apt -y install mariadb-common mariadb-server-10.6 mariadb-client-10.6
Xác nhận việc cài đặt thành công.
$ mariadb --version
mariadb Ver 15.1 Distrib 10.6.14-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
2.2. Xác định thư mục và file cấu hình.
MariaDB Community Server có thể được cấu hình theo các cách sau:
Các biến và tùy chọn có thể được đặt trong một file cấu hình (như /etc/my.cnf). MariaDB Community Server phải được khởi động lại để áp dụng các thay đổi được thực hiện trên file cấu hình.
Các biến và tùy chọn có thể được đặt trên dòng lệnh.
Nếu một biến hỗ trợ các thay đổi động, thì nó có thể được đặt trực tiếp bằng cách sử dụng câu lệnh SET.
File Cấu hình Gói của MariaDB bao gồm một số file cấu hình được bao gồm sẵn. Cũng có thể tạo các file cấu hình tùy chỉnh.
Trên RHEL, CentOS và SLES, các gói của MariaDB bao gồm các file cấu hình sau:
- /etc/my.cnf
- /etc/my.cnf.d/client.cnf
- /etc/my.cnf.d/mysql-clients.cnf
- /etc/my.cnf.d/server.cnf
Và trên RHEL, CentOS và SLES, các file cấu hình tùy chỉnh từ các thư mục sau được đọc theo mặc định:
- /etc/my.cnf.d/
Trên Debian và Ubuntu, các gói của MariaDB bao gồm các file cấu hình sau:
- /etc/mysql/my.cnf
- /etc/mysql/mariadb.cnf
- /etc/mysql/mariadb.conf.d/50-client.cnf
- /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
- /etc/mysql/mariadb.conf.d/50-mysqld_safe.cnf
- /etc/mysql/mariadb.conf.d/50-server.cnf
- /etc/mysql/mariadb.conf.d/60-galera.cnf
Và trên Debian và Ubuntu, các file cấu hình tùy chỉnh từ các thư mục sau được đọc theo mặc định:
- /etc/mysql/conf.d/
- /etc/mysql/mariadb.conf.d/
2.3. Cấu hình MariaDB.
Cấu hình MariaDB Xác định các biến và tùy chọn bạn cần cấu hình. Các biến và tùy chọn bắt buộc cho MariaDB Galera Cluster bao gồm:
Biến/Tùy chọn | Mô tả |
---|---|
wsrep_provider | Đặt đường dẫn đến wsrep Provider. Đây là đường dẫn đến file libgalera_smm.so. |
wsrep_cluster_address | Đặt địa chỉ Group Communications back-end (thông thường là gcomm://), tiếp theo là danh sách các địa chỉ IP hoặc tên miền được phân tách bằng dấu phẩy cho mỗi Cluster Node. Nên bao gồm tất cả Cluster Nodes trong danh sách này. |
wsrep_cluster_name | Đặt tên logic cho cụm. Phải giống nhau trên tất cả các Cluster Nodes. |
binlog_format | Đặt thành ROW, MariaDB Galera Cluster không hỗ trợ các định dạng Binary Log khác. |
innodb_autoinc_lock_mode | Đặt thành 2, MariaDB Galera Cluster không hỗ trợ các chế độ khóa tự tăng khác. |
wsrep_on | Đặt thành ON để bật MariaDB Galera Cluster. |
Các tùy chọn và biến hữu ích cho MariaDB Community Server bao gồm:
Biến/Tùy chọn | Mô tả |
---|---|
datadir | Đặt đường dẫn đến thư mục dữ liệu. MariaDB Community Server ghi các file dữ liệu vào thư mục này, bao gồm các bảng, bản ghi và lược đồ. Có thể thay đổi để sử dụng một vị trí không tiêu chuẩn hoặc để khởi động Server trên một thư mục dữ liệu khác cho mục đích kiểm thử. |
bind_address | Đặt địa chỉ TCP/IP cục bộ mà MariaDB Community Server lắng nghe các kết nối đến. Đặt thành 0.0.0.0 để làm cho Server có thể truy cập qua bất kỳ giao diện mạng nào. |
port | Đặt cổng mà MariaDB Community Server lắng nghe. Sử dụng biến này để sử dụng một cổng không tiêu chuẩn hoặc khi chạy nhiều Servers trên cùng một máy chủ cho mục đích kiểm thử. |
max_connections | Đặt số lượng kết nối đồng thời tối đa mà MariaDB Community Server cho phép. |
thread_handling | Đặt cách MariaDB Community Server xử lý luồng cho các kết nối của khách hàng. |
log_error | Đặt tên file cho nhật ký lỗi. |
innodb_buffer_pool_size | Đặt số lượng bộ nhớ mà InnoDB dành riêng cho Bộ đệm. |
innodb_log_file_size | Đặt kích thước cho mỗi file Redo Log và innodb_log_files_in_group đặt số lượng file Redo Log được sử dụng bởi InnoDB. |
innodb_io_capacity | Đặt số lượng tối đa các hoạt động I/O mà InnoDB có thể sử dụng trong mỗi giây. |
Các tùy chọn và biến hữu ích cho MariaDB Galera Cluster bao gồm:
Biến/Tùy chọn | Mô tả |
---|---|
wsrep_provider_options | Dùng để đặt các tùy chọn wsrep Provider, được chuyển đến plugin Galera Replication, cho phép điều chỉnh hiệu suất sao chép. |
wsrep_slave_threads | Đặt số luồng mà Cluster Node sử dụng để áp dụng các sự kiện sao chép. |
wsrep_sst_method | Đặt kịch bản mà Cluster Node sử dụng để thực hiện State Snapshot Transfers (SST). Đặt thành “mariabackup” để sử dụng MariaDB Backup. |
wsrep_sst_auth | Đặt tên người dùng và mật khẩu mà Cluster Node sử dụng để xác thực khi kết nối với node nguồn cho State Snapshot Transfer (SST). |
Bạn nên tạo một file cấu hình tùy chỉnh để đặt các biến và tùy chọn của bạn. Việc thay đổi các file cấu hình gốc không được khuyến nghị. Thay vào đó, bạn nên tạo một file cấu hình tùy chỉnh trong một trong những thư mục được bao gồm. Các file cấu hình trong các thư mục được bao gồm sẽ được đọc theo thứ tự bảng chữ cái. Nếu bạn muốn file cấu hình tùy chỉnh của bạn ghi đè lên các file cấu hình gốc, thì nên đặt tiền tố của tên file cấu hình tùy chỉnh của bạn thành một chuỗi sẽ được sắp xếp cuối cùng, ví dụ như “z-“.
Trên RHEL, CentOS và SLES, một file cấu hình tùy chỉnh tốt sẽ là: /etc/my.cnf.d/z-custom-my.cnf
Trên Debian và Ubuntu, một file cấu hình tùy chỉnh tốt sẽ là: /etc/mysql/mariadb.conf.d/z-custom-my.cnf
Đặt các biến và tùy chọn của bạn trong file cấu hình.
Chúng cần được đặt trong một nhóm sẽ được mariadbd đọc, ví dụ như [mariadb] hoặc [server].
Ví dụ của mình triển khai ở file /etc/mysql/mariadb.conf.d/60-galera.cnf
.
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="MariaDB Galera Cluster"
wsrep_cluster_address="gcomm://mariadb-node1,mariadb-node2,mariadb-node3"
wsrep_node_address="192.168.13.208"
wsrep_node_name="mariadb-node1"
default_storage_engine="InnoDB"
binlog_format=row
innodb_autoinc_lock_mode="2"
Trong ví dụ trên, chúng ta có các giá trị sau đây:
- [galera]: Đây là tên nhóm trong file cấu hình, trong trường hợp này là [galera]. Điều này cho biết rằng các biến và tùy chọn sẽ áp dụng cho nhóm Galera.
- wsrep_on: Đặt giá trị ON để bật tính năng MariaDB Galera Cluster. Khi được kích hoạt, Galera Cluster sẽ được sử dụng.
- wsrep_provider: Đường dẫn đến thư viện wsrep Provider, trong trường hợp này là /usr/lib/galera/libgalera_smm.so. Thư viện này cung cấp các chức năng cần thiết để thực hiện đồng bộ dữ liệu và đồng bộ hóa giữa các node trong cluster.
- wsrep_cluster_name: Đặt tên cho cluster Galera, trong trường hợp này là “MariaDB Galera Cluster”. Tên này cần phải giống nhau trên tất cả các node trong cluster.
- wsrep_cluster_address: Địa chỉ của các node trong cluster. Trong ví dụ này, chúng ta sử dụng gcomm://mariadb-node1,mariadb-node2,mariadb-node3. Đây là một danh sách các địa chỉ IP hoặc tên miền của các node, được phân tách bằng dấu phẩy.
- wsrep_node_address: Địa chỉ IP của node hiện tại, trong trường hợp này là 192.168.13.208. Đây là địa chỉ IP của node trong cluster Galera.
- wsrep_node_name: Tên của node hiện tại trong cluster, trong trường hợp này là “mariadb-node1”. Tên này cần phải là duy nhất trong cluster.
- default_storage_engine: Đặt động cơ lưu trữ mặc định cho MariaDB, trong trường hợp này là InnoDB. Đây là động cơ lưu trữ được sử dụng cho các bảng trong cơ sở dữ liệu.
- binlog_format: Đặt định dạng nhật ký nhị phân (binary log), trong trường hợp này là row. Định dạng này chỉ định cách MariaDB lưu trữ các thay đổi dữ liệu trong nhật ký.
- innodb_autoinc_lock_mode: Đặt chế độ khóa tự động tăng cho InnoDB, trong trường hợp này là “2”. Chế độ này xác định cách InnoDB khóa bảng khi tạo các giá trị tự động tăng.
Chỉnh sửa bind-address trong file /etc/mysql/mariadb.conf.d/50-server.cnf thành 0.0.0.0 nhé.
sudo sed -i 's/^bind-address\s*=\s*.*$/bind-address = 0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
Những giá trị trên cần được điều chỉnh và thay đổi phù hợp với môi trường và yêu cầu cụ thể của bạn.
2.4. Cấu hình sao chép MariaDB.
Khi sử dụng MariaDB Replication cùng với MariaDB Galera Cluster, có một số tùy chọn và biến cần xem xét. Dưới đây là diễn giải của chúng:
- log_bin: Đặt giá trị ON để bật chức năng nhật ký nhị phân (binary log). Nhật ký nhị phân ghi lại tất cả các thay đổi dữ liệu trong hệ thống và làm cho việc sao chép và đồng bộ dữ liệu trở nên có thể.
- binlog_format: Đặt định dạng của nhật ký nhị phân. MariaDB hỗ trợ nhiều định dạng như “statement”, “row” và “mixed”. Cần chọn định dạng phù hợp để đảm bảo tính nhất quán và hiệu suất trong quá trình sao chép dữ liệu.
- server_id: Đặt ID duy nhất cho mỗi node trong hệ thống. Đây là một yếu tố quan trọng trong quá trình nhận dạng các sự kiện được ghi lại trong nhật ký nhị phân và phân biệt các node trong quá trình sao chép dữ liệu.
- gtid_mode: Đặt chế độ GTID (Global Transaction Identifier). GTID là một cơ chế định danh toàn cầu cho các giao dịch, giúp theo dõi và xác định một cách chính xác các giao dịch đã được sao chép và áp dụng trên các node trong hệ thống sao chép.
- enforce_gtid_consistency: Đặt giá trị ON để bật tính nhất quán GTID. Khi tính nhất quán GTID được kích hoạt, MariaDB sẽ kiểm tra xem tất cả các giao dịch đã được sao chép và áp dụng trên các node trước khi cho phép thực hiện giao dịch mới.
- log_slave_updates: Đặt giá trị ON để ghi lại các thay đổi từ các sự kiện sao chép vào nhật ký nhị phân của node đích. Điều này cho phép node đích trở thành một nguồn sao chép cho các node khác.
- replicate_do_db: Xác định cơ sở dữ liệu cụ thể mà bạn muốn sao chép. Chỉ các bảng từ cơ sở dữ liệu này sẽ được sao chép đến node đích.
- replicate_ignore_db: Xác định cơ sở dữ liệu cụ thể mà bạn muốn bỏ qua trong quá trình sao chép. Các bảng từ cơ sở dữ liệu này sẽ không được sao chép đến node đích.
- replicate_wild_ignore_table: Xác định các bảng cụ thể mà bạn muốn bỏ qua trong quá trình sao chép. Bạn có thể sử dụng các mẫu ký tự đại diện để áp dụng việc bỏ qua cho nhiều bảng.
Cấu hình sao chép MariaDB Replication trong một môi trường MariaDB Galera Cluster phức tạp hơn so với cấu hình sao chép thông thường. Bạn nên xem xét kỹ các tùy chọn và biến này để đảm bảo tính nhất quán và hiệu suất tốt trong quá trình sao chép và đồng bộ dữ liệu.
2.5. Khởi động một Cluster.
MariaDB Galera Cluster được hình thành từ một loạt các MariaDB Community Servers được cấu hình để kết nối với nhau và hình thành một Primary Component.
Nếu cluster chưa chạy, bạn cần khởi động Bootstrap cho Primary Component trên một Cluster Node duy nhất, sau đó khởi động các MariaDB Community Servers khác theo cách thông thường. Nếu cluster đã chạy, khởi động Cluster Node như bạn khởi động một MariaDB Community Server thông thường.
Các Cluster Node bắt đầu như các thành phần không hoạt động. Khi khởi động, chúng cố gắng kết nối với các MariaDB Community Servers khác được liệt kê trong biến wsrep_cluster_address. Khi Node tìm thấy Primary Component, nó yêu cầu một truyền trạng thái để cập nhật cơ sở dữ liệu cục bộ và sau đó trở thành hoạt động.
Nếu Cluster Node không tìm thấy Primary Component, nó vẫn ở trạng thái không hoạt động và không khởi động thành công.
Nếu cluster chưa chạy, bạn cần khởi động Bootstrap cho Primary Component trên node đầu tiên bạn khởi động.
Lưu ý, chỉ thực hiện điều này trên node đầu tiên bạn khởi động. Sử dụng hệ thống quản lý tiến trình bình thường để khởi động tất cả các node khác trong cluster.
Khi sử dụng systemd (hầu hết các hệ điều hành được hỗ trợ), khởi động Bootstrap cho Primary Component bằng cách sử dụng lệnh sudo galera_new_cluster:
sudo galera_new_cluster
2.5. Khởi động một Server.
MariaDB Community Server bao gồm cấu hình để khởi động, dừng, khởi động lại, kích hoạt/tắt khởi động cùng hệ thống và kiểm tra trạng thái của Server bằng cách sử dụng hệ thống quản lý tiến trình mặc định của hệ điều hành.
Lưu ý rằng khi cluster chưa chạy, bạn cần khởi động Bootstrap cho Server đầu tiên.
Đối với các phiên bản sử dụng systemd (hầu hết các hệ điều hành được hỗ trợ), bạn có thể quản lý quy trình Server bằng cách sử dụng lệnh systemctl:
- Khởi động Server:
sudo systemctl start mysql
- Dừng Server:
sudo systemctl stop mysql
- Khởi động lại Server:
sudo systemctl restart mysql
- Kích hoạt Server khởi động cùng hệ thống:
sudo systemctl enable mysql
- Tắt Server khởi động cùng hệ thống:
sudo systemctl disable mysql
- Kiểm tra trạng thái của Server:
sudo systemctl status mysql
Để khởi động một node trong cluster, bạn có thể sử dụng lệnh sau:
sudo galera_new_cluster
Lệnh trên sẽ thực hiện bootstrap cho node đầu tiên trong cluster. Quá trình bootstrap sẽ kích hoạt node và yêu cầu truyền dữ liệu từ thành phần chính (Primary Component) vào node này để cập nhật cơ sở dữ liệu cục bộ và đưa node thành trạng thái hoạt động.
Để khôi phục vị trí của một node trong cluster, bạn có thể sử dụng lệnh sau:
sudo galera_recovery
Lệnh trên sẽ giúp khôi phục vị trí của node trong cluster. Quá trình khôi phục sẽ thực hiện việc kết nối với các node khác trong cluster để đồng bộ dữ liệu và đảm bảo node được đưa về trạng thái hoạt động.
Lưu ý rằng tên dịch vụ có thể khác nhau tùy thuộc vào cài đặt cụ thể của hệ thống. Thông thường, tên dịch vụ là “mysql” hoặc “mariadb”. Bằng cách sử dụng các lệnh trên, bạn có thể quản lý quy trình của MariaDB Community Server và kiểm tra trạng thái của nó trên hệ điều hành của bạn.
Như vậy từ Node thứ 2 trở lên bạn sẽ không chạy lện galera_new_cluster
mà chỉ sử dụng lệnh systemctl restart mariadb
để khởi động lại MariaDB là được rồi. Trường hợp của mình sẽ áp dụng cho Node 2 và Node 3.
systemctl restart mariadb
3. Kiểm tra.
3.1. Kiểm tra trạng thái Cluster.
Khi bạn đã khởi tạo thành công thành phần chính trên node Cluster đầu tiên và tất cả các node Cluster khác đã khởi động, bạn nên tiến hành kiểm tra để đảm bảo chúng hoạt động chính xác và không có vấn đề nào xảy ra với cụm Cluster.
Kiểm tra cụm Kết nối tới bất kỳ node Cluster nào bằng cách sử dụng MariaDB Client:
$ sudo mariadb
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 10.6.14-MariaDB-1:10.6.14+maria~ubu1804 mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Kiểm tra trạng thái wsrep_cluster_size bằng cách sử dụng lệnh SHOW GLOBAL STATUS:
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.002 sec)
Kích thước của cụm phải bằng số Node cụm hiện tại. Nếu thấp hơn dự kiến thì đã một hoặc nhiều Node trong cụm không khởi động đúng cách hoặc không thể kết nối với thành phần chính.
3.2. Kiểm tra quá trình đồng bộ hoá.
Từ Node bất kỳ tôi kết nối vào MariaDB, ví dụ Node 1.
root@mariadb-node1:~# sudo mariadb
Tạo một database test
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS test;
Query OK, 1 row affected (0.024 sec)
Tạo table test.
MariaDB [(none)]> CREATE TABLE test.names (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(255));
Query OK, 0 rows affected (0.054 sec)
Instert dữ liệu test vào database test.
MariaDB [(none)]> INSERT INTO test.names (name)
-> VALUES
-> ("Ha Dang Hoang"),
-> ("Lee Wang"),
-> ("Dani Smith"),
-> ("Hao Nguyen");
Query OK, 4 rows affected (0.008 sec)
Records: 4 Duplicates: 0 Warnings: 0
Xác nhận database test đã khởi tạo và insert dữ liệu thành công.
MariaDB [(none)]> SELECT * FROM test.names;
+----+---------------+
| id | name |
+----+---------------+
| 3 | Ha Dang Hoang |
| 6 | Lee Wang |
| 9 | Dani Smith |
| 12 | Hao Nguyen |
+----+---------------+
4 rows in set (0.001 sec
Dùng MariaDB Client kết nối vào database ở một Node khác với Node 1 vừa tạo database test ở trên.
root@mariadb-node2:~# sudo mariadb
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 36
Server version: 10.6.14-MariaDB-1:10.6.14+maria~ubu1804 mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Xác nhận database đã đồng bộ sang Node thứ 2.
MariaDB [(none)]> SELECT * FROM test.names;
+----+---------------+
| id | name |
+----+---------------+
| 3 | Ha Dang Hoang |
| 6 | Lee Wang |
| 9 | Dani Smith |
| 12 | Hao Nguyen |
+----+---------------+
4 rows in set (0.002 sec)
MariaDB [(none)]>
Tài liệu tham khảo: https://mariadb.com/docs/server/deploy/community-cluster-cs10-6/