Định cấu hình cụm Galera với MariaDB trên máy chủ Debian 10

Clustering (phân cụm) giúp tăng tính sẵn có cao cho cơ sở dữ liệu bằng cách phân phối các thay đổi đến các máy chủ khác nhau. Trong trường hợp một trong các phiên bản bị lỗi, các phiên bản khác sẽ sẵn sàng tiếp tục phục vụ.

Có hai cấu hình tổng quát cho các nhóm, đó là cấu hình active-passive và active-active. Trong nhóm active-passive, tất cả các ghi được thực hiện trên một máy chủ active duy nhất và sau đó được sao chép sang một hoặc nhiều máy chủ passive, chỉ sẵn sàng tiếp quản khi máy chủ active gặp sự cố. Một số nhóm active-passive cũng cho phép thực hiện các hoạt động SELECT trên các nút passive. Trong một nhóm active-active, mỗi nút đều có thể đọc và ghi, và bất kỳ thay đổi nào được thực hiện trên một nút sẽ được sao chép sang tất cả các nút khác.

MariaDB là một hệ thống cơ sở dữ liệu quan hệ mã nguồn mở hoàn toàn tương thích với hệ thống quản lý cơ sở dữ liệu MySQL phổ biến. Bạn có thể đọc tài liệu chính thức về MariaDB tại trang này. Galera là một giải pháp tụ tập cơ sở dữ liệu cho phép bạn thiết lập các nhóm đa chủ sử dụng đồng bộ hóa sao chép. Galera tự động duy trì đồng bộ dữ liệu trên các nút khác nhau trong khi cho phép bạn gửi các truy vấn đọc và ghi đến bất kỳ nút nào trong nhóm. Bạn có thể tìm hiểu thêm về Galera tại trang tài liệu chính thức.

Trong hướng dẫn này, bạn sẽ cấu hình một nhóm MariaDB Galera active-active. Vì mục đích minh họa, bạn sẽ cấu hình và kiểm tra ba máy chủ Debian 10 sẽ hoạt động như các nút trong nhóm. Đây là nhóm có kích thước nhỏ nhất có thể cấu hình.

Yêu cầu tiên quyết

Để làm theo hướng dẫn này, bạn cần có một tài khoản DigitalOcean, cùng với những yêu cầu sau:

  • Ba máy chủ Debian 10 đã bật tính năng mạng riêng, mỗi máy chủ có một người dùng không phải root có đặc quyền sudo.
  • Để cài đặt mạng riêng trên ba Droplet, làm theo hướng dẫn Khởi động nhanh Mạng riêng tư của chúng tôi.
  • Để được hỗ trợ cài đặt người dùng không phải root có đặc quyền sudo, làm theo hướng dẫn Thiết lập Ban đầu Máy chủ với Debian 10 của chúng tôi.

Mặc dù các bước trong hướng dẫn này đã được viết và kiểm tra với Droplet DigitalOcean, nhưng hầu hết các bước đều áp dụng cho các máy chủ không phải DigitalOcean có tính năng mạng riêng.

Bước 1 — Thêm kho lưu trữ MariaDB vào tất cả các máy chủ

Trong bước này, bạn sẽ thêm các kho lưu trữ gói MariaDB vào từng máy chủ của bạn để bạn có thể cài đặt phiên bản MariaDB phù hợp được sử dụng trong hướng dẫn này. Khi kho lưu trữ được cập nhật trên tất cả ba máy chủ, bạn sẽ sẵn sàng cài đặt MariaDB.

Lưu ý về MariaDB là nó xuất phát như một sự thay thế thích hợp cho MySQL, vì vậy trong nhiều tệp cấu hình và kịch bản khởi động, bạn sẽ thấy từ khóa mysql thay vì mariadb. Vì mục đích nhất quán, trong hướng dẫn này, chúng tôi sẽ sử dụng từ khóa mysql khi cả hai đều có thể hoạt động.

Trong hướng dẫn này, bạn sẽ sử dụng MariaDB phiên bản 10.4. Vì phiên bản này không được bao gồm trong các kho lưu trữ mặc định của Debian, bạn bắt đầu bằng cách thêm kho lưu trữ Debian bên ngoài do dự án MariaDB duy trì vào tất cả ba máy chủ.

Để thêm kho lưu trữ, trước tiên, bạn cần cài đặt các gói dirmngr và software-properties-common. Dirmngr là một máy chủ để quản lý chứng chỉ và khóa kho lưu trữ. Software-properties-common là một gói cho phép bạn dễ dàng thêm và cập nhật vị trí kho lưu trữ nguồn. Cài đặt hai gói này bằng cách chạy lệnh sau:

sudo apt install dirmngr software-properties-common

Lưu ý: MariaDB là một nhà cung cấp đáng tin cậy, nhưng không phải tất cả các kho lưu trữ bên ngoài đều đáng tin cậy. Hãy chắc chắn chỉ cài đặt từ các nguồn đáng tin cậy.

Bạn sẽ thêm khóa kho lưu trữ MariaDB bằng lệnh apt-key, trình quản lý gói APT sẽ sử dụng để xác minh tính xác thực của gói:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

Khi đã có khóa tin cậy trong cơ sở dữ liệu, bạn thêm kho lưu trữ bằng lệnh sau:

sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/debian buster main'

Khi đã thêm kho lưu trữ, chạy lệnh apt update để bao gồm các thông tin gói từ kho lưu trữ mới:

sudo apt update

Hoàn tất bước này trên máy chủ đầu tiên, sau đó lặp lại quy trình trên máy chủ thứ hai và thứ ba của bạn.

Bây giờ bạn đã thành công trong việc thêm kho lưu trữ gói trên cả ba máy chủ, bạn đã sẵn sàng cài đặt MariaDB trong phần tiếp theo của hướng dẫn.

Bước 2 — Cài đặt MariaDB trên tất cả các máy chủ

Trong bước này, bạn sẽ cài đặt các gói MariaDB thực tế trên ba máy chủ.

Bắt đầu từ phiên bản 10.1, các gói MariaDB Server và MariaDB Galera Server đã được kết hợp, vì vậy việc cài đặt mariadb-server sẽ tự động cài đặt Galera và một số phụ thuộc:

sudo apt install mariadb-server

Bạn sẽ được hỏi xác nhận liệu bạn có muốn tiếp tục cài đặt hay không. Nhập "yes" để tiếp tục cài đặt.

Từ phiên bản MariaDB 10.4 trở đi, người dùng root của MariaDB sẽ không có mật khẩu mặc định. Để đặt mật khẩu cho người dùng root, bắt đầu bằng đăng nhập vào MariaDB:

sudo mysql -uroot

Khi đã trong giao diện dòng lệnh MariaDB, thay đổi mật khẩu bằng cách thực thi câu lệnh sau:

set password = password("your_password");

Đầu ra sau đây cho biết mật khẩu đã được đặt thành công:

Output
Query OK, 0 rows affected (0.001 sec)

Thoát khỏi giao diện dòng lệnh MariaDB bằng lệnh sau:

quit;

Bây giờ bạn đã có tất cả những thành phần cần thiết để bắt đầu cấu hình nhóm, nhưng vì bạn sẽ phụ thuộc vào rsync trong các bước sau, hãy chắc chắn rằng nó đã được cài đặt:

sudo apt install rsync

Điều này sẽ xác nhận rằng phiên bản mới nhất của rsync đã có sẵn hoặc yêu cầu bạn nâng cấp hoặc cài đặt nó.

Sau khi đã cài đặt MariaDB và đặt mật khẩu root trên máy chủ đầu tiên, lặp lại các bước này cho hai máy chủ còn lại của bạn.

Bây giờ bạn đã thành công trong việc cài đặt MariaDB trên mỗi trong ba máy chủ, bạn có thể tiếp tục đến bước cấu hình trong phần tiếp theo.

Bước 3: Định cấu hình nút đầu tiên

Trong bước này, bạn sẽ cấu hình node đầu tiên trong cụm của mình. Mỗi node trong cụm cần có cấu hình gần như giống nhau. Do đó, bạn sẽ thực hiện tất cả các cấu hình trên máy đầu tiên, sau đó sao chép nó sang các node khác.

Mặc định, MariaDB được cấu hình để kiểm tra thư mục /etc/mysql/conf.d để lấy các thiết lập cấu hình bổ sung từ các tệp kết thúc bằng .cnf. Tạo một tệp trong thư mục này với tất cả các cụm cụ thể:

sudo nano /etc/mysql/conf.d/galera.cnf

Thêm cấu hình sau vào tệp. Cấu hình này chỉ định các tùy chọn cụ thể của cụm, chi tiết về máy chủ hiện tại và các máy chủ khác trong cụm, cũng như các thiết lập liên quan đến sao chép dữ liệu. Lưu ý rằng các địa chỉ IP trong cấu hình là địa chỉ IP riêng của các máy chủ tương ứng; thay thế các dòng được làm nổi bật bằng các địa chỉ IP phù hợp.

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
  • Phần đầu tiên sửa đổi hoặc khẳng định lại các thiết lập của MariaDB/MySQL để cho phép cụm hoạt động chính xác. Ví dụ, Galera không hoạt động với MyISAM hoặc các loại bộ nhớ lưu trữ không có giao dịch tương tự, và mysqld không được ràng buộc với địa chỉ IP của localhost. Bạn có thể tìm hiểu về các thiết lập chi tiết hơn trên trang cấu hình hệ thống cụm Galera.
  • Phần "Galera Provider Configuration" cấu hình các thành phần MariaDB cung cấp giao diện lập chỉ mục WriteSet. Trong trường hợp này, đó là Galera, vì Galera là nhà cung cấp wsrep (WriteSet Replication). Bạn chỉ định các tham số chung để cấu hình môi trường sao chép ban đầu. Điều này không yêu cầu bất kỳ tùy chỉnh nào, nhưng bạn có thể tìm hiểu thêm về các tùy chọn cấu hình Galera.
  • Phần "Galera Cluster Configuration" xác định cụm, xác định các thành viên cụm bằng địa chỉ IP hoặc tên miền có thể giải quyết được và tạo tên cho cụm để đảm bảo các thành viên tham gia vào nhóm đúng. Bạn có thể thay đổi wsrep_cluster_name thành cái gì đó có ý nghĩa hơn là test_cluster hoặc giữ nguyên, nhưng bạn phải cập nhật wsrep_cluster_address với địa chỉ IP riêng của ba máy chủ của bạn.
  • Phần "Galera Synchronization Configuration" xác định cách cụm sẽ giao tiếp và đồng bộ dữ liệu giữa các thành viên. Điều này chỉ được sử dụng cho quá trình truyền trạng thái xảy ra khi một node khởi động. Trong cài đặt ban đầu của bạn, bạn sử dụng rsync, vì nó thông dụng và thực hiện những gì bạn cần trong lúc này.
  • Phần "Galera Node Configuration" làm rõ địa chỉ IP và tên của máy chủ hiện tại. Điều này hữu ích khi cố gắng chẩn đoán các vấn đề trong nhật ký và để tham chiếu từng máy chủ theo nhiều cách khác nhau. wsrep_node_address phải khớp với địa chỉ của máy bạn đang sử dụng, nhưng bạn có thể chọn bất kỳ tên nào bạn muốn để giúp bạn nhận dạng node trong các tệp nhật ký.

Khi bạn hài lòng với tệp cấu hình cụm của mình, sao chép nội dung vào clipboard, lưu và đóng tệp. Với trình soạn thảo văn bản nano, bạn có thể thực hiện điều này bằng cách nhấn CTRL+X, gõ y và nhấn ENTER.

Sau khi bạn đã cấu hình thành công node đầu tiên của mình, bạn có thể tiếp tục cấu hình các node còn lại trong phần tiếp theo.

Bước 4 - Định cấu hình các nút còn lại

Trong bước này, bạn sẽ cấu hình hai node còn lại. Trên node thứ hai, mở tệp cấu hình:

sudo nano /etc/mysql/conf.d/galera.cnf

Dán cấu hình bạn đã sao chép từ node đầu tiên vào đó, sau đó cập nhật phần Cấu hình Node Galera để sử dụng địa chỉ IP hoặc tên miền có thể giải quyết được cho node cụ thể mà bạn đang cài đặt. Cuối cùng, cập nhật tên của nó, bạn có thể đặt bất kỳ cái gì giúp bạn nhận dạng node trong các tệp nhật ký của mình:

. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .

Lưu và thoát khỏi tệp.

Sau khi hoàn thành các bước này, lặp lại chúng trên node thứ ba.

Bạn gần như đã sẵn sàng để triển khai cụm, nhưng trước khi làm điều đó, hãy đảm bảo rằng các cổng phù hợp đã được mở trong tường lửa của bạn.

Bước 5 — Mở tường lửa trên từng máy chủ

Trong bước này, bạn sẽ cấu hình tường lửa của mình để mở các cổng yêu cầu cho giao tiếp giữa các node. Trên mỗi máy chủ, kiểm tra trạng thái của tường lửa bằng cách chạy:

sudo ufw status

Trong trường hợp này, chỉ có SSH được phép qua:

Output
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)

Vì chỉ có lưu lượng SSH được phép trong trường hợp này, bạn cần thêm các quy tắc cho lưu lượng MySQL và Galera. Nếu bạn cố gắng khởi động cụm, nó sẽ không thành công vì quy tắc tường lửa.

Galera có thể sử dụng bốn cổng:

  • 3306 Cho kết nối khách hàng MySQL và State Snapshot Transfer sử dụng phương pháp mysqldump.
  • 4567 Cho lưu lượng sao chép cụm Galera. Sao chép đa điểm sử dụng cả giao vận UDP và TCP trên cổng này.
  • 4568 Cho Incremental State Transfer.
  • 4444 Cho tất cả các State Snapshot Transfer khác.

Trong ví dụ này, bạn sẽ mở cả bốn cổng trong quá trình thiết lập của bạn. Sau khi xác nhận rằng sao chép đang hoạt động, bạn sẽ muốn đóng các cổng không sử dụng thực tế và hạn chế lưu lượng chỉ đến các máy chủ trong cụm.

Mở các cổng bằng lệnh sau:

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

Lưu ý: Tùy thuộc vào những gì đang chạy trên máy chủ của bạn, bạn có thể muốn hạn chế truy cập ngay lập tức. Hướng dẫn UFW Essentials: Common Firewall Rules and Commands có thể giúp bạn trong việc này.

Sau khi đã cấu hình tường lửa trên node đầu tiên, tạo các cài đặt tường lửa tương tự trên node thứ hai và thứ ba.

Bây giờ, sau khi bạn đã cấu hình tường lửa thành công, bạn đã sẵn sàng khởi động cụm trong bước tiếp theo.

Bước 6 — Khởi động cụm

Trong bước này, bạn sẽ khởi động cụm MariaDB của mình. Để bắt đầu, bạn cần dừng dịch vụ MariaDB đang chạy để bạn có thể khởi động cụm.

Dừng MariaDB trên tất cả ba máy chủ

Sử dụng lệnh sau trên cả ba máy chủ để dừng MariaDB để bạn có thể khởi động lại chúng trong cụm:

sudo systemctl stop mysql

systemctl không hiển thị kết quả của tất cả các lệnh quản lý dịch vụ, vì vậy để đảm bảo bạn đã thành công, hãy sử dụng lệnh sau:

sudo systemctl status mysql

Nếu dòng cuối cùng trông giống như sau, lệnh đã thành công:

Output
. . .
Apr 26 03:34:23 galera-node-01 systemd[1]: Stopped MariaDB 10.4.4 database server.

Sau khi tắt mysql trên tất cả các máy chủ, bạn đã sẵn sàng tiếp tục.

Khởi động Node đầu tiên

Để khởi động node đầu tiên, bạn cần sử dụng một tập lệnh khởi động đặc biệt. Cách bạn đã cấu hình cụm của mình, mỗi node khi khởi động cố gắng kết nối ít nhất với một node khác được chỉ định trong tệp galera.cnf để lấy trạng thái ban đầu của nó. Nếu không sử dụng tập lệnh galera_new_cluster cho phép systemd truyền tham số --wsrep-new-cluster, một lệnh thông thường systemctl start mysql sẽ không thành công vì không có node nào đang chạy để node đầu tiên kết nối.

sudo galera_new_cluster

Lệnh này sẽ không hiển thị bất kỳ đầu ra nào khi thực thi thành công. Khi tập lệnh này thành công, node sẽ được đăng ký là một phần của cụm và bạn có thể xem nó bằng lệnh sau:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Bạn sẽ thấy đầu ra sau đây cho biết có một node trong cụm:

Output
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+

Trên các node còn lại, bạn có thể khởi động mysql theo cách thông thường. Chúng sẽ tìm kiếm bất kỳ thành viên nào trong danh sách cụm đang hoạt động, vì vậy khi chúng tìm thấy một node, chúng sẽ tham gia vào cụm.

Khởi động Node thứ hai

Bây giờ bạn có thể khởi động node thứ hai. Khởi động mysql:

sudo systemctl start mysql

Không có đầu ra nào sẽ hiển thị khi thực thi thành công. Bạn sẽ thấy kích thước cụm tăng lên khi mỗi node khởi động:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Bạn sẽ thấy đầu ra sau đây cho biết node thứ hai đã tham gia vào cụm và tổng cộng có hai node.

Output
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+

Khởi động Node thứ ba

Bây giờ là lúc khởi động node thứ ba. Khởi động mysql:

sudo systemctl start mysql

Chạy lệnh sau để tìm kích thước cụm:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Bạn sẽ thấy đầu ra sau đây, cho biết node thứ ba đã tham gia vào cụm và tổng số node trong cụm là ba.

Output
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+

Ở điểm này, toàn bộ cụm đã trực tuyến và giao tiếp thành công. Bây giờ, bạn có thể đảm bảo sự cài đặt hoạt động bằng cách kiểm tra sao chép trong phần tiếp theo.

Bước 7 — Kiểm tra sao chép

Bạn đã hoàn thành các bước đến điểm này để cụm của bạn có thể thực hiện sao chép từ bất kỳ node nào sang bất kỳ node khác, được gọi là sao chép hoạt động- hoạt động. Làm theo các bước dưới đây để kiểm tra và xem liệu sao chép có hoạt động như mong đợi hay không.

Ghi vào Node đầu tiên

Bạn sẽ bắt đầu bằng việc thay đổi cơ sở dữ liệu trên node đầu tiên. Các lệnh sau sẽ tạo một cơ sở dữ liệu được gọi là playground và một bảng trong cơ sở dữ liệu này được gọi là equipment.

mysql -u root -p -e 'CREATE DATABASE playground;
CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

Trong lệnh trước, câu lệnh CREATE DATABASE tạo một cơ sở dữ liệu có tên là playground. Câu lệnh CREATE tạo một bảng có tên equipment trong cơ sở dữ liệu playground với một cột định danh tự tăng gọi là id và các cột khác. Cột type, cột quant và cột color được xác định để lưu trữ loại, số lượng và màu sắc của thiết bị tương ứng. Câu lệnh INSERT chèn một mục của loại slide, số lượng 2 blue.

Bây giờ bạn có một giá trị trong bảng của mình.

Đọc và ghi trên Node thứ hai

Tiếp theo, hãy xem node thứ hai để xác nhận rằng sao chép đang hoạt động:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Nếu sao chép hoạt động, dữ liệu bạn đã nhập trên node đầu tiên sẽ hiển thị ở đây trên node thứ hai:

Output
+----+-------+-------+-------+
| id | type | quant | color |
+----+-------+-------+-------+
| 1 | slide | 2 | blue |
+----+-------+-------+-------+

Từ cùng một node này, bạn có thể ghi dữ liệu vào cụm:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

Đọc và ghi trên Node thứ ba

Từ node thứ ba, bạn có thể đọc tất cả các dữ liệu này bằng cách truy vấn bảng một lần nữa:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Bạn sẽ thấy đầu ra sau đây cho biết có hai hàng:

Output
+----+-------+-------+--------+
| id | type | quant | color |
+----+-------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
+----+-------+-------+--------+

Một lần nữa, bạn có thể thêm một giá trị khác từ node này:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

Đọc trên Node đầu tiên

Quay lại node đầu tiên, bạn có thể xác nhận rằng dữ liệu của bạn có sẵn ở mọi nơi:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Bạn sẽ thấy đầu ra sau đây cho biết các hàng có sẵn trên node đầu tiên.

Output
+----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
| 3 | seesaw | 3 | green |
+----+--------+-------+--------+

Bạn đã xác nhận thành công rằng bạn có thể ghi vào tất cả các node và sao chép được thực hiện đúng cách.

Kết luận

Tại điểm này, bạn đã cấu hình thành công một cụm thử nghiệm cấu hình cụm Galera gồm ba node. Nếu bạn định sử dụng cụm Galera trong một môi trường sản xuất, nên bắt đầu với ít nhất năm node.