Không giống như máy chủ MySQL tiêu chuẩn và MySQL Cluster, cách khởi động MySQL / MariaDB Galera Cluster có một chút khác biệt. Galera yêu cầu bạn bắt đầu một nút trong một cụm làm điểm tham chiếu, trước khi các nút còn lại có thể tham gia và tạo thành cụm. Quá trình này được gọi là cluster bootstrap. Bootstrapping là bước đầu tiên để giới thiệu một nút cơ sở dữ liệu làm thành phần chính, trước khi những người khác xem nó như một điểm tham chiếu để đồng bộ hóa dữ liệu.
Nó hoạt động như thế nào?
Khi Galera bắt đầu bằng lệnh bootstrap trên một nút, nút cụ thể đó sẽ đạt trạng thái Chính (kiểm tra giá trị của wsrep_cluster_status). Các nút còn lại sẽ chỉ yêu cầu lệnh khởi động bình thường và chúng sẽ tự động tìm Thành phần chính (PC) hiện có trong cụm và tham gia để tạo thành một cụm. Sau đó, đồng bộ hóa dữ liệu sẽ diễn ra thông qua chuyển trạng thái gia tăng (IST) hoặc chuyển trạng thái ảnh chụp nhanh (SST) giữa trình kết hợp và nhà tài trợ.
Vì vậy, về cơ bản, bạn chỉ nên khởi động cụm nếu bạn muốn bắt đầu một cụm mới hoặc khi không có nút nào khác trong cụm ở trạng thái CHÍNH. Cần cẩn thận khi chọn hành động để thực hiện, nếu không, bạn có thể kết thúc với các cụm bị tách hoặc mất dữ liệu.
Các tình huống ví dụ sau minh họa thời điểm khởi động cụm ba nút dựa trên trạng thái nút (wsrep_local_state_comment) và trạng thái cụm (wsrep_cluster_status):
Bang Galera | Quy trình khởi động |
---|---|
| |
| |
| |
| |
| |
|
Làm cách nào để bắt đầu Cụm Galera?
3 nhà cung cấp Galera sử dụng các lệnh khởi động khác nhau (dựa trên phiên bản mới nhất của phần mềm). Trên nút đầu tiên, hãy chạy:
-
MySQL Galera Cluster (Codership):
$ service mysql bootstrap # sysvinit $ galera_new_cluster # systemd $ mysqld_safe --wsrep-new-cluster # command line
-
Percona XtraDB Cluster (Percona):
$ service mysql bootstrap-pxc # sysvinit $ systemctl start [email protected] # systemd
-
MariaDB Galera Cluster (MariaDB):
$ service mysql bootstrap # sysvinit $ service mysql start --wsrep-new-cluster # sysvinit $ galera_new_cluster # systemd $ mysqld_safe --wsrep-new-cluster # command line
Lệnh trên chỉ là một trình bao bọc và những gì nó thực sự làm là khởi động phiên bản MySQL trên nút đó với gcomm:// dưới dạng biến wsrep_cluster_address. Bạn cũng có thể xác định thủ công các biến bên trong my.cnf và chạy lệnh bắt đầu / khởi động lại tiêu chuẩn. Tuy nhiên, đừng quên thay đổi lại wsrep_cluster_address để chứa địa chỉ cho tất cả các nút sau khi bắt đầu.
Khi nút đầu tiên hoạt động, hãy chạy lệnh sau trên các nút tiếp theo:
$ service mysql start
$ systemctl start mysql
Nút mới kết nối với các thành viên cụm như được xác định bởi tham số wsrep_cluster_address. Bây giờ nó sẽ tự động truy xuất bản đồ cụm và kết nối với phần còn lại của các nút và tạo thành một cụm.
Cảnh báo:Không bao giờ khởi động bootstrap khi bạn muốn kết nối lại một nút với một cụm hiện có và KHÔNG BAO GIỜ chạy bootstrap trên nhiều nút.
Cờ Safe-to-Bootstrap
Galera bắt đầu từ phiên bản 3.19 đi kèm với một cờ mới có tên “safe_to_bootstrap” bên trong grastate.dat. Cờ này tạo điều kiện thuận lợi cho việc đưa ra quyết định và ngăn chặn các lựa chọn không an toàn bằng cách theo dõi thứ tự các nút đang tắt. Nút bị tắt lần cuối sẽ được đánh dấu là “Safe-to-Bootstrap”. Tất cả các nút khác sẽ được đánh dấu là không an toàn để khởi động từ đó.
Nhìn vào nội dung grastate.dat (mặc định là trong MySQL datadir) và bạn sẽ thấy cờ ở dòng cuối cùng:
# GALERA saved state
version: 2.1
uuid: 8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno: 2575
safe_to_bootstrap: 0
Khi khởi động cụm mới, Galera sẽ từ chối khởi động nút đầu tiên được đánh dấu là không an toàn để khởi động từ đó. Bạn sẽ thấy thông báo sau trong nhật ký:
“Có thể không an toàn khi khởi động cụm từ nút này. Đây không phải là trang cuối cùng rời khỏi cụm và có thể không chứa tất cả các bản cập nhật.
Để buộc khởi động cụm với nút này, hãy chỉnh sửa tệp grastate.dat theo cách thủ công và đặt safe_to_bootstrap thành 1. ”
Trong trường hợp tắt máy không sạch hoặc sự cố cứng, tất cả các nút sẽ có “safe_to_bootstrap:0”, vì vậy chúng tôi phải tham khảo công cụ lưu trữ InnoDB để xác định nút nào đã thực hiện giao dịch cuối cùng trong cụm. Điều này có thể đạt được bằng cách khởi động mysqld với biến “--wsrep-recovery” trên mỗi nút, tạo ra kết quả như sau:
$ mysqld --wsrep-recover
...
2016-11-18 01:42:15 36311 [Note] InnoDB: Database was not shutdown normally!
2016-11-18 01:42:15 36311 [Note] InnoDB: Starting crash recovery.
...
2016-11-18 01:42:16 36311 [Note] WSREP: Recovered position: 8bcf4a34-aedb-14e5-bcc3-d3e36277729f:114428
...
Số sau chuỗi UUID trên dòng "Vị trí đã khôi phục" là số cần tìm. Chọn nút có số cao nhất và chỉnh sửa grastate.dat của nó để đặt “safe_to_bootstrap:1”, như thể hiện trong ví dụ bên dưới:
# GALERA saved state
version: 2.1
uuid: 8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno: -1
safe_to_bootstrap: 1
Sau đó, bạn có thể thực hiện lệnh bootstrap tiêu chuẩn trên nút đã chọn.
Điều gì sẽ xảy ra nếu các nút bị phân tách?
Trong một số trường hợp nhất định, các nút có thể phân kỳ với nhau. Trạng thái của tất cả các nút có thể chuyển thành Không phải chính do sự phân chia mạng giữa các nút, sự cố cụm hoặc nếu Galera gặp một ngoại lệ khi xác định Thành phần chính. Sau đó, bạn sẽ cần chọn một nút và quảng bá nó thành Thành phần chính.
Để xác định nút nào cần được khởi động, hãy so sánh giá trị wsrep_last_comished trên tất cả các nút DB:
node1> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name | Value |
+----------------------+-------------+
| wsrep_last_committed | 10032 |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node2> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name | Value |
+----------------------+-------------+
| wsrep_last_committed | 10348 |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node3> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name | Value |
+----------------------+-------------+
| wsrep_last_committed | 997 |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
Từ các kết quả đầu ra trên, node2 có dữ liệu cập nhật nhất. Trong trường hợp này, tất cả các nút Galera đã được khởi động, vì vậy bạn không nhất thiết phải khởi động lại cụm. Chúng tôi chỉ cần quảng bá node2 trở thành Thành phần chính:
node2> SET GLOBAL wsrep_provider_options="pc.bootstrap=1";
Các nút còn lại sau đó sẽ kết nối lại với Thành phần chính (node2) và đồng bộ hóa lại dữ liệu của chúng dựa trên nút này.
Nếu bạn đang sử dụng ClusterControl (dùng thử miễn phí), bạn có thể xác định wsrep_last_comished và wsrep_cluster_status trực tiếp từ ClusterControl> Tổng quan trang:Hoặc từ ClusterControl> Hiệu suất> Trạng thái DB trang: