Giới thiệu

Nhân rộng MySQL sao chép dữ liệu và hoạt động từ cơ sở dữ liệu này sang cơ sở dữ liệu khác một cách đáng tin cậy. Sao chép thông thường liên quan đến một máy chủ chính được cấu hình để chấp nhận các thao tác ghi cơ sở dữ liệu với các máy chủ thứ cấp sao chép và áp dụng các hành động từ nhật ký máy chủ chính đến các tập dữ liệu của riêng chúng. Các máy chủ thứ cấp này có thể được sử dụng để đọc, nhưng thường không thể thực thi ghi dữ liệu.

Nhân rộng nhóm là một cách để thực hiện một cơ chế nhân rộng có khả năng chịu lỗi và linh hoạt hơn. Quá trình này bao gồm việc thiết lập một nhóm các máy chủ có liên quan đến việc đảm bảo dữ liệu được sao chép chính xác. Nếu máy chủ chính gặp sự cố, cuộc bầu cử thành viên có thể chọn một chính mới từ nhóm. Điều này cho phép các nút còn lại tiếp tục hoạt động, ngay cả khi đối mặt với các vấn đề. Thương lượng thành viên, phát hiện lỗi và gửi tin nhắn được cung cấp thông qua việc thực hiện Thuật toán đồng bộ Paxos.

Trong hướng dẫn này, chúng tôi sẽ thiết lập sao chép nhóm MySQL bằng cách sử dụng một bộ ba máy chủ Ubuntu 16.04. Cấu hình sẽ bao gồm cách vận hành một nhóm nhân bản chính hoặc đa nhân bản chính.

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

Để làm theo cùng, bạn sẽ cần một nhóm ba máy chủ Ubuntu 16.04. Trên mỗi máy chủ này, bạn sẽ cần phải thiết lập người dùng không phải root với sudo đặc quyền và cấu hình tường lửa cơ bản. Chúng tôi sẽ sử dụng hướng dẫn cài đặt máy chủ ban đầu cho Ubuntu 16.04 để đáp ứng các yêu cầu này và đưa mỗi máy chủ vào trạng thái sẵn sàng.

Phiên bản MySQL trong kho lưu trữ mặc định của Ubuntu không bao gồm plugin sao chép nhóm mà chúng tôi yêu cầu. Rất may, dự án MySQL duy trì kho lưu trữ của riêng họ cho phiên bản MySQL mới nhất bao gồm thành phần này. Làm theo hướng dẫn của chúng tôi về cài đặt MySQL mới nhất trên Ubuntu 16.04 để cài đặt một phiên bản MySQL có khả năng nhân rộng nhóm trên mỗi máy chủ.

Tạo một UUID để xác định nhóm MySQL

Trước khi mở tệp cấu hình MySQL để cấu hình các thiết lập sao chép nhóm, chúng ta cần tạo ra một UUID mà chúng ta có thể sử dụng để xác định nhóm MySQL mà chúng ta sẽ tạo ra.

Trên mysqlmember1, sử dụng uuidgen lệnh để tạo UUID hợp lệ cho nhóm:

uuidgen

Output
959cf631-538c-415d-8164-ca00181be227

Sao chép giá trị bạn nhận được. Chúng tôi sẽ phải tham khảo điều này trong giây lát khi định cấu hình tên nhóm cho nhóm máy chủ của chúng tôi.

Thiết lập nhóm nhân rộng trong tệp cấu hình MySQL

Bây giờ chúng ta đã sẵn sàng để sửa đổi tập tin cấu hình của MySQL. Mở tệp cấu hình MySQL chính trên mỗi máy chủ MySQL:

sudo nano /etc/mysql/my.cnf

Theo mặc định, tệp này chỉ được sử dụng để nguồn tệp bổ sung từ thư mục con. Chúng tôi sẽ phải thêm cấu hình của riêng mình ở trên các !includedir dòng. Điều này cho phép chúng tôi dễ dàng ghi đè bất kỳ cài đặt nào từ các tệp được bao gồm.

Để bắt đầu, hãy mở một phần cho các thành phần máy chủ MySQL bằng cách bao gồm một [mysqld] tiêu đề. Bên dưới này, chúng ta sẽ dán vào các thiết lập mà chúng ta cần để nhân bản nhóm. Các loose- tiền tố cho phép MySQL xử lý các tùy chọn một cách duyên dáng mà nó không nhận ra một cách duyên dáng mà không bị lỗi. Chúng tôi sẽ cần phải điền và tùy chỉnh nhiều cài đặt này trong một thời điểm:

/etc/mysql/my.cnf

. . .
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]

# General replication settings
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1

# Shared replication group configuration
loose-group_replication_group_name = ""
loose-group_replication_ip_whitelist = ""
loose-group_replication_group_seeds = ""

# Single or Multi-primary mode? Uncomment these two lines
# for multi-primary mode, where any host can accept writes
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON

# Host specific replication configuration
server_id = 
bind-address = ""
report_host = ""
loose-group_replication_local_address = ""

Chúng tôi đã chia cấu hình ở trên thành bốn phần. Hãy xem qua chúng ngay bây giờ.

Boilerplate Group Replication Settings

Phần đầu tiên chứa các cài đặt chung cần thiết cho việc sao chép nhóm mà không yêu cầu sửa đổi:

/etc/mysql/my.cnf

. . .
# General replication settings
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1
. . .

Các cài đặt này bật ID giao dịch toàn cầu, định cấu hình ghi nhật ký nhị phân cần thiết cho việc sao chép nhóm và định cấu hình SSL cho nhóm. Cấu hình cũng thiết lập một vài mục khác hỗ trợ khôi phục và bootstrapping. Bạn không cần phải sửa đổi bất cứ điều gì trong phần này, vì vậy bạn có thể di chuyển sau khi dán nó vào.

Cài đặt nhân bản nhóm được chia sẻ

Phần thứ hai thiết lập cài đặt chia sẻ cho nhóm. Chúng tôi sẽ phải tùy chỉnh điều này một lần và sau đó sử dụng các cài đặt tương tự trên mỗi nút của chúng tôi. Điều này bao gồm UUID cho nhóm, danh sách trắng của các thành viên được chấp nhận và thành viên hạt giống cần liên hệ để nhận dữ liệu ban đầu.

Đặt loose-group_replication_group_name với UUID bạn đã tạo trước đây với uuidgen chỉ huy. Dán UUID bạn đã sao chép làm giá trị cho biến này.

Tiếp theo, đặt loose-group_replication_ip_whitelist vào danh sách tất cả các địa chỉ IP máy chủ MySQL của bạn, được phân tách bằng dấu phẩy. Các loose-group_replication_group_seeds thiết lập phải gần như giống với danh sách trắng, nhưng nên nối thêm cổng sao chép nhóm mà chúng ta sẽ sử dụng vào cuối mỗi thành viên. Đối với hướng dẫn này, chúng tôi sẽ sử dụng cổng được đề xuất là 33061 để sao chép nhóm:

/etc/mysql/my.cnf

. . .
# Shared replication group configuration
loose-group_replication_group_name = "959cf631-538c-415d-8164-ca00181be227"
loose-group_replication_ip_whitelist = "203.0.113.1,203.0.113.2,203.0.113.3"
loose-group_replication_group_seeds = ""203.0.113.1:33061,203.0.113.2:33061,203.0.113.3:33061"
. . .

Phần này phải giống nhau trên mỗi máy chủ MySQL của bạn, vì vậy hãy đảm bảo sao chép nó một cách cẩn thận.

Chọn đơn chính hoặc đa chính

Tiếp theo, bạn cần phải quyết định có nên định cấu hình một nhóm chính hoặc nhóm chính hay không. Trong một số phần của tài liệu MySQL chính thức, sự khác biệt này cũng được gọi là bản sao "đơn" so với "đa chủ". Trong một cấu hình chính, MySQL chỉ định một máy chủ chính (hầu như luôn là thành viên nhóm đầu tiên) để xử lý các hoạt động ghi. Một nhóm đa chính cho phép ghi vào bất kỳ thành viên nhóm nào.

Nếu bạn muốn định cấu hình một nhóm đa chính, hãy bỏ ghi chú loose-group_replication_single_primary_modeloose-group_replication_enforce_update_everywhere_checks chỉ thị. Điều này sẽ thiết lập một nhóm đa chính. Đối với một nhóm chính, chỉ cần để lại hai dòng đó đã nhận xét:

/etc/mysql/my.cnf

. . .
# Single or Multi-primary mode? Uncomment these two lines
# for multi-primary mode, where any host can accept writes
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON
. . .

Các thiết lập này phải giống nhau trên mỗi máy chủ MySQL của bạn.

Bạn có thể thay đổi cài đặt này sau đó, nhưng không thể khởi động lại nhóm MySQL của bạn. Để thay đổi cấu hình mới, bạn sẽ phải dừng từng cá thể MySQL trong nhóm, bắt đầu mỗi thành viên với các thiết lập mới, và sau đó khởi động lại bản sao nhóm. Điều này sẽ không ảnh hưởng đến bất kỳ dữ liệu nào của bạn, nhưng yêu cầu một thời gian ngừng hoạt động nhỏ.

Cài đặt cấu hình máy chủ lưu trữ cụ thể

Phần thứ tư chứa các cài đặt sẽ khác nhau trên mỗi máy chủ, bao gồm:

  • ID máy chủ
  • Địa chỉ liên kết với
  • Địa chỉ để báo cáo cho các thành viên khác
  • Địa chỉ nhân bản cục bộ và cổng nghe

Các server_id chỉ thị phải được đặt thành một số duy nhất. Đối với thành viên đầu tiên, chỉ cần đặt thành "1" và tăng số trên mỗi máy chủ bổ sung. Bộ bind-addressreport_host đến địa chỉ IP của máy chủ hiện tại để trường hợp MySQL sẽ lắng nghe các kết nối bên ngoài và báo cáo chính xác địa chỉ của nó cho các máy chủ khác. Các loose-group_replication_local_address cũng nên được đặt thành địa chỉ IP của máy chủ hiện tại với cổng sao chép nhóm (33061), được nối vào địa chỉ IP:

/etc/mysql/my.cnf

. . .
# Host specific replication configuration
server_id = 1
bind-address = "203.0.113.1"
report_host = "203.0.113.1"
loose-group_replication_local_address = "203.0.113.1:33061"

Hoàn thành quá trình này trên mỗi máy chủ MySQL của bạn.

Khi bạn hoàn tất, hãy kiểm tra kỹ xem các cài đặt sao chép được chia sẻ có giống nhau trên mỗi máy chủ và các cài đặt dành riêng cho máy chủ lưu trữ được tùy chỉnh cho mỗi máy chủ hay không. Lưu và đóng tệp trên mỗi máy chủ khi bạn hoàn tất.

Khởi động lại MySQL và kích hoạt truy cập từ xa

Tệp cấu hình MySQL của chúng tôi bây giờ chứa các chỉ thị cần thiết để khởi động lại bản sao nhóm MySQL. Để áp dụng các thiết lập mới cho cá thể MySQL, khởi động lại dịch vụ trên mỗi máy chủ của bạn với lệnh sau:

sudo systemctl restart mysql

Trong tệp cấu hình MySQL, chúng tôi đã cấu hình dịch vụ để lắng nghe các kết nối bên ngoài trên cổng mặc định 3306. Chúng tôi cũng định nghĩa 33061 là cổng mà các thành viên nên sử dụng để phối hợp nhân rộng.

Chúng ta cần phải mở quyền truy cập vào hai cổng này trong tường lửa của mình, mà chúng ta có thể thực hiện bằng cách gõ:

sudo ufw allow 33061

sudo ufw allow 3306

Với quyền truy cập vào các cổng MySQL đang mở, chúng ta có thể tạo một người dùng nhân bản và kích hoạt plugin sao chép nhóm.

Cấu hình sao chép người dùng và kích hoạt nhóm sao chép Plugin

Trên mỗi máy chủ MySQL của bạn, đăng nhập vào cá thể MySQL của bạn với người dùng quản trị để bắt đầu một phiên tương tác:

mysql -u root -p

Bạn sẽ được nhắc nhập mật khẩu quản trị MySQL. Sau đó, bạn sẽ được đưa vào một phiên MySQL. Điều đầu tiên chúng ta cần làm là tạo một người dùng nhân bản.

Một người sử dụng nhân rộng được yêu cầu trên mỗi máy chủ để thiết lập sao chép nhóm. Bởi vì mỗi máy chủ sẽ có người dùng sao chép riêng của nó, chúng ta cần phải tắt đăng nhập nhị phân trong quá trình tạo. Nếu không, sau khi nhân rộng bắt đầu, nhóm sẽ cố gắng tuyên truyền người dùng nhân bản từ chính đến các máy chủ khác, tạo ra một xung đột với người dùng nhân bản đã có sẵn.

Chúng tôi sẽ yêu cầu SSL cho người dùng nhân bản, cấp cho họ quyền nhân rộng trên máy chủ và sau đó xóa các đặc quyền để thực hiện các thay đổi. Sau đó, chúng tôi sẽ bật lại tính năng ghi nhật ký nhị phân để tiếp tục hoạt động bình thường. Đảm bảo sử dụng mật khẩu an toàn khi tạo người dùng sao chép:

SET SQL_LOG_BIN=0;

CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL;

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

FLUSH PRIVILEGES;

SET SQL_LOG_BIN=1;

Tiếp theo, chúng ta cần thiết lập group_replication_recovery kênh để sử dụng người dùng nhân bản mới của chúng tôi và mật khẩu được liên kết. Mỗi máy chủ sau đó sẽ sử dụng các thông tin đăng nhập này để xác thực cho nhóm.

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

Với người sử dụng nhân rộng tại chỗ, chúng ta có thể kích hoạt plugin sao chép nhóm để chuẩn bị khởi tạo nhóm. Vì chúng tôi đang sử dụng phiên bản mới nhất của MySQL, chúng tôi có thể bật plugin bằng cách nhập:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

Xác minh rằng plugin đang hoạt động bằng cách nhập:

SHOW PLUGINS;

Output+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
|                            |          |                    |                      |         |
| . . .                      | . . .    | . . .              | . . .                | . . .   |
|                            |          |                    |                      |         |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.00 sec)

Các group_replication hàng xác nhận rằng plugin đã được tải và hiện đang hoạt động.

Bắt đầu nhân rộng nhóm

Bây giờ mỗi máy chủ MySQL có một người dùng nhân bản được cấu hình và kích hoạt nhóm nhân rộng, chúng ta có thể bắt đầu đưa nhóm của chúng ta lên.

Bootstrap First Node

Để bắt đầu nhóm, hãy hoàn thành các bước sau trên một thành viên của nhóm.

Thành viên nhóm dựa vào các thành viên hiện có để gửi dữ liệu sao chép, danh sách thành viên cập nhật và các thông tin khác khi bước đầu tham gia nhóm. Bởi vì điều này, chúng ta cần phải sử dụng một thủ tục hơi khác để khởi động thành viên nhóm ban đầu để nó biết không mong đợi thông tin này từ các thành viên khác trong danh sách hạt giống của nó.

Nếu được đặt, group_replication_bootstrap_group biến nói với một thành viên rằng nó không nên mong đợi để nhận được thông tin từ các đồng nghiệp và thay vào đó nên thiết lập một nhóm mới và tự chọn mình là thành viên chính. Vì tình huống duy nhất mà điều này là thích hợp là khi không có thành viên nhóm hiện có, chúng tôi sẽ tắt chức năng này ngay lập tức sau khi khởi động nhóm:

SET GLOBAL group_replication_bootstrap_group=ON;

START GROUP_REPLICATION;

SET GLOBAL group_replication_bootstrap_group=OFF;

Nhóm nên được bắt đầu với máy chủ này là thành viên duy nhất. Chúng tôi có thể xác minh điều này bằng cách kiểm tra các mục trong replication_group_members bảng trong performance_schema cơ sở dữ liệu:

SELECT * FROM performance_schema.replication_group_members;

Bạn sẽ thấy một hàng đại diện cho máy chủ lưu trữ hiện tại:

Output+---------------------------+--------------------------------------+--------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
1 row in set (0.00 sec)

Các ONLINE giá trị cho MEMBER_STATE cho biết rằng nút này hoạt động đầy đủ trong nhóm.

Tiếp theo, tạo một cơ sở dữ liệu thử nghiệm và bảng để kiểm tra bản sao của chúng tôi:

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");

Kiểm tra nội dung để đảm bảo nội dung được nhập chính xác:

SELECT * FROM playground.equipment;

Output+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+
1 row in set (0.00 sec)

Bây giờ chúng tôi đã xác minh rằng máy chủ này là thành viên của nhóm và có khả năng ghi. Bây giờ các máy chủ khác có thể tham gia nhóm.

Khởi động các nút còn lại

Tiếp theo, trên Máy chủ thứ hai, bắt đầu sao chép nhóm. Vì chúng ta đã có một thành viên tích cực, chúng ta không cần phải khởi động nhóm và chỉ có thể tham gia nó:

START GROUP_REPLICATION;

Trên máy chủ thứ ba, bắt đầu sao chép nhóm theo cùng một cách:

START GROUP_REPLICATION;

Kiểm tra lại danh sách thành viên. Bạn sẽ thấy ba máy chủ bây giờ:

SELECT * FROM performance_schema.replication_group_members;

Output+---------------------------+--------------------------------------+--------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       |
| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
3 rows in set (0.01 sec)

Tất cả các thành viên nên có một MEMBER_STATE giá trị của ONLINE. Đối với nhóm mới, nếu có bất kỳ nút nào được liệt kê dưới dạng RECOVERING trong hơn một hoặc hai giây, thường là dấu hiệu cho thấy đã xảy ra lỗi hoặc đã bị định cấu hình sai. Kiểm tra nhật ký tại /var/log/mysql/error.log để có thêm thông tin về những gì đã xảy ra.

Kiểm tra xem liệu thông tin cơ sở dữ liệu thử nghiệm đã được nhân rộng trên các thành viên mới chưa:

SELECT * FROM playground.equipment;

Output+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+
1 row in set (0.01 sec)

Nếu dữ liệu có sẵn trên các thành viên mới, điều đó có nghĩa là sao chép nhóm đang hoạt động chính xác.

Kiểm tra khả năng viết của các thành viên nhóm mới

Tiếp theo, chúng ta có thể cố gắng viết vào cơ sở dữ liệu từ các thành viên mới của chúng tôi. Cho dù thành công hay không là một chức năng của việc bạn đã chọn để cấu hình một nhóm chính hoặc đa chính.

Thử nghiệm ghi trong một môi trường chính

Trong một nhóm chính, bạn nên mong đợi bất kỳ hoạt động ghi nào từ máy chủ không chính sẽ bị từ chối vì lý do nhất quán. Bạn có thể khám phá tiểu học hiện tại bất kỳ lúc nào bằng truy vấn sau:

SHOW STATUS LIKE '%primary%';

Output+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | 13324ab7-1b01-11e7-9dd1-22b78adaa992 |
+----------------------------------+--------------------------------------+
1 row in set (0.01 sec)

Giá trị của truy vấn sẽ là MEMBER_ID bạn có thể so khớp với máy chủ lưu trữ bằng cách truy vấn danh sách thành viên nhóm như chúng tôi đã làm trước đây:

SELECT * FROM performance_schema.replication_group_members;

Output+---------------------------+--------------------------------------+--------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       |
| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
3 rows in set (0.01 sec)

Trong ví dụ này, chúng ta có thể thấy rằng máy chủ tại 203.0.113.1 hiện là máy chủ chính. Nếu chúng ta cố gắng ghi vào cơ sở dữ liệu từ một thành viên khác, chúng ta nên mong đợi hoạt động thất bại:

INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");

OutputERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

Điều này được mong đợi vì nhóm hiện được định cấu hình với một chính có khả năng ghi duy nhất. Nếu máy chủ chính gặp sự cố và rời khỏi nhóm, nhóm sẽ tự động chọn thành viên mới làm người đăng ký chính và chấp nhận.

Thử nghiệm ghi trong môi trường đa chính

Đối với các nhóm đã được định cấu hình theo định hướng đa chính, bất kỳ thành viên nào cũng có thể ghi vào cơ sở dữ liệu.

Bạn có thể kiểm tra kỹ xem nhóm của bạn có đang hoạt động ở chế độ đa chính không bằng cách kiểm tra giá trị của group_replication_primary_member biến một lần nữa:

SHOW STATUS LIKE '%primary%';

Output+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| group_replication_primary_member |       |
+----------------------------------+-------+
1 row in set (0.02 sec)

Nếu biến trống, điều này có nghĩa là không có máy chủ chính được chỉ định và rằng bất kỳ thành viên nào cũng có thể chấp nhận ghi.

Kiểm tra điều này trên Máy chủ thứ hai bằng cách gõ:

INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");

OutputQuery OK, 1 row affected (0.00 sec)

Máy chủ thứ hai cam kết thao tác ghi mà không có bất kỳ lỗi nào.

Trên máy chủ thứ ba, truy vấn để xem mục mới đã được thêm vào:

SELECT * FROM playground.equipment;

Output+----+-------+-------+--------+
| id | type  | quant | color  |
+----+-------+-------+--------+
|  1 | slide |     2 | blue   |
|  2 | swing |    10 | yellow |
+----+-------+-------+--------+
2 rows in set (0.00 sec)

Điều này xác nhận rằng ghi của máy chủ thứ hai đã được nhân rộng thành công.

Bây giờ, kiểm tra khả năng ghi trên máy chủ thứ ba bằng cách gõ:

INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");

OutputQuery OK, 1 row affected (0.02 sec)

Quay lại máy chủ đầu tiên, kiểm tra để đảm bảo rằng các hoạt động ghi từ cả hai thành viên mới được sao chép lại:

SELECT * FROM playground.equipment;

Output+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  1 | slide  |     2 | blue   |
|  2 | swing  |    10 | yellow |
|  3 | seesaw |     3 | green  |
+----+--------+-------+--------+
3 rows in set (0.01 sec)

Điều này xác nhận rằng nhân rộng đang làm việc theo từng hướng và mỗi thành viên có khả năng thực hiện các hoạt động ghi.

Đưa nhóm trở lại

Khi nhóm được khởi động, các thành viên riêng lẻ có thể tham gia và rời khỏi mà không ảnh hưởng đến tính khả dụng, miễn là có đủ thành viên để chọn các máy chủ chính. Tuy nhiên, nếu một số thay đổi cấu hình được thực hiện (như chuyển đổi giữa môi trường đơn và đa chính), hoặc tất cả các thành viên của nhóm rời khỏi, bạn có thể cần phải khởi động lại nhóm. Bạn làm điều này theo cách tương tự như ban đầu bạn đã làm.

Về bạn máy chủ đầu tiên, đặt group_replciation_bootstrap_group biến và sau đó bắt đầu khởi tạo nhóm:

SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=ON;

START GROUP_REPLICATION;

SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=OFF;

Khi thành viên đầu tiên đã bắt đầu nhóm, các thành viên khác có thể tham gia:

START GROUP_REPLICATION;

Làm theo quy trình này cho các thành viên khác:

START GROUP_REPLICATION;

Bây giờ, nhóm sẽ trực tuyến với tất cả thành viên có sẵn:

SELECT * FROM performance_schema.replication_group_members;

Output+---------------------------+--------------------------------------+--------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       |
| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
3 rows in set (0.01 sec)

Quá trình này có thể được sử dụng để bắt đầu lại nhóm bất cứ khi nào cần thiết.

Tham gia nhóm tự động khi khởi động MySQL

Với các thiết lập hiện tại, nếu một máy chủ thành viên khởi động lại, nó sẽ không tự động gia nhập lại nhóm khi khởi động. Nếu bạn muốn các thành viên tự động tham gia lại nhóm, bạn có thể sửa đổi tệp cấu hình một chút.

Các thiết lập chúng tôi sẽ phác thảo là hữu ích khi bạn muốn các thành viên tự động tham gia khi họ khởi động. Tuy nhiên, có một số điều bạn nên biết:

Đầu tiên, cài đặt này chỉ ảnh hưởng khi bản thân MySQL bắt đầu. Nếu thành viên bị xóa khỏi nhóm vì các vấn đề thời gian chờ, nhưng cá thể MySQL vẫn trực tuyến, thành viên sẽ không tự động tham gia lại.

Thứ hai, có cài đặt này được bật khi lần đầu tiên khởi động một nhóm có thể có hại. Khi không có một nhóm hiện có để tham gia, quá trình MySQL sẽ mất một thời gian dài để bắt đầu vì nó sẽ cố gắng liên lạc với các thành viên khác, không tồn tại để khởi tạo. Chỉ sau một thời gian chờ lâu dài nó sẽ từ bỏ và bắt đầu bình thường. Sau đó, bạn sẽ phải sử dụng thủ tục được nêu ở trên để khởi động nhóm.

Với những lưu ý ở trên, nếu bạn muốn cấu hình các nút để tự động tham gia nhóm khi MySQL khởi động, hãy mở tệp cấu hình MySQL chính:

sudo nano /etc/mysql/my.cnf

Bên trong, tìm loose-group_replication_start_on_boot biến và đặt thành "BẬT":

/etc/mysql/my.cnf

[mysqld]
. . .
loose-group_replication_start_on_boot = ON
. . .

Lưu và đóng tệp khi bạn hoàn tất. Thành viên sẽ tự động cố gắng tham gia nhóm vào lần sau khi cá thể MySQL của nó được bắt đầu.

Phần kết luận

Trong hướng dẫn này, chúng tôi đã giới thiệu cách cấu hình sao chép nhóm MySQL giữa ba máy chủ Ubuntu 16.04. Đối với các thiết lập chính duy nhất, các thành viên sẽ tự động chọn một chính có khả năng ghi khi cần thiết. Đối với các nhóm đa chính, mọi thành viên đều có thể thực hiện việc ghi và cập nhật.

Việc sao chép nhóm cung cấp một cấu trúc liên kết nhân bản linh hoạt cho phép các thành viên tham gia hoặc rời đi theo ý muốn trong khi đồng thời cung cấp các đảm bảo về tính nhất quán của dữ liệu và thứ tự tin nhắn. Việc sao chép nhóm MySQL có thể phức tạp hơn một chút để cấu hình, nhưng nó cung cấp các khả năng không thể trong việc sao chép truyền thống.