VPS
Hosting
Email
Máy chủ
Firewall Anti DDoS
Tên Miền
SSL
5
4

Cấu hình MySQL Group Replication trên Ubuntu 20.04

10
Lượt xem
Home System Cấu hình MySQL Group Replication trên Ubuntu 20.04

Việc cấu hình MySQL Group Replication trên Ubuntu 20.04 cho phép bạn tạo một nhóm các node MySQL và đồng bộ hóa dữ liệu giữa chúng. Bài viết cách cấu hình sao chép nhóm MySQL trên Ubuntu 20.04 dưới đây của Vietnix sẽ hướng dẫn bạn cách để cấu hình MySQL Group Replication trên Ubuntu 20.04 nhanh chóng.

Yêu cầu tiên quyết để cách cấu hình sao chép nhóm MySQL trên Ubuntu 20.04 được triển khai

Để theo dõi hướng dẫn này, các bạn cần có:

  • Ba máy chủ chạy Ubuntu 20.04. Mỗi máy nên có một tài khoản người dùng quản trị không phải root với các đặc quyền sudo và tường lửa được đã được cấu hình bằng UFW.
  • MySQL được cài đặt trên mỗi máy chủ. Bài viết này 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ữ mặc định của Ubuntu, tại thời điểm của bài viết này là phiên bản 8.0.28. (Bài viết hướng dẫn cách cài đặt MySQL trên Ubuntu 20.04 tại đây)

Để mọi thứ được rõ ràng, bài viết 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 máy chủ này sẽ có các địa chỉ IP sau:

MemberIP Address
member1203.0.113.1
member2203.0.113.2
member3203.0.113.2

Các lệnh phải được chạy trên member1 sẽ có prefix là member1, thể hiện như sau:

member1$

Tương tự, các lệnh nào phải được chạy trên member2 sẽ có prefix là member2:

member2$

Các lệnh phải được chạy trên member3 sẽ có prefix là member3:

member3$

Cuối cùng là những lệnh nào cần chạy trên mỗi máy chủ thì sẽ không có prefix như trên, mà sẽ ở dạng thông thường như sau:

$
Event sinh nhật 11 tuổi

Chương trình mừng sinh nhật lần thứ 11 Vietnix

Các bước thực thiện

Sau khi chuẩn bị đầy đủ những yêu cầu trên, đến đây bạn có thể bắt đầu thực hiện cách cấu hình sao chép nhóm MySQL trên Ubuntu 20.04 theo các bước như sau:

Bước 1: Khởi tạo UUID để định danh một Nhóm MySQL

Trước khi mở tệp cấu hình để cấu hình các cài đặt sao chép nhóm cho MySQL, các bạn cần tạo UUID (Universal Unique Indentifier) dùng để xác định nhóm MySQL mà cần tạo.

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

member1$ uuidgen
Output
168dcb64-7cce-473a-b338-6501f305e561

Hãy lưu lại giá trị đầu ra mà các bạn nhận được trên máy, vì các bước tiếp theo sẽ cần dùng đến khi ta tiến hành 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 Group Replication trong tệp cấu hình của MySQL

Bây giờ ta đã sẵn sàng sửa đổi tệp cấu hình của MySQL. Hãy mở tệp cấu hình chính của MySQL trên mỗi máy chủ MySQL bằng trình soạn thảo văn bản tùy . Ở đây, sẽ sử dụng nano:

$ sudo nano /etc/mysql/my.cnf

Ta sẽ phải thêm cấu hình của riêng mình bên dưới các dòng !includedir. Điều này sẽ cho phép ta ghi đè bất kỳ cài đặt nào từ các tệp được included.

Để bắt đầu, ta mở một phần mới bằng cách include tiêu đề [mysqld], sau đó thêm các cài đặt bạn cần để bật sao chép nhóm, như được đánh dấu trong ví dụ sau. Lưu ý rằng các cài đặt này được chỉnh sửa theo các cài đặt tối thiểu cần thiết để cho phép sao chép nhóm được nêu ra document chính thức của MySQL.

Tiền tố loose- cho phép MySQL xử lý các tùy chọn nào không nhận ra mà không gặp lỗi hay bị failed. Các bạn sẽ cần phải điền vào một số chỗ trống và tùy chỉnh một số cài đặt này ở các bước tiếp theo:

. . .
!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 = ""

Những cài đặt của Group Replication có sẵn

Phần đầu tiên chứa các cài đặt chung cần thiết cho Group Replication – phần này không cần ta phải chỉnh sửa:

. . .
# 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 Group Replication trong MySQL là dữ liệu phải được lưu trữ trong công cụ lưu trữ InnoDB. Document của MySQL nên vô hiệu hóa một cách trực tiếp 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 như dòng không chú thích đầu tiên trong phần này.

Các cài đặt còn lại bật global transactions ID, cấu hình ghi nhật ký nhị phân cần thiết cho Group Replication và cấu hình SSL cho nhóm. Cấu hình này cũng thiết lập một số mục khác hỗ trợ trong quá trình khôi phục và khởi động. Các bạn không nên sửa đổi bất cứ chi tiết nào trong phần này và hãy đảm bảo phải giống hệt nhau trên cả ba máy chủ MySQL của mình.

Xem thêm: Hướng dẫn cách lấy chứng chỉ SSL trên Ubuntu 20.04 bằng Certbot (Standalone mode)

Những cài đặt được chia sẻ của Group Replication

Phần thứ hai giúp thiết lập những cài đặt được chia sẻ cho nhóm. Phần này, các bạn sẽ phải tùy chỉnh một lần và sau đó sử dụng lại các cài đặt tương tự đó trên mỗi node của mình. Cụ thể, các bạn phải thêm vào UUID của nhóm (cái mà ta đã tạo ở bước trước), danh sách các thành viên nhóm được ủy quyền và các seed member 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à các bạn đã tạo trước đó bằng lệnh uuidgen. Hãy đảm bảo rằng UUID được đặt 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 các bạn, được tách nhau bằng dấu phẩy. Cài đặt loose-group_replication_group_seeds phải gần giống như danh sách cho phép (whitelist), nhưng phải thêm một Cổng Group Replication được chỉ định vào sau địa chỉ IP của mỗi máy. Để thuận lợi cho việc theo dõi hướng dẫn này, các bạn hãy sử dụng Cổng Group Replication được khuyến nghị là 33061:

. . .
# 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 cần giống nhau trên mỗi máy chủ MySQL, vì vậy hãy đảm bảo copy – paste cẩn thận trên mỗi máy chủ.

Chọn Single Primary hay Multi-Primary

Tiếp theo, bạn cần quyết định nên cấu hình nhóm Single Primary (đơn chính) hay Multi-Primary (đ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 đầu tiên của nhóm) để xử lý các thao tác ghi. Còn nhóm đa chính cho sẽ phép bất kỳ thành viên nào trong nhóm thực hiện thao tác ghi.

Nếu các bạn muốn định cấu hình theo đa chính, hãy uncomment dòng loose-group_replication_single_primary_modeloose-group_replication_enforce_update_everywhere_checks. Điều này sẽ giúp thiết lập một nhóm đa chính. Ngược lại, nếu cấu hình theo nhóm đơn chính, hãy để lại hai dòng comment đó:

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

Lưu ý: Các cài đặt này phải giống nhau trên mỗi máy chủ MySQL của bạn.

Các bạn có thể thay đổi cài đặt này sau, nhưng sau khi làm vậy, các bạn cần phải khởi động lại từng thành viên trong nhóm MySQL của mình. Bởi vì, để chuyển sang cấu hình mới, ta sẽ phải dừng từng phiên bản của MySQL trong nhóm, khởi động lại từng thành viên với cài đặt mới, sau đó khởi động lại Group Replication. Tuy điều này sẽ không ảnh hưởng đến dữ liệu trong từng máy chủ nhưng sẽ tốn một khoảng nhỏ thời gian.

Những cài đặt cho việc cấu hình theo host cụ thể

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

  • ID máy chủ (server_id)
  • Địa chỉ để liên kết với (bind-address)
  • Địa chỉ để báo cáo cho các thành viên khác (report_host)
  • Địa chỉ sao chép cục bộ và listen port (loose-group_replication_local_address)

Chỉ thị server_id phải được đặt thành một số độc 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 dần lên trên mỗi máy chủ bổ sung tiếp theo. Đặt bind-addressreport_host thành địa chỉ IP của máy chủ tương ứng để máy chủ MySQL có thể lắng nghe các kết nối bên ngoài và báo cáo chính xác địa chỉ 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 Group Replication (33061), được thêm vào địa chỉ IP.

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

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

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

. . .
# 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 trên thành địa chỉ IP của máy chủ có cấu hình mà các bạn đang chỉnh sửa.

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

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

$sudo systemctl restart mysql

Tiếp theo, các bạn có thể đi tiếp sang phần cấu hình cho phép truy cập từ xa bằng cách cập nhật những quy tắc của tường lửa trên máy chủ.

Để xây dựng một cụm máy chủ MySQL với MySQL Group Replication trên Ubuntu 20.04, việc chọn một dịch vụ VPS ổn định và chất lượng là rất quan trọng.

Vietnix hiện đang cung cấp các gói VPS linh hoạt và tốc độ cao, cho phép bạn lựa chọn và tùy chỉnh cấu hình máy chủ theo nhu cầu sử dụng như VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp và VPS NVMe.

Các gói VPS tại Vietnix đầu tư phần cứng mạnh mẽ, đảm bảo mang đến hiệu suất cao và độ ổn định, giúp bạn hoàn thành các dự án một cách hiệu quả.

Đặc biệt, đội ngũ kỹ thuật của Vietnix luôn túc trực 24/7, sẵn sàng hỗ trợ bạn khi gặp vấn đề hoặc cần giải đáp các câu hỏi liên quan đến việc triển khai cấu hình MySQL Group Replication. Liên hệ ngay với Vietnix để được tư vấn chi tiết.

Bước 3: Cập nhật các quy tắc của UFW trên mỗi Servers

Theo yêu cầu tiên quyết của bài hướng dẫn này, ngầm giả sử rằng là các bạn đã thiết lập tường lửa trên từng máy chủ mà các 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 tới tất cả các cổng trên máy chủ, ngoại trừ các kết nối ssh chứa các khóa phù hợp với các khóa trong tệp authorized_keys (chứa khóa được ủy quyền) của mỗi máy chủ.

Trong tệp cấu hình MySQL, ta đã định 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. Các bạn cũng đã xác định 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 mình, các 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 để các thành viên 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 sau trên member1:

member1$ sudo ufw allow from member2_server_ip to any port 3306
member1$ sudo ufw allow from member2_server_ip to any port 33061

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

member1$ sudo ufw allow from member3_server_ip to any port 3306
member1$ 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ủ còn lại. Chạy các lệnh sau trên member2, hãy đảm bảo thay đổi địa chỉ IP tương ứng với địa chỉ của member1member3:

member2$ sudo ufw allow from member1_server_ip to any port 3306
member2$ sudo ufw allow from member1_server_ip to any port 33061
member2$ sudo ufw allow from member3_server_ip to any port 3306
member2$ 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 chắc chắn rằng bạn nhập đúng địa chỉ IP cho từng máy chủ:

member3$ sudo ufw allow from member1_server_ip to any port 3306
member3$ sudo ufw allow from member1_server_ip to any port 33061
member3$ sudo ufw allow from member2_server_ip to any port 3306
member3$ 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 thể hiện trong số ba MySQL instance sẽ được phép truy cập vào các cổng được MySQL sử dụng 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ở, giờ đây các bạn có thể tạo Người Dùng Sao Chép (replication user) và bật plugin của Group Replication.

Bước 4: Cấu hình cho Replication Users và kích hoạt plugin của Group Replication

Để thiết lập kết nối với các máy chủ khác trong Group Replication, mỗi phiên bản MySQL phải có một người dùng sao chép chuyên dụng.

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

$ sudo mysql

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

Vì mỗi máy chủ sẽ có người dùng sao chép riêng nên ta 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 sao chép bắt đầu, nhóm sẽ cố gắng truyền người dùng sao chép từ máy chủ chính sang các máy chủ phụ khác, tạo ra xung đột với người dùng sao chép đã có sẵn. Chạy lệnh truy vấn MySQL sau trên mỗi máy chủ:

mysql> SET SQL_LOG_BIN=0;

Bây giờ ta có thể chạy câu lệnh CREATE USER để tạo người dùng sao chép của mình. Chạy lệnh sau, lệnh này tạo người dùng có tên repl. Lệnh này chỉ định rằng người dùng sao chép phải kết nối bằng SSL. Ngoài ra, hãy tự tạo một khẩu cho riêng mình thay cho password khi tạo:

mysql> 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ủ:

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

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

mysql> FLUSH PRIVILEGES;

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

mysql> SET SQL_LOG_BIN=1;

Tiếp theo, hãy thiết lập cho group_replication_recovery sử dụng người dùng sao chép mới vừa tạo và mật khẩu được liên kết tương ứng. Sau đó, mỗi máy chủ sẽ sử dụng các thông tin đăng nhập này để xác thực với nhóm:

mysql> 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 trước 8.0.23, các bạn sẽ cần sử dụng cú pháp cũ của MySQL để thiết lập như dưới đây:

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

Khi đã có người dùng sao chép, ta có thể bật plugin group_replication để chuẩn bị khởi tạo nhóm:

mysql> 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:

mysql> SHOW PLUGINS;

Plugin group_replication sẽ xuất hiện ở cuối danh sách vì đây 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)

Đầu ra 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 sang bước tiếp theo, hãy đảm bảo rằng các bạn đã chạy từng lệnh trong phần này trên từng phiên bản MySQL của mình.

Bước 5: Bắt đầu tiến hành Group Replication

Giờ đây, mỗi máy chủ MySQL đã được cấu hình người dùng sao chép và plugin của Group Replication được bật, các bạn có thể bắt đầu cập nhật nhóm của mình.

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

Để khởi động một 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. Bước này sẽ được thực hiện trên member1.

Các 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 mới nhất và các thông tin khác khi lần đầu tham gia nhóm. Do đó, các bạn cần sử dụng một quy trình khác để khởi động thành viên ban đầu của nhóm sao cho thành viên đó biết rằng không cần phải đợi lấy thông tin từ các thành viên khác trong danh sách seed member của mình.

Nếu thiết lập, biến group_replication_bootstrap_group sẽ cho một thành viên biết rằng không nên chờ đợi nhận thông tin từ các thành viên khác và thay vào đó nên thiết lập một nhóm mới và tự bầu chọn chính mình làm máy chủ chính. Các bạn có thể tiến hành thiết lập trên bằng lệnh sau:

(member1) mysql> SET GLOBAL group_replication_bootstrap_group=ON;

Sau đó, bạn có thể bắt đầu sao chép cho thành viên ban đầu của nhóm:

(member1) mysql> START GROUP_REPLICATION;

Tiếp theo, các bạn có thể đặt lại biến group_replication_bootstrap_group thành OFF, vì trường hợp duy nhất thích hợp là khi không có thành viên nào trong nhóm:

(member1) mysql> 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. Ta xác minh điều này bằng cách kiểm tra các mục trong bảng replica_group_members trong cơ sở dữ liệu performance_schema:

(member1) mysql> SELECT * FROM performance_schema.replication_group_members;

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

Output (member1)
+------------------------------------+------------------------------------------------------------+----------------------+---------------------+---------------------+----------------------+---------------------------+------------------------------------------------+
 | 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 chỉ ra rằng node này có đầy đủ các thao tác ở 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 các thành viên khác được thêm vào nhóm này, dữ liệu này sẽ tự động được sao chép sang đó.

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

(member1) mysql> 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:

(member1) mysql> CREATE TABLE playground.equipment ( 
(member1) mysql> id INT NOT NULL AUTO_INCREMENT,
(member1) mysql> type VARCHAR(50),
(member1) mysql> quant INT,
(member1) mysql> color VARCHAR(25),
(member1) mysql> PRIMARY KEY(id)
(member1) mysql> ); 

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, nghĩa là ta 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 “equipment” trên bảng “playground”
  • quant: cột này sẽ chứa các giá trị số nguyên để biểu thị số lượng của loại “equipment” trên “playground”
  • color: cột này sẽ chứa các giá trị chuỗi chỉ định màu của “equipment”

Ngoài ra, 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:

(member1) mysql> 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:

(member1) mysql> 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à có thể khả năng thực hiện thao tác 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ì đã có một thành viên đang hoạt động, các bạn không cần phải khởi động lại nhóm và thành viên này có thể tham gia ngay lập tức:

(member2) mysql> START GROUP_REPLICATION;

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

(member3) mysql> START GROUP_REPLICATION;

Kiểm tra lại danh sách các thành viên trên bất kỳ máy chủ nào trong ba máy chủ thì sẽ hiện ra có ba máy chủ đang hoạt động, lệnh thực hiện như sau:

(member2) mysql> SELECT * FROM performance_schema.replication_group_members;
Output (member2)

+------------------------------------+------------------------------------------------------------+----------------------+---------------------+-----------------------+---------------------+--------------------------+------------------------------------------------+
 | 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ả thành viên đều 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ê ra như là RECOVERY trong hơn một vài giây, thì đó thường là dấu hiệu cho thấy đã xảy ra lỗi hoặc có gì đó đã bị đị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 chưa:

(member2) mysql> SELECT * FROM playground.equipment;
Output (member2)
+----+-------+---------+---------+
 | 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 bình thường.

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

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

Kiểm tra những lệnh ghi trên môi trường Đơn chính

Trong nhóm đơn chính, các bạn sẽ thấy mọi thao tác ghi từ máy chủ không phải chính sẽ bị từ chối vì lý do nhất quán. Các bạn có thể tìm máy chủ chính hiện tại bất kỳ lúc nào bằng cách chạy truy vấn sau trên bất kỳ thành viên nào trong nhóm bản sao:

(member2) mysql> SHOW STATUS LIKE '%primary%';
Output (member2)
+-------------------------------------------------+------------------------------------------------------------+
| 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à ta có gắn vào 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ư đã làm trước đây:

(member2) mysql> SELECT * FROM performance_schema.replication_group_members;
Output (member2)
+------------------------------------+------------------------------------------------------------+-----------------------+---------------------+----------------------+
 | 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ư vậy, máy chủ tại 203.0.113.1 — member1 — hiện là máy chủ chính. Nên nếu các bạn cố ghi vào cơ sở dữ liệu này từ một thành viên khác (không phải máy chủ chính), thao tác sẽ không thành công:

(member2) mysql> INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
Output (member2)
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

Đầu ra trên cho kết quả đúng như dự đoán vì nhóm hiện được định cấu hình chỉ theo đơn chính. 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 một thành viên mới làm máy chủ chính và cho phép thực hiện ghi.

Kiểm tra những lệnh ghi trên 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ể thực hiện ghi vào cơ sở dữ liệu.

Các 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:

(member2) mysql> SHOW STATUS LIKE '%primary%';
Output (member2)
+--------------------------------------------------+--------+
 | 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ể thực hiện việc ghi dữ liệu.

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:

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

member2 đã thực thi thành công thao tác ghi mà 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 chưa:

(member3) mysql> 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 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:

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

Quay lại member1, kiểm tra để đảm bảo rằng các thao tác ghi từ cả hai thành viên mới đã được sao chép:

(member1) mysql> 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 việc sao chép đã hoạt động đúng hướng đề ra 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: Thực hiện sao lưu cho Nhóm

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à nhóm vẫn có đủ thành viên để chọn máy chủ chính. Tuy nhiên, nếu một số thay đổi cấu hình nhất định được thực hiện hoặc tất cả thành viên của nhóm rời đi, thì các bạn có thể cần phải khởi động lại nhóm.

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

(member1) mysql> SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=ON;

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

(member1) mysql> START GROUP_REPLICATION;

Sau đó, có thể đặt lại biến group_replication_bootstrap_group thành OFF:

(member1) mysql> 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:

(member2) mysql> START GROUP_REPLICATION;

Thực hiện theo quy trình này cho các thành viên bổ sung khác:

(member3) mysql> START GROUP_REPLICATION;

Bây giờ nhóm sẽ bao gồm tất cả các thành viên hiện đang online:

(member3) mysql> 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 vào Group khi MySQL khởi động

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 muốn các thành viên tự động tham gia lại nhóm, các bạn có thể sửa đổi một chút trong tệp cấu hình.

Cài đặt được nêu trong bước này hữu ích khi các 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 ta cần phải lưu ý. Đầu tiên, cài đặt này chỉ ảnh hưởng khi một MySQL instance được khởi động. Nếu thành viên bị xóa khỏi nhóm vì lí do timeout, nhưng MySQL instance vẫn trực tuyến, thì 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 một nhóm lần đầu tiên có thể gây hại. Khi không có một nhóm hiện có để tham gia, quá trình này sẽ mất nhiều thời gian để bắt đầu vì sẽ cố gắng liên hệ với các thành viên không tồn tại khác để khởi tạo. Chỉ sau một thời gian chờ dài, sẽ từ bỏ và bắt đầu lại như bình thường. Sau đó, các bạn sẽ phải sử dụng quy trình đã nêu ở trên để khởi động nhóm.

Nếu các bạn muốn định cấu hình các node để tự động tham gia nhóm khi MySQL khởi động, hãy mở tệp cấu hình chính của MySQL:

$ sudo nano /etc/mysql/my.cnf

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

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

Lưu và đóng tệp khi bạn hoàn tất. Đến đây, các thành viên sẽ tự động cố gắng tham gia nhóm vào lần tiếp theo MySQL instance của chính thành viên đó được khởi động.

Với hơn 10 năm kinh nghiệm, đồng hành cùng 50.000+ khách hàng trong và ngoài nước, Vietnix hiện đang là một trong những nhà cung cấp VPS hàng đầu tại Việt Nam. Nếu bạn đang cần một dịch vụ VPS để triển khai các dự án thì có thể liên hệ ngay với Vietnix.

  • Hơn 100.000 dịch vụ đã được kích hoạt tại Vietnix, chứng tỏ sự tin tưởng và lựa chọn của đông đảo khách hàng.
  • Vietnix đã đạt giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022, khẳng định chất lượng và uy tín của dịch vụ.
  • 97% khách hàng đã và đang sử dụng dịch vụ tại Vietnix có phản hồi tích cực, đánh giá cao chất lượng.

Hãy liên hệ với Vietnix ngay hôm nay để biết thêm thông tin chi tiết và nhận ưu đãi hấp dẫn.

  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn

Lời kết

Sau bài hướng dẫn về cách cấu hình sao chép nhóm MySQL trên Ubuntu 20.04 này, các bạn đã học được cách cấu hình Group Replication MySQL giữa ba máy chủ Ubuntu 20.04. Hy vọng qua bài viết, bạn đã có thể thao tác một cách dễ dàng và nhanh chóng. Chia sẻ bài viết này của Vietnix nếu thấy hay và bổ ích.

Chia sẻ bài viết
Đánh giá
5/5 - (4 bình chọn)
Kết nối với mình qua
Mình là Bo - admin của Quản Trị Linux. Mình đã có 10 năm làm việc trong mảng System, Network, Security và đã trải nghiệm qua các chứng chỉ như CCNP, CISSP, CISA, đặc biệt là chống tấn công DDoS. Gần đây mình trải nghiệm thêm Digital Marketing và đã hòan thành chứng chỉ CDMP của PearsonVUE. Mình rất thích được chia sẻ và hỗ trợ cho mọi người, nhất là các bạn sinh viên. Hãy kết nối với mình nhé!
Đăng ký nhận tin
Để không bỏ sót bất kỳ tin tức hoặc chương trình khuyến mãi từ Vietnix
Bài viết liên quan
Bình luận
Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận