18/09/2018, 16:44

Làm thế nào để cấu hình một cụm Galera với MySQL 5.6 trên Ubuntu 16.04

Giới thiệu Clustering bổ sung tính sẵn sàng cao vào cơ sở dữ liệu của bạn bằng cách phân phối các thay đổi trên các máy chủ khác nhau. Trong trường hợp một trong các trường hợp không thành công, các trường hợp khác đã có sẵn để tiếp tục phân phát. Các cụm có hai cấu hình chung, chủ động và thụ ...

Giới thiệu

Clustering bổ sung tính sẵn sàng cao vào cơ sở dữ liệu của bạn bằng cách phân phối các thay đổi trên các máy chủ khác nhau. Trong trường hợp một trong các trường hợp không thành công, các trường hợp khác đã có sẵn để tiếp tục phân phát.

Các cụm có hai cấu hình chung, chủ động và thụ động và chủ động. Trong các cụm hoạt động thụ động, tất cả các ghi được thực hiện trên một máy chủ hoạt động duy nhất và sau đó được sao chép vào một hoặc nhiều máy chủ thụ động sẵn sàng để tiếp nhận chỉ trong trường hợp máy chủ đang hoạt động bị lỗi. Một số cụm hoạt động thụ động cũng cho phép SELECT hoạt động trên các nút thụ động. Trong một cụm hoạt động hoạt động, mỗi nút là đọc-ghi và một thay đổi được thực hiện cho một là nhân rộng cho tất cả.

Trong hướng dẫn này, chúng ta sẽ cấu hình một cụm Galera MySQL hoạt động tích cực. Đối với mục đích trình diễn, chúng tôi sẽ cấu hình và kiểm tra ba nút, cụm cấu hình nhỏ nhất.

Điều kiện tiên quyết

Để theo dõi, bạn sẽ cần ba máy chủ Ubuntu 16.04, mỗi máy chủ có:

  • RAM tối thiểu 1 GB. Cấp phép đủ bộ nhớ cho tập dữ liệu của bạn là điều cần thiết để ngăn chặn sự suy giảm hiệu suất và sự cố. Việc sử dụng bộ nhớ cho các cụm khó dự đoán, vì vậy hãy đảm bảo cho phép nhiều.
  • người dùng không phải root với sudo đặc quyền. Điều này có thể được cấu hình bằng cách làm theo Thiết lập máy chủ ban đầu với Ubuntu 16.04 hướng dẫn.
  • một bức tường lửa đơn giản được kích hoạt. Thực hiện theo các bước cuối cùng của chúng tôi Thiết lập máy chủ ban đầu với Ubuntu 16.04 hướng dẫn để cấu hình với ufw.
  • mạng riêng, nếu nó có sẵn cho bạn. Định cấu hình này bằng cách làm theo hướng dẫn của chúng tôi về Cách thiết lập và sử dụng mạng riêng lẻ DigitalOcean.

Khi tất cả các điều kiện tiên quyết này được đặt ra, chúng tôi sẵn sàng cài đặt phần mềm.

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

MySQL, được vá để bao gồm phân cụm Galera, không được bao gồm trong kho lưu trữ mặc định của Ubuntu, vì vậy chúng tôi sẽ bắt đầu bằng cách thêm các kho lưu trữ Ubuntu bên ngoài được dự án Galera duy trì cho cả ba máy chủ của chúng tôi.

Chú thích: Codership, công ty đằng sau Galera Cluster, duy trì kho lưu trữ này, nhưng lưu ý rằng không phải tất cả các kho lưu trữ bên ngoài đều đáng tin cậy. Đảm bảo chỉ cài đặt từ các nguồn đáng tin cậy.

Trên mỗi máy chủ, thêm khóa kho lưu trữ với apt-key lệnh, cái nào apt sẽ sử dụng để xác minh rằng các gói là xác thực.

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

Khi chúng ta có khóa tin cậy trong mỗi cơ sở dữ liệu của máy chủ, chúng ta có thể thêm các kho lưu trữ. Để làm như vậy, hãy tạo một tệp mới có tên galera.list trong /etc/apt/sources.list.d/ trên mỗi máy chủ:

sudo nano /etc/apt/sources.list.d/galera.list

Trong trình soạn thảo văn bản, thêm các dòng sau sẽ làm cho các kho lưu trữ thích hợp có sẵn cho trình quản lý gói APT:

/etc/apt/sources.list.d/galera.list

deb http://releases.galeracluster.com/mysql-wsrep-5.6/ubuntu xenial main
deb http://releases.galeracluster.com/galera-3/ubuntu xenial main

Lưu và đóng tệp (nhấn CTRL + X, Y, sau đó ENTER).

Các kho lưu trữ Codership hiện có sẵn cho cả ba máy chủ của bạn. Tuy nhiên, điều quan trọng là bạn phải hướng dẫn apt để thích các kho của Codership hơn những người khác để đảm bảo rằng nó cài đặt các phiên bản vá của phần mềm cần thiết để tạo một cụm Galera. Để thực hiện việc này, hãy tạo một tệp mới khác có tên galera.pref trong /etc/apt/preferences.d/ danh mục:

sudo nano /etc/apt/preferences.d/galera.pref

Thêm các dòng sau vào trình soạn thảo văn bản:

/etc/apt/preferences.d/galera.pref

# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

Lưu và đóng tệp đó, rồi chạy sudo apt-get update để bao gồm các tệp kê khai gói từ các kho lưu trữ mới:

sudo apt-get update

Bạn có thể thấy một cảnh báo rằng chữ ký uses weak digest algorithm (SHA1). Có một vấn đề mở trên GitHub để giải quyết vấn đề này. Trong khi chờ đợi, bạn có thể tiếp tục.

Khi kho lưu trữ được cập nhật trên cả ba máy chủ, chúng tôi đã sẵn sàng cài đặt MySQL và Galera.

Bước 2 - Cài đặt MySQL và Galera trên tất cả các máy chủ

Chạy lệnh sau trên cả ba máy chủ để cài đặt một phiên bản của MySQL được vá để làm việc với Galera, cũng như Galera và một số phụ thuộc:

sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6

Trong khi cài đặt, bạn sẽ được yêu cầu đặt mật khẩu cho người dùng quản trị MySQL.

Chúng ta nên có tất cả các phần cần thiết để bắt đầu định cấu hình cụm, nhưng vì chúng ta sẽ dựa vào rsync trong các bước sau, hãy đảm bảo rằng nó được cài đặt trên cả ba bước:

sudo apt-get 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, nhắc bạn nâng cấp phiên bản bạn có hoặc cài đặt phiên bản đó.

Một khi chúng ta đã cài đặt MySQL trên mỗi máy chủ, chúng ta có thể bắt đầu cấu hình.

Bước 3 - Cấu hình nút đầu tiên

Mỗi nút trong cụm cần phải có cấu hình gần như giống nhau. Bởi vì điều này, chúng tôi sẽ làm tất cả các cấu hình trên máy đầu tiên của chúng tôi, và sau đó sao chép nó vào các nút khác.

Theo mặc định, MySQL được cấu hình để kiểm tra /etc/mysql/conf.d thư mục để nhận cài đặt cấu hình bổ sung từ các tệp kết thúc bằng .cnf. Chúng tôi sẽ tạo một tệp trong thư mục này với tất cả các chỉ thị theo cụm cụ thể của chúng tôi:

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

Thêm cấu hình sau vào tệp. Bạn sẽ cần phải thay đổi các cài đặt được đánh dấu bằng màu đỏ. Chúng tôi sẽ giải thích ý nghĩa của từng phần dưới đây.

/etc/mysql/conf.d/galera.cnf on the first node

[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_ip,second_ip,third_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 tái khẳng định cài đặt MySQL sẽ cho phép cụm hoạt động chính xác. Ví dụ: Galera Cluster sẽ không hoạt động với MyISAM hoặc các công cụ lưu trữ phi giao dịch tương tự và mysqld không được ràng buộc với địa chỉ IP cho localhost. Bạn có thể tìm hiểu về các cài đặt chi tiết hơn trên Cụm Galera trang cấu hình hệ thống.

  • Phần "Cấu hình nhà cung cấp Galera" cấu hình các thành phần MySQL cung cấp một API sao chép bản ghi. Điều này có nghĩa là Galera trong trường hợp của chúng tôi, vì Galera là một nhà cung cấp wsrep (write-set replication). Chúng tôi chỉ định các tham số chung để định 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ề Tùy chọn cấu hình Galera.

  • Phần "Cấu hình cụm Galera" xác định cụm, xác định các thành viên cụm theo địa chỉ IP hoặc tên miền có thể phân giải và tạo tên cho cụm để đảm bảo rằng các thành viên tham gia nhóm chính xác. Bạn có thể thay đổi wsrep_cluster_name một cái gì đó có ý nghĩa hơn test_cluster hoặc để nó như vậy, nhưng bạn phải cập nhật wsrep_cluster_address với địa chỉ của ba máy chủ của bạn. Nếu máy chủ của bạn có địa chỉ IP riêng, hãy sử dụng chúng tại đây.

  • Phần "Cấu hình đồng bộ hóa Galera" xác định cách cluster sẽ truyền thông và đồng bộ dữ liệu giữa các thành viên. Điều này chỉ được sử dụng để chuyển trạng thái xảy ra khi một nút trực tuyến. Đối với thiết lập ban đầu của chúng tôi, chúng tôi đang sử dụng rsync, bởi vì nó thường có sẵn và làm những gì chúng ta cần bây giờ.

  • Phần "Cấu hình nút Galera" làm rõ địa chỉ IP và tên của máy chủ hiện tại. Điều này rất hữu ích khi cố gắng chẩn đoán các sự cố trong nhật ký và tham chiếu từng máy chủ theo nhiều cách. Các wsrep_node_address phải khớp với địa chỉ của máy bạn đang truy cập, nhưng bạn có thể chọn bất kỳ tên nào bạn muốn để giúp bạn xác định nút trong tệp nhật ký.

Khi bạn hài lòng với tệp cấu hình cụm của bạn, hãy sao chép nội dung vào khay nhớ tạm của bạn rồi lưu và đóng tệp.

Bây giờ máy chủ đầu tiên được cấu hình, chúng ta sẽ chuyển sang hai nút tiếp theo.

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

Trên mỗi nút còn lại, mở tệp cấu hình:

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

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

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

. . .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
. . .

Lưu và thoát tệp trên mỗi máy chủ.

Chúng tôi gần như đã sẵn sàng để đưa lên các cụm, nhưng trước khi chúng tôi làm, chúng tôi sẽ muốn đảm bảo rằng các cổng thích hợp được mở.

Bước 5 - Mở Firewall trên mọi Server

Trên mọi máy chủ, hãy kiểm tra trạng thái của tường lửa:

sudo ufw status

Trong trường hợp này, chỉ cho phép SSH thông qua:

OutputStatus: active

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

Bạn có thể có các quy tắc khác tại chỗ hoặc không có quy tắc tường lửa nào cả. Vì chỉ lưu lượng truy cập SSH được cho phép trong trường hợp này, bạn cần phải thêm quy tắc cho lưu lượng truy cập MySQL và Galera.

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

  • 3306 được sử dụng cho các kết nối máy khách MySQL và Chuyển trạng thái chụp nhanh sử dụng phương thức mysqldump.
  • 4567 được Galera Cluster sử dụng để nhân rộng lưu lượng, sao chép multicast sử dụng cả giao thức UDP và TCP trên cổng này.
  • 4568 được sử dụng cho Chuyển khoản Nhà nước gia tăng.
  • 4444 được sử dụng cho tất cả các Chuyển trạng thái chụp nhanh khác.

Trong ví dụ của chúng tôi, chúng tôi sẽ mở tất cả bốn cổng trong khi chúng tôi thiết lập. Khi chúng tôi đã xác nhận rằng bản sao đang hoạt động, chúng tôi sẽ đóng mọi cổng mà chúng tôi không thực sự sử dụng và giới hạn lưu lượng truy cập đế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

Chú thích: Tùy thuộc vào những gì khác đang chạy trên máy chủ của bạn, bạn có thể muốn hạn chế quyền truy cập ngay lập tức. Các UFW Essentials: Các quy tắc và lệnh tường lửa phổ biến hướng dẫn có thể giúp với điều này.

Bước 6 - Bắt đầu cụm từ

Để bắt đầu, chúng ta cần phải ngừng dịch vụ MySQL đang chạy để cụm của chúng ta có thể được đưa lên mạng.

Dừng MySQL trên cả ba Máy chủ:

Sử dụng lệnh dưới đây trên cả ba máy chủ để ngăn chặn mysql để chúng tôi có thể đưa chúng trở lại trong một 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 để chắc chắn chúng ta đã thành công, hãy chạy 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. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.

Khi chúng tôi đã tắt mysql trên tất cả các máy chủ, chúng tôi đã sẵn sàng để tiếp tục.

Hiển thị nút đầu tiên:

Cách chúng tôi đã cấu hình cụm của chúng tôi, mỗi nút đến trực tuyến cố gắng kết nối với ít nhất một nút khác được chỉ định trong galera.cnf để có trạng thái ban đầu. Bình thường systemctl start mysql sẽ thất bại vì không có nút nào chạy cho nút đầu tiên để kết nối, vì vậy chúng ta cần phải vượt qua wsrep-new-cluster tham số đến nút đầu tiên mà chúng ta bắt đầu. Tuy nhiên, không phải systemd cũng không service sẽ chấp nhận đúng cách --wsrep-new-cluster lập luận tại thời điểm này, vì vậy chúng tôi sẽ cần bắt đầu nút đầu tiên bằng cách sử dụng tập lệnh khởi động trong /etc/init.d. Khi bạn đã thực hiện việc này, bạn có thể bắt đầu các nút còn lại bằng systemctl.

Chú thích: Nếu bạn thích tất cả chúng được bắt đầu với systemd, một khi bạn có một nút khác, bạn có thể giết nút ban đầu. Vì nút thứ hai có sẵn, khi bạn khởi động lại nút đầu tiên với sudo systemctl start mysql nó sẽ có thể tham gia vào cụm đang chạy

sudo /etc/init.d/mysql start --wsrep-new-cluster

Khi tập lệnh này hoàn thành, nút được đăng ký như một phần của cụm, và chúng ta có thể thấy nó bằng lệnh sau đây:

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

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

Trên các nút còn lại, chúng ta có thể bắt đầu mysql bình thường. Họ sẽ tìm kiếm bất kỳ thành viên nào của danh sách cụm đang trực tuyến, vì vậy khi họ tìm thấy một danh sách, họ sẽ tham gia vào cụm.

Đưa lên nút thứ hai:

Khởi đầu mysql:

sudo systemctl start mysql

Chúng ta sẽ thấy tăng kích thước cụm của chúng tôi khi mỗi nút đến trực tuyến:

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

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

Hiển thị nút thứ ba:

Khởi đầu mysql:

sudo systemctl start mysql

Nếu mọi thứ hoạt động tốt, kích thước cụm phải được đặt thành ba:

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

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

Tại thời điểm này, toàn bộ cụm phải trực tuyến và giao tiếp. Với điều đó, chúng ta có thể kiểm tra sự sao chép giữa mỗi nút của cluster.

Bước 7 - Thử nghiệm nhân rộng

Chúng tôi đã đi qua các bước đến thời điểm này để cụm của chúng tôi có thể thực hiện sao chép từ bất kỳ nút nào đến bất kỳ nút nào khác, được gọi là nhân rộng hoạt động. Hãy kiểm tra xem liệu bản sao có hoạt động như mong đợi hay không.

Viết cho nút đầu tiên:

Chúng ta sẽ bắt đầu bằng cách thay đổi cơ sở dữ liệu trên nút đầu tiên của chúng ta. Các lệnh sau sẽ tạo một cơ sở dữ liệu có tên playground và một cái bàn bên trong cái 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");'

Bây giờ chúng ta có một giá trị trong bảng của chúng ta.

Đọc và viết trên nút thứ hai:

Tiếp theo, chúng tôi sẽ xem xét nút thứ hai để xác minh rằng nhân rộng đang hoạt động:

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

Nếu nhân rộng đang hoạt động, dữ liệu chúng tôi đã nhập vào nút đầu tiên sẽ hiển thị ở đây vào lần thứ hai:

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

Từ cùng một nút này, chúng ta 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à viết trên nút thứ ba:

Từ nút thứ ba, chúng ta có thể đọc tất cả dữ liệu này bằng cách truy vấn lại cơ sở dữ liệu:

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

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

Một lần nữa, chúng ta có thể thêm một giá trị khác từ nút này:

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

Đọc trên nút đầu tiên:

Quay lại nút đầu tiên, chúng tôi có thể xác minh rằng dữ liệu của chúng tôi có sẵn ở mọi nơi:

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

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

Chúng tôi đã thử nghiệm chúng tôi có thể viết cho tất cả các nút và sao chép đó đang được thực hiện đúng cách.

Phần kết luận

Tại thời điểm này, bạn sẽ có một cụm thử nghiệm Galera ba nút đang hoạt động được cấu hình. Nếu bạn dự định sử dụng cụm Galera trong tình huống sản xuất, bạn nên bắt đầu với không ít hơn năm nút.

Trước khi sử dụng sản xuất, bạn có thể muốn xem một số các đại lý chuyển tiếp snapshot (sst) khác giống như “xtrabackup ”cho phép bạn thiết lập các nút mới rất nhanh chóng và không bị gián đoạn lớn đối với các nút đang hoạt động của bạn, điều này không ảnh hưởng đến sự sao chép thực tế, nhưng là mối lo ngại khi các nút đang được khởi tạo. di chuyển giữa các máy chủ, bạn cũng nên thiết lập SSL mã hóa.

0