Mục lục

Không có mục lục

Cách thiết lập cấu hình sao chép nhóm MySQL trên Ubuntu 20.04

Ngày đăng: 9 tháng 11 năm 2022

Ubuntu

Giới thiệu

Bản sao MySQL phản chiếu 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 thiết lập cấu hình, để chấp nhận các hoạt động ghi cơ sở dữ liệu với các máy chủ phụ sao chép, và áp dụng các hành động từ nhật ký của máy chủ chính vào tập dữ liệu của riêng chúng. Các máy chủ phụ này có thể được sử dụng để đọc, nhưng thường không thể thực hiện ghi dữ liệu.

Nhân rộng nhóm là một cách thực hiện cơ chế sao chép linh hoạt hơn, có khả năng chịu lỗi. Quá trình này liên quan đến việc thiết lập một nhóm các máy chủ, mỗi máy chủ đều tham gia vào 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ố, các cuộc bầu cử thành viên có thể chọn một bầu cử sơ bộ mới từ nhóm. Điều này cho phép các node còn lại tiếp tục hoạt động, ngay cả khi gặp sự cố. Thương lượng thành viên, phát hiện lỗi và gửi thông báo được cung cấp thông qua việc triển khai thuật toán đồng thuận Paxos (Paxos consensus algorithm).

Trong hướng dẫn này, bạn sẽ thiết lập nhân rộng nhóm MySQL bằng bộ ba máy chủ Ubuntu 20.04. Lưu ý rằng ba là số lượng phiên bản MySQL tối thiểu bạn cần để triển khai nhân rộng nhóm trong MySQL, trong khi chín là số lượng tối đa. Khi bạn làm việc thông qua hướng dẫn này, bạn sẽ có tùy chọn để thiết lập nhóm dưới dạng nhóm sao chép một chính hoặc nhiều chính.

Lưu ý: Máy chủ cơ sở dữ liệu có thể có một trong hai vai trò trong thiết lập sao chép: chúng có thể là một cá thể chính (còn được gọi là một cá thể nguồn), mà người dùng có thể ghi dữ liệu vào; hoặc một bản sao (hoặc bản sao thứ cấp), nơi lưu trữ một bản sao của tất cả dữ liệu trên nguồn. Về mặt lịch sử, những vai trò này thay vào đó được gọi là cá thể chính và cá thể nô lệ. Trong một bài đăng trên blog được xuất bản vào tháng 7 năm 2020, nhóm MySQL đã thừa nhận nguồn gốc tiêu cực của thuật ngữ này và thông báo những nỗ lực của họ để cập nhật chương trình cơ sở dữ liệu và tài liệu của nó để sử dụng ngôn ngữ toàn diện hơn.

Tuy nhiên, đây là một quá trình liên tục. Mặc dù tài liệu của MySQL và phần lớn các lệnh trong phiên bản 8 của chương trình đã được cập nhật, để đề cập đến các máy chủ trong cấu trúc liên kết sao chép như là chính và phụ của nó (hoặc nguồn và các bản sao của nó), nhưng vẫn có những chỗ mà thuật ngữ phủ định vẫn còn xuất hiện. Hướng dẫn này sẽ mặc định sử dụng thuật ngữ bao hàm hơn nếu có thể, nhưng có một số trường hợp không tránh khỏi việc xuất hiện các thuật ngữ cũ hơn.

Điều kiện

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Ba máy chủ chạy Ubuntu 20.04. Mỗi máy chủ phải có một người dùng quản trị non-root user có đặc quyền sudo và một tường lửa được thiết lập cấu hình với UFW. Làm theo hướng dẫn thiết lập máy chủ ban đầu cho Ubuntu 20.04 của chúng tôi để cài đặt từng máy chủ.
  • MySQL được cài đặt trên mỗi máy chủ. Hướng dẫn này giả định rằng bạn đang sử dụng phiên bản MySQL mới nhất có sẵn từ kho lưu trữ Ubuntu mặc định, tính đến thời điểm viết bài này, là phiên bản 8.0.28. Để cài đặt phần mềm này trên tất cả các máy chủ của bạn, hãy làm theo hướng dẫn của chúng tôi về Cách cài đặt MySQL trên Ubuntu 20.04 cho từng máy.

Để giúp mọi thứ rõ ràng, hướng dẫn này sẽ đề cập đến ba máy chủ là member1, member2member3. Trong các ví dụ xuyên suốt hướng dẫn này, các thành viên này sẽ có các địa chỉ IP sau:

Thành viên Địa chỉ IP
member1 203.0.113.1
member2 203.0.113.2
member3 203.0.113.3

Bất kỳ lệnh nào phải chạy trên member1 sẽ có nền màu xanh lam, như sau:

member1$

Tương tự như vậy, bất kỳ lệnh nào phải chạy trên member2 sẽ có nền màu đỏ:

member2$

Và bất kỳ lệnh nào phải chạy trên member3 sẽ có nền màu xanh lá cây:

member3$

Cuối cùng, bất kỳ lệnh nào phải chạy trên từng trong ba máy chủ sẽ có nền tiêu chuẩn:

Bước 1: Tạo UUID để xác định nhóm MySQL

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

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

  1. uuidgen
Output
168dcb64-7cce-473a-b338-6501f305e561

Sao chép giá trị bạn nhận được, vì bạn sẽ phải tham chiếu giá trị này trong giây lát khi thiết lập cấu hình tên nhóm cho nhóm máy chủ của mình.

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

Bây giờ bạn đã sẵn sàng sửa đổi tệp 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 bằng trình soạn thảo văn bản ưa thích của bạn. Ở đây, chúng tôi sẽ sử dụng nano:

  1. sudo nano /etc/mysql/my.cnf

Trên Ubuntu, MySQL được cài đặt với một số tệp khác nhau mà bạn có thể sử dụng để xác định các thay đổi cấu hình khác nhau. Theo mặc định, tệp my.cnf chỉ được sử dụng để tạo nguồn cho các tệp bổ sung từ các thư mục con. Bạn sẽ phải thêm cấu hình của riêng mình bên dưới dòng !includedir. Điều này sẽ cho phép bạn ghi đè bất kỳ cài đặt nào từ các tệp được bao gồm.

Hãy bắt đầu một phần mới bằng cách bao gồm tiêu đề [mysqld] và sau đó thêm các cài đặt bạn cần để kích hoạt tính năng sao chép nhóm, như được đánh dấu trong ví dụ dưới đây. Lưu ý rằng các cài đặt này được sửa đổi từ các cài đặt tối thiểu cần thiết để nhân rộng nhóm được nêu trong tài liệu MySQL chính thức. Tiền tố loose- cho phép MySQL xử lý các tùy chọn mà nó không nhận ra một cách duyên dáng và không bị lỗi. Bạn sẽ cần điền và tùy chỉnh một số cài đặt sau:

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

[mysqld]

# General replication settings
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
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 = ""

Để giải thích rõ ràng hơn tất cả các tùy chọn cấu hình này, chúng đã được chia thành các phần phụ dưới đây. Vui lòng đọc kỹ chúng, vì một số phần cung cấp cho bạn các lựa chọn về cách bạn muốn triển khai nhóm sao chép của mình, hoặc yêu cầu bạn nhập chi tiết cụ thể cho cấu hình của riêng bạn.

Cài đặt sao chép nhóm Boilerplate

Phần đầu tiên chứa các cài đặt chung cần thiết để nhân rộng nhóm mà không cần sửa đổi:

/etc/mysql/my.cnf
. . .
# General replication settings
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
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
. . .

Một yêu cầu cụ thể đối với sao chép nhóm trong MySQL là dữ liệu phải được lưu trữ trong công cụ lưu trữ InnoDB. Tài liệu MySQL khuyến nghị vô hiệu hóa rõ ràng việc sử dụng các công cụ lưu trữ khác có thể gây ra lỗi theo cách giống như dòng đầu tiên không có chú thích trong phần này.

Các cài đặt còn lại bật ID giao dịch toàn cầu, thiết lập cấu hình ghi nhật ký nhị phân cần thiết để nhân rộng nhóm và thiết lập cấu hình SSL cho nhóm. Cấu hình này cũng cài đặt một số mục khác hỗ trợ khôi phục và khởi động. Bạn không cần phải sửa đổi bất kỳ điều gì trong phần này và nó phải giống hệt nhau trên cả ba máy chủ của bạn, vì vậy bạn có thể tiếp tục sau khi thêm nó vào.

Cài đặt sao chép nhóm được chia sẻ

Phần thứ hai thiết lập cài đặt chia sẻ cho nhóm. Bạn 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 node của bạn. Cụ thể, bạn phải thêm UUID của nhóm (mà bạn đã tạo ở bước trước), danh sách các thành viên nhóm được ủy quyền và các thành viên hạt giống cần liên hệ để lấy dữ liệu ban đầu khi tham gia nhóm.

Đặt loose-group_replication_group_name thành giá trị UUID mà bạn đã tạo trước đó bằng lệnh uuidgen. Đảm bảo rằng bạn đặt UUID giữa cặp dấu ngoặc kép trống.

Tiếp theo, đặt loose-group_replication_ip_whitelist thành 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ài đặt loose-group_replication_group_seeds phải gần giống với whitelist, nhưng phải thêm một cổng sao chép nhóm được chỉ định vào cuối mỗi thành viên. Theo mục đích của hướng dẫn này, hãy sử dụng cổng sao chép nhóm được khuyến nghị là 33061:

/etc/mysql/my.cnf
. . .
# Shared replication group configuration
loose-group_replication_group_name = "168dcb64-7cce-473a-b338-6501f305e561"
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ó cẩn thận trên mỗi máy chủ.

Chọn một chính hoặc nhiều chính

Tiếp theo, bạn cần quyết định thiết lập cấu hình một nhóm đơn chính hay nhóm đa chính. Trong cấu hình đơn chính, MySQL chỉ định một máy chủ chính duy nhất (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 bất kỳ thành viên nào trong nhóm thực hiện ghi.

Nếu bạn muốn thiết lập cấu hình một nhóm đa chính, hãy bỏ ghi chú các chỉ thị loose-group_replication_single_primary_modeloose-group_replication_enforce_update_everywhere_checks. Điều này sẽ thiết lập một nhóm đa chính. Đối với nhóm đơn 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 cài đặt 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 sau khi làm như vậy, bạn phải khởi động lại từng thành viên trong nhóm MySQL của mình. Để thay đổi sang cấu hình mới, bạn sẽ phải dừng từng cá thể MySQL trong nhóm, khởi động từng thành viên với cài đặt mới, sau đó khởi động lại quá trình nhân rộng 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 khoảng thời gian ngắn ngừng hoạt động.

Cài đặt cấu hình dành riêng cho máy chủ lưu trữ

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
  • Địa chỉ để báo cáo cho các thành viên khác
  • Địa chỉ bản sao cục bộ và cổng nghe

Chỉ thị server_id phải được đặt thành một số duy nhất. Đối với thành viên đầu tiên, hãy đặt giá trị này thành 1 và tăng số lượng trên mỗi máy chủ bổ sung. Đặt bind-addressreport_host thành địa chỉ IP của máy chủ tương ứng để phiên bản MySQL sẽ 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. loose-group_replication_local_address cũng phải đượ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.

Ví dụ: đây là phần cấu hình cho member1 sử dụng địa chỉ IP mẫu của nó:

/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. Đây là cấu hình cho member2:

/etc/mysql/my.cnf
. . .
# Host specific replication configuration
server_id = 2
bind-address = "203.0.113.2"
report_host = "203.0.113.2"
loose-group_replication_local_address = "203.0.113.2:33061"

Và đây là cấu hình cho member3:

/etc/mysql/my.cnf
. . .
# Host specific replication configuration
server_id = 3
bind-address = "203.0.113.3"
report_host = "203.0.113.3"
loose-group_replication_local_address = "203.0.113.3:33061"

Đảm bảo cập nhật từng địa chỉ IP được đánh dấu cho địa chỉ IP của máy chủ mà bạn đang chỉnh sửa cấu hình.

Khi bạn hoàn tất, hãy kiểm tra kỹ xem cài đặt sao chép được chia sẻ có giống nhau trên mỗi máy chủ lưu trữ hay không, và các cài đặt dành riêng cho máy chủ lưu trữ có được tùy chỉnh cho từng máy chủ lưu trữ hay không. Lưu và đóng tệp trên từng máy chủ khi bạn hoàn tất. Nếu bạn đã sử dụng nano để chỉnh sửa tệp, bạn có thể làm như vậy bằng cách nhấn CTRL + X, Y, sau đó ENTER.

Mỗi tệp cấu hình MySQL trên máy chủ của bạn hiện chứa các lệnh cần thiết để khởi động sao chép nhóm MySQL. Để áp dụng cài đặt mới cho phiên bản MySQL, hãy khởi động lại dịch vụ trên từng máy chủ của bạn bằng lệnh sau:

  1. sudo systemctl restart mysql

Cùng với đó, bạn có thể chuyển sang bật truy cập từ xa bằng cách cập nhật từng quy tắc tường lửa của máy chủ.

Bước 3: Cập nhật Quy tắc UFW của từng Máy chủ

Giả sử bạn đã làm theo điều kiện hướng dẫn thiết lập máy chủ ban đầu, bạn sẽ thiết lập tường lửa trên từng máy chủ mà bạn đã cài đặt MySQL và bật quyền truy cập cho cấu hình OpenSSH UFW. Đây là một biện pháp bảo mật quan trọng, vì các tường lửa này hiện đang chặn các kết nối đến bất kỳ cổng nào trên máy chủ của bạn, hãy lưu các kết nối ssh có các khóa phù hợp trong tệp ủy quyền tương ứng của mỗi máy chủ.

Trong tệp cấu hình MySQL, bạn đã thiết lập 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. Bạn 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 sao chép.

Trên mỗi máy chủ thành viên của bạn, bạn cần mở quyền truy cập vào cả hai cổng này cho các thành viên khác trong nhóm để tất cả họ có thể giao tiếp với nhau. Để mở quyền truy cập vào các cổng này trên member1 cho member2, hãy chạy các lệnh ufw dưới đây trên member1:

  1. sudo ufw allow from member2_server_ip to any port 3306
  2. sudo ufw allow from member2_server_ip to any port 33061

Đảm bảo thay đổi member2_server_ip để phản ánh địa chỉ IP thực của máy chủ member2 của bạn. Sau đó, để mở các cổng tương tự cho member3, hãy chạy các lệnh sau:

  1. sudo ufw allow from member3_server_ip to any port 3306
  2. sudo ufw allow from member3_server_ip to any port 33061

Tiếp theo, cập nhật các quy tắc tường lửa cho hai máy chủ khác của bạn. Chạy các lệnh dưới đây trên member2, đảm bảo thay đổi địa chỉ IP để phản ánh địa chỉ IP của member1member3 tương ứng:

  1. sudo ufw allow from member1_server_ip to any port 3306
  2. sudo ufw allow from member1_server_ip to any port 33061
  3. sudo ufw allow from member3_server_ip to any port 3306
  4. sudo ufw allow from member3_server_ip to any port 33061

Cuối cùng, chạy hai lệnh này trên member3. Một lần nữa, hãy đảm bảo rằng bạn nhập địa chỉ IP chính xác cho từng máy chủ:

  1. sudo ufw allow from member1_server_ip to any port 3306
  2. sudo ufw allow from member1_server_ip to any port 33061
  3. sudo ufw allow from member2_server_ip to any port 3306
  4. sudo ufw allow from member2_server_ip to any port 33061

Sau khi thêm các quy tắc UFW này, mỗi trong số ba phiên bản MySQL của bạn sẽ được phép truy cập vào các cổng được sử dụng bởi MySQL trên hai máy chủ còn lại.

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

Bước 4: Thiết lập cấu hình người dùng sao chép (replication user) và bật plugin sao chép nhóm

Để thiết lập kết nối với các máy chủ khác trong nhóm sao chép, mỗi cá thể MySQL phải có một replication user chuyên dụng.

Trên mỗi máy chủ MySQL của bạn, đăng nhập vào phiên bản 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:

  1. sudo mysql

Lưu ý: Đảm bảo chạy từng lệnh trong phần này trên mỗi phiên bản MySQL của bạn.

Vì mỗi máy chủ sẽ có replication user riêng, bạn cần tắt ghi nhật ký nhị phân trong quá trình tạo. Nếu không, khi quá trình nhân bản bắt đầu, nhóm sẽ cố gắng truyền replication user từ máy chủ chính sang các máy chủ khác, tạo ra xung đột với replication user đã có. Chạy lệnh dưới đây từ lời nhắc MySQL trên mỗi máy chủ của bạn:

  1. SET SQL_LOG_BIN=0;

Bây giờ bạn có thể chạy câu lệnh CREATE USER để tạo replication user của bạn. Chạy lệnh dưới đây, lệnh này tạo một người dùng có tên là repl. Lệnh này chỉ định rằng replication user phải kết nối bằng SSL. Ngoài ra, hãy đảm bảo sử dụng password an toàn thay cho mật khẩu khi tạo replication user này:

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

Tiếp theo, cấp đặc quyền sao chép người dùng mới trên máy chủ:

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

Sau đó, cấp các đặc quyền để thực hiện các thay đổi:

  1. FLUSH PRIVILEGES;

Sau đó, bật lại ghi nhật ký nhị phân để tiếp tục hoạt động bình thường:

  1. SET SQL_LOG_BIN=1;

Tiếp theo, đặt kênh group_replication_recovery để sử dụngreplication user mới của bạn và mật khẩu được liên kết của họ. Sau đó, mỗi máy chủ sẽ sử dụng các thông tin đăng nhập này để xác thực cho nhóm:

  1. CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

Lưu ý: Nếu bạn đang sử dụng phiên bản MySQL cũ hơn 8.0.23, bạn sẽ cần sử dụng cú pháp kế thừa của MySQL để thiết lập:

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

Với replication user tại chỗ, bạn có thể bật plugin group_replication để chuẩn bị khởi tạo nhóm:

  1. INSTALL PLUGIN group_replication SONAME 'group_replication.so';

Xác minh rằng plugin đang hoạt động bằng cách chạy lệnh sau:

  1. SHOW PLUGINS;

Plugin group_replication sẽ xuất hiện ở cuối danh sách vì nó là plugin được thêm gần đây nhất:

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

Kết quả này xác nhận rằng plugin đã được tải và hiện đang hoạt động. Trước khi tiếp tục bước tiếp theo, hãy đảm bảo rằng bạn đã chạy từng lệnh trong phần này trên mỗi phiên bản MySQL của mình.

Bước 5: Bắt đầu sao chép nhóm

Bây giờ mỗi máy chủ MySQL có một replication user được thiết lập cấu hình và plugin sao chép nhóm được kích hoạt, bạn có thể bắt đầu khởi động nhóm của mình.

Khởi động nút đầu tiên

Để bắt đầu nhóm, hãy hoàn thành các bước sau đối với một thành viên của nhóm. Đối với mục đích trình diễn, hướng dẫn này sẽ hoàn thành các bước này trên member1.

Các thành viên trong nhóm dựa vào các thành viên hiện có để gửi dữ liệu nhân rộng, danh sách thành viên cập nhật và các thông tin khác khi tham gia nhóm lần đầu. Do đó, bạn cần sử dụng một quy trình hơi khác để khởi động thành viên nhóm ban đầu để thành viên đó 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 mình.

Nếu được đặt, biến group_replication_bootstrap_group cho thành viên biết rằng họ không nên mong đợi nhận thông tin từ các đồng nghiệp và thay vào đó nên thành lập một nhóm mới và tự bầu mình làm thành viên chính. Bạn có thể bật biến này bằng lệnh sau:

  1. SET GLOBAL group_replication_bootstrap_group=ON;

Sau đó, bạn có thể bắt đầu nhân rộng cho thành viên nhóm ban đầu:

  1. START GROUP_REPLICATION;

Sau đó, bạn có thể đặt biến group_replication_bootstrap_group trở lại OFF, vì trường hợp duy nhất phù hợp là khi không có thành viên nhóm hiện có:

  1. SET GLOBAL group_replication_bootstrap_group=OFF;

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

  1. SELECT * FROM performance_schema.replication_group_members;

Truy vấn này sẽ trả về một hàng duy nhất đại diện cho máy chủ hiện tại:

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

Giá trị ONLINE cho MEMBER_STATE cho biết rằng node này đang hoạt động hoàn toàn trong nhóm.

Tiếp theo, tạo một cơ sở dữ liệu thử nghiệm và bảng với một số dữ liệu mẫu. Sau khi thêm thành viên vào nhóm này, dữ liệu này sẽ được sao chép tự động cho họ.

Bắt đầu bằng cách tạo một cơ sở dữ liệu mẫu có tên là playground:

  1. CREATE DATABASE playground;

Tiếp theo, tạo một bảng ví dụ có tên là equipment trong cơ sở dữ liệu playground bằng lệnh sau:

  1. CREATE TABLE playground.equipment (
  2. id INT NOT NULL AUTO_INCREMENT,
  3. type VARCHAR(50),
  4. quant INT,
  5. color VARCHAR(25),
  6. PRIMARY KEY(id)
  7. );

Bảng này chứa bốn cột sau:

  • id: Cột này sẽ chứa các giá trị số nguyên tự động tăng lên, có nghĩa là bạn sẽ không phải chỉ định giá trị cho cột này khi tải bảng có dữ liệu mẫu.
  • type: Cột này sẽ chứa các giá trị chuỗi mô tả loại thiết bị playground mà hàng đại diện.
  • quant: Cột này sẽ chứa các giá trị nguyên để đại diện cho số lượng của loại thiết bị playground nhất định.
  • color: Cột này sẽ chứa các giá trị chuỗi chỉ định màu của thiết bị đã cho.

Ngoài ra, hãy lưu ý rằng cột id được chỉ định làm khóa chính của bảng này. Trong MySQL, mọi bảng được sao chép thành một nhóm phải có một cột được chỉ định làm khóa chính của bảng.

Cuối cùng, hãy chạy lệnh sau để chèn một hàng dữ liệu vào bảng:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");

Truy vấn bảng để đảm bảo dữ liệu đã được nhập chính xác:

  1. SELECT * FROM playground.equipment;
Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+ 1 row in set (0.00 sec)

Sau khi xác minh rằng máy chủ này là thành viên của nhóm và nó có khả năng ghi, các máy chủ khác có thể tham gia nhóm.

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

Tiếp theo, bắt đầu sao chép nhóm trên member2. Vì bạn đã có một thành viên đang hoạt động, bạn không cần phải khởi động nhóm và thành viên này có thể tham gia ngay lập tức:

  1. START GROUP_REPLICATION;

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

  1. START GROUP_REPLICATION;

Kiểm tra lại danh sách thành viên trên bất kỳ máy chủ nào trong ba máy chủ. Lần này, sẽ có ba máy chủ được liệt kê trong đầu ra:

  1. SELECT * FROM performance_schema.replication_group_members;
Output
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom | | group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom | | group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ 3 rows in set (0.00 sec)

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

Tiếp theo, hãy kiểm tra xem thông tin cơ sở dữ liệu thử nghiệm đã được sao chép trên các thành viên mới hay chưa:

  1. 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à bản sao nhóm đang hoạt động chính xác.

Bước 6: Kiểm tra khả năng ghi của các thành viên nhóm mới

Tiếp theo, bạn có thể thử ghi vào cơ sở dữ liệu từ các thành viên nhóm sao chép mới của bạn. Việc này có thành công hay không là do bạn chọn thiết lập cấu hình nhóm đơn chính hay nhóm đa chính.

Kiểm tra ghi trong một môi trường chính duy nhất

Trong một nhóm chính duy nhất, bạn nên mong đợi bất kỳ hoạt động ghi nào từ một máy chủ non-primary sẽ bị từ chối vì lý do nhất quán. Bạn có thể tìm thấy tệp chính hiện tại bất kỳ lúc nào bằng cách chạy truy vấn dưới đây trên bất kỳ thành viên nào trong nhóm sao chép của bạn:

  1. 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 mà bạn có thể đối sánh 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ư bạn đã làm trước đây:

  1. 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)

Như đầu ra ví dụ này chỉ ra, máy chủ tại 203.0.113.1 - member1 - hiện là máy chủ chính. Nếu bạn cố gắng ghi vào cơ sở dữ liệu từ một thành viên khác, hoạt động sẽ không thành công:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
Output
ERROR 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 thiết lập cấu hình với một nhóm chính có khả năng ghi. Nếu máy chủ chính có vấn đề và rời khỏi nhóm, nhóm sẽ tự động bầu một thành viên mới làm thành viên chính và chấp nhận ghi.

Kiểm tra ghi trong môi trường đa chính

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

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

  1. 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à 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 member2 bằng cách cố gắng ghi một số dữ liệu vào bảng equipment:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
Output
Query OK, 1 row affected (0.00 sec)

member2 cam kết hoạt động ghi không có bất kỳ lỗi nào.

Trên member3, hãy chạy truy vấn sau để kiểm tra xem mục mới đã được thêm vào hay chưa:

  1. 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 bài viết của member2 đã được sao chép thành công.

Bây giờ, hãy kiểm tra khả năng ghi trên member3 bằng cách chạy câu lệnh INSERT sau:

  1. INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");
Output
Query OK, 1 row affected (0.02 sec)

Quay lại member1, 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 trở lại:

  1. 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 sao chép đang hoạt động theo từng hướng và mỗi thành viên đều có khả năng thực hiện các thao tác ghi.

Bước 7: Đưa nhóm trở lại

Sau khi nhóm được khởi động, các thành viên riêng lẻ có thể tham gia và rời đi mà không ảnh hưởng đến tính khả dụng, miễn là có đủ thành viên để chọn máy chủ chính. Tuy nhiên, nếu các thay đổi cấu hình nhất định được thực hiện (như chuyển đổi giữa các 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 đi, bạn cần phải khởi động lại nhóm giống như cách bạn đã làm lúc đầu.

Trên member1, đặt biến group_replication_bootstrap_group thành ON:

  1. SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=ON;

Sau đó khởi tạo nhóm:

  1. START GROUP_REPLICATION;

Sau đó, bạn có thể đặt biến group_replication_bootstrap_group trở lại OFF:

  1. 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:

  1. START GROUP_REPLICATION;

Thực hiện theo quy trình này cho bất kỳ thành viên bổ sung nào:

  1. START GROUP_REPLICATION;

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

  1. 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.

Bước 8: Tự động tham gia nhóm khi MySQL bắt đầu

Với cài đặt hiện tại, nếu máy chủ thành viên khởi động lại, nó sẽ không tự động tham gia lại nhóm. 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ài đặt được nêu trong bước này rất 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 cần lưu ý. Đầu tiên, cài đặt này chỉ ảnh hưởng khi bản thân phiên bản MySQL được khởi động. Nếu thành viên bị xóa khỏi nhóm vì vấn đề hết thời gian chờ, nhưng phiên bản MySQL vẫn trực tuyến, thành viên sẽ không tự động tham gia lại.

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

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

  1. sudo nano /etc/mysql/my.cnf

Bên trong, tìm biến loose-group_replication_start_on_bootvà đặt nó thành ON:

/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 tiếp theo phiên bản MySQL của nó được khởi động.

Kết luận

Bằng cách hoàn thành hướng dẫn này, bạn đã học cách thiết lập cấu hình sao chép nhóm MySQL giữa ba máy chủ Ubuntu 20.04. Đối với thiết lập đơn chính, các thành viên sẽ tự động chọn thiết lập chính có khả năng ghi khi cần thiết. Đối với nhóm đa chính, bất kỳ thành viên nào cũng có thể thực hiện ghi và cập nhật.

Nhân rộng nhóm cung cấp một cấu trúc liên kết sao chép linh hoạt cho phép các thành viên tham gia hoặc rời đi theo ý muốn, đồng thời cung cấp sự đảm bảo về tính nhất quán của dữ liệu và thứ tự thông điệp. Nhân rộng 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ể thực hiện được trong sao chép truyền thống.

0 câu trả lời