Đối với tất cả những người không quen thuộc với Vitess, đây là một hệ thống cơ sở dữ liệu dựa trên MySQL nhằm cung cấp một hệ thống quản lý cơ sở dữ liệu quan hệ dễ mở rộng, phân đoạn. Chúng tôi sẽ không đi sâu vào chi tiết về thiết kế, nhưng tóm lại, Vitess bao gồm các nút proxy định tuyến các yêu cầu, các cổng đang quản lý các nút cơ sở dữ liệu và cuối cùng, chính các nút cơ sở dữ liệu MySQL, được dùng để lưu trữ dữ liệu. Nếu chúng ta đang nói về MySQL, người ta có thể nghĩ nếu có một tùy chọn thực sự sử dụng các công cụ bên ngoài như ClusterControl để quản lý các cơ sở dữ liệu cơ bản đó. Câu trả lời ngắn gọn là "có". Câu trả lời dài hơn sẽ là bài đăng trên blog này.
MySQL trong Vitess
Trước hết, chúng tôi muốn dành một chút thời gian để nói về cách Vitess sử dụng MySQL. Kiến trúc cấp cao được mô tả trên trang tài liệu Vitess. Nói tóm lại, chúng tôi có VTGate hoạt động như một proxy, chúng tôi có Dịch vụ cấu trúc liên kết là một kho siêu dữ liệu dựa trên Zookeeper, Consul hoặc Etcd, nơi chứa tất cả thông tin về các nút trong hệ thống, cuối cùng chúng tôi có VTTablets, hoạt động làm trung gian giữa VTGate và MySQL instance. Các cá thể MySQL có thể là độc lập hoặc chúng có thể được cấu hình bằng cách sử dụng sao chép không đồng bộ (hoặc bán đồng bộ) tiêu chuẩn. MySQL được sử dụng để lưu trữ dữ liệu. Dữ liệu có thể được chia thành các mảnh, trong trường hợp đó, một phiên bản MySQL sẽ chứa một tập con dữ liệu.
Tất cả điều này đều hoạt động tốt. Vitess có thể xác định nút nào là chủ, nút nào là nô lệ, định tuyến các truy vấn cho phù hợp. Tuy nhiên, có một số vấn đề. Không phải tất cả các chức năng cơ bản nhất đều được cung cấp bởi Vitess. Phát hiện cấu trúc liên kết và định tuyến truy vấn, có. Sao lưu - vâng, Vitess có thể được định cấu hình để sao lưu dữ liệu và cho phép người dùng khôi phục bất cứ thứ gì đã được sao lưu. Thật không may, không có hỗ trợ nội bộ cho chuyển đổi dự phòng tự động. Không có giao diện người dùng theo xu hướng thích hợp có thể giúp người dùng hiểu trạng thái của cơ sở dữ liệu và khối lượng công việc của họ. May mắn thay, khi chúng ta đang nói về MySQL tiêu chuẩn, chúng ta có thể dễ dàng sử dụng các giải pháp bên ngoài để thực hiện điều này. Ví dụ, đối với chuyển đổi dự phòng, Vitess có thể được tích hợp với Orchestrator. Hãy xem cách ClusterControl có thể được sử dụng cùng với Vitess để cung cấp khả năng quản lý, giám sát và chuyển đổi dự phòng.
Triển khai một cụm cơ sở dữ liệu mới bằng ClusterControl
Trước tiên, hãy triển khai một cụm mới. Như thường lệ với ClusterControl, bạn phải cung cấp phần cứng và đảm bảo rằng ClusterControl có thể truy cập các nút đó bằng SSH.
Trước tiên, chúng ta phải xác định kết nối SSH.
Tiếp theo, chúng tôi sẽ chọn nhà cung cấp và phiên bản. Theo tài liệu, Vitess hỗ trợ MySQL và Percona Server trong phiên bản 5.7 và 8.0 (mặc dù nó không hỗ trợ phương thức caching_sha2_password nên bạn phải cẩn thận khi tạo người dùng). Nó cũng hỗ trợ MariaDB lên đến 10.3.
Cuối cùng, chúng tôi xác định cấu trúc liên kết. Sau khi nhấp vào “Triển khai”, ClusterControl sẽ thực hiện triển khai cụm.
Sau khi nó sẵn sàng, bạn sẽ thấy cụm và bạn có thể quản lý nó bằng ClusterControl. Nếu Auto Recovery cho Cluster và Node được bật, ClusterControl sẽ thực hiện chuyển đổi dự phòng tự động nếu cần.
Bạn cũng sẽ được hưởng lợi từ việc giám sát dựa trên tác nhân trong phần "Trang tổng quan" của giao diện người dùng ClusterControl.
Nhập cụm vào Vitess
Bước tiếp theo, chúng ta nên triển khai Vitess. Những gì chúng tôi mô tả ở đây hoàn toàn không phải là thiết lập cấp sản xuất, do đó chúng tôi sẽ cắt bỏ một số góc và chỉ triển khai bộ Vitess trên một nút duy nhất theo hướng dẫn từ tài liệu Vitess. Để giúp bạn dễ dàng xử lý hơn, chúng ta sẽ xem hướng dẫn Cài đặt cục bộ, hướng dẫn này sẽ triển khai tất cả các dịch vụ, cùng với cơ sở dữ liệu mẫu trên một nút duy nhất. Làm cho nó đủ lớn để chứa chúng. Đối với mục đích thử nghiệm, một nút có một vài lõi CPU và bộ nhớ 4GB là đủ.
Giả sử rằng mọi thứ diễn ra tốt đẹp và bạn có triển khai Vitess cục bộ đang chạy trên nút. Bước tiếp theo sẽ là nhập cụm của chúng tôi do ClusterControl triển khai vào Vitess. Để làm được điều đó, chúng ta phải chạy thêm hai VTTablet. Đầu tiên, chúng tôi sẽ tạo thư mục cho các VTTablet đó:
[email protected]:~$ cd /home/vagrant/my-vitess-example/
[email protected]:~/my-vitess-example$ source env.sh
[email protected]:~/my-vitess-example$ mkdir $VTDATAROOT/vt_0000000401
[email protected]:~/my-vitess-example$ mkdir $VTDATAROOT/vt_0000000402
Sau đó, trên cơ sở dữ liệu, chúng tôi sẽ tạo một người dùng sẽ được sử dụng cho Vitess để kết nối và quản lý cơ sở dữ liệu.
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'pass';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL ON *.* TO [email protected]'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)
Nếu muốn, chúng tôi cũng có thể muốn tạo thêm người dùng. Vitess cho phép chúng tôi chuyển cho một số người dùng có các đặc quyền truy cập khác nhau:người dùng ứng dụng, người dùng DBA, người dùng sao chép, người dùng có đầy đủ đặc quyền và một số người dùng khác.
Điều cuối cùng chúng ta phải làm là tắt super_read_only trên tất cả MySQL vì Vitess sẽ cố gắng tạo siêu dữ liệu trên bản sao, dẫn đến việc khởi động dịch vụ vttablet không thành công.
Sau khi hoàn tất, chúng ta nên khởi động VTTablets. Trong cả hai trường hợp, chúng tôi phải đảm bảo rằng các cổng là duy nhất và chúng tôi chuyển thông tin xác thực chính xác để truy cập phiên bản cơ sở dữ liệu:
vttablet $TOPOLOGY_FLAGS -logtostderr -log_queries_to_file $VTDATAROOT/tmp/vttablet_0000000401_querylog.txt -tablet-path "zone1-0000000401" -init_keyspace clustercontrol -init_shard 0 -init_tablet_type replica -port 15401 -grpc_port 16401 -service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' -pid_file $VTDATAROOT/vt_0000000401/vttablet.pid -vtctld_addr http://localhost:15000/ -db_host 10.0.0.181 -db_port 3306 -db_app_user vtuser -db_app_password pass -db_dba_user vtuser -db_dba_password pass -db_repl_user vtuser -db_repl_password pass -db_filtered_user vtuser -db_filtered_password pass -db_allprivs_user vtuser -db_allprivs_password pass -init_db_name_override clustercontrol -init_populate_metadata &
vttablet $TOPOLOGY_FLAGS -logtostderr -log_queries_to_file $VTDATAROOT/tmp/vttablet_0000000402_querylog.txt -tablet-path "zone1-0000000402" -init_keyspace clustercontrol -init_shard 0 -init_tablet_type replica -port 15402 -grpc_port 16402 -service_map 'grpc-queryservice,grpc-tabletmanager,grpc-updatestream' -pid_file $VTDATAROOT/vt_0000000402/vttablet.pid -vtctld_addr http://localhost:15000/ -db_host 10.0.0.182 -db_port 3306 -db_app_user vtuser -db_app_password pass -db_dba_user vtuser -db_dba_password pass -db_repl_user vtuser -db_repl_password pass -db_filtered_user vtuser -db_filtered_password pass -db_allprivs_user vtuser -db_allprivs_password pass -init_db_name_override clustercontrol -init_populate_metadata &
Khi nó đã sẵn sàng, chúng ta có thể kiểm tra cách Vitess nhìn thấy VTTablet mới:
[email protected]:~/my-vitess-example$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.9-vitess-10.0.2 Version: 10.0.2 (Git revision fc78470 branch 'HEAD') built on Thu May 27 08:45:22 UTC 2021 by [email protected] using go1.15.12 linux/amd64
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW vitess_tablets;
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| Cell | Keyspace | Shard | TabletType | State | Alias | Hostname | MasterTermStartTime |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| zone1 | clustercontrol | 0 | REPLICA | SERVING | zone1-0000000401 | vagrant.vm | |
| zone1 | clustercontrol | 0 | REPLICA | SERVING | zone1-0000000402 | vagrant.vm | |
| zone1 | commerce | 0 | MASTER | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
| zone1 | commerce | 0 | REPLICA | SERVING | zone1-0000000101 | vagrant.vm | |
| zone1 | commerce | 0 | RDONLY | SERVING | zone1-0000000102 | vagrant.vm | |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
5 rows in set (0.00 sec)
Các nút ở đó nhưng cả hai đều được Vitess báo cáo là bản sao. Giờ đây, chúng tôi có thể kích hoạt Vitess để kiểm tra cấu trúc liên kết cho nút chính thực sự của chúng tôi (nút mà chúng tôi đã nhập với ID là 401)
[email protected]:~/my-vitess-example$ vtctlclient TabletExternallyReparented zone1-401
Bây giờ tất cả đều đúng:
mysql> SHOW vitess_tablets;
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| Cell | Keyspace | Shard | TabletType | State | Alias | Hostname | MasterTermStartTime |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| zone1 | clustercontrol | 0 | MASTER | SERVING | zone1-0000000401 | vagrant.vm | 2021-07-08T13:27:34Z |
| zone1 | clustercontrol | 0 | REPLICA | SERVING | zone1-0000000402 | vagrant.vm | |
| zone1 | commerce | 0 | MASTER | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
| zone1 | commerce | 0 | REPLICA | SERVING | zone1-0000000101 | vagrant.vm | |
| zone1 | commerce | 0 | RDONLY | SERVING | zone1-0000000102 | vagrant.vm | |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
5 rows in set (0.00 sec)
Tích hợp chuyển đổi dự phòng tự động ClusterControl vào Vitess
Phần cuối cùng mà chúng tôi muốn xem xét là xử lý chuyển đổi dự phòng tự động với ClusterControl và xem cách bạn có thể tích hợp nó với Vitess. Nó sẽ khá giống với những gì chúng ta vừa thấy. Vấn đề chính cần giải quyết là chuyển đổi dự phòng không thay đổi bất cứ điều gì trong Vitess. Giải pháp là những gì chúng tôi đã sử dụng trước đó, lệnh TabletExternallyReparented. Thách thức duy nhất là kích hoạt nó khi chuyển đổi dự phòng xảy ra. May mắn thay, ClusterControl đi kèm với các hook cho phép chúng ta tham gia vào quá trình chuyển đổi dự phòng. Chúng tôi sẽ sử dụng chúng để chạy vtctlclient. Tuy nhiên, nó phải được cài đặt trên phiên bản ClusterControl trước. Cách dễ nhất để thực hiện điều đó là sao chép tệp nhị phân từ phiên bản Vitess sang ClusterControl.
Trước tiên, hãy tạo thư mục trên nút ClusterControl:
mkdir -r /usr/local/vitess/bin
Sau đó, chỉ cần sao chép tệp:
scp /usr/local/vitess/bin/vtctlclient [email protected]:/usr/local/vitess/bin/
Bước tiếp theo, chúng ta phải tạo một tập lệnh sẽ thực thi lệnh tới các phân đoạn rõ ràng. Chúng tôi sẽ sử dụng replication_post_failover_script và replication_post_switchover_script. Cmon sẽ thực thi tập lệnh với một số đối số. Chúng tôi quan tâm đến phần ba trong số chúng, nó sẽ chứa tên máy chủ của ứng cử viên chính - nút đã được chọn làm nút chính mới.
Tập lệnh mẫu có thể trông giống như thế này.
#!/bin/bash
if [[ $3 == 10.0.0.181 ]] ; then tablet="zone1-401" ; fi
if [[ $3 == 10.0.0.182 ]] ; then tablet="zone1-402" ; fi
vitess="10.0.0.50"
/usr/local/vitess/bin/vtctlclient -server ${vitess}:15999 TabletExternallyReparented ${tablet}
Xin lưu ý rằng đây chỉ là mức tối thiểu hoạt động. Bạn nên triển khai một tập lệnh chi tiết hơn sẽ thực hiện các kiểm tra độ tỉnh táo bổ sung. Thay vì mã hóa cứng tên máy chủ và tên máy tính bảng, bạn có thể thực sự truy vấn ClusterControl để lấy danh sách các nút trong cụm, sau đó bạn có thể muốn so sánh nó với nội dung của Dịch vụ cấu trúc liên kết để xem bí danh máy tính bảng nào nên được sử dụng.
Khi chúng ta đã sẵn sàng với tập lệnh, chúng ta nên định cấu hình nó để được thực thi bởi ClusterControl:
Chúng tôi có thể kiểm tra điều này bằng cách quảng cáo bản sao theo cách thủ công. Trạng thái ban đầu, như Vitess thấy, là:
mysql> SHOW vitess_tablets;
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| Cell | Keyspace | Shard | TabletType | State | Alias | Hostname | MasterTermStartTime |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| zone1 | clustercontrol | 0 | MASTER | SERVING | zone1-0000000401 | vagrant.vm | 2021-07-08T13:27:34Z |
| zone1 | clustercontrol | 0 | REPLICA | SERVING | zone1-0000000402 | vagrant.vm | |
| zone1 | commerce | 0 | MASTER | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
| zone1 | commerce | 0 | REPLICA | SERVING | zone1-0000000101 | vagrant.vm | |
| zone1 | commerce | 0 | RDONLY | SERVING | zone1-0000000102 | vagrant.vm | |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
5 rows in set (0.00 sec)
Chúng tôi quan tâm đến không gian phím ‘clustercontrol’. 401 (10.0.0.181) là bản chính và 402 (10.0.0.182) là bản sao.
Chúng tôi có thể thăng cấp 10.0.0.182 để trở thành một trang chủ mới. Công việc bắt đầu và chúng ta có thể thấy rằng tập lệnh của chúng ta đã được thực thi:
Cuối cùng, công việc đã hoàn thành:
Tất cả đều diễn ra tốt đẹp trong ClusterControl. Hãy xem Vitess:
mysql> SHOW vitess_tablets;
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| Cell | Keyspace | Shard | TabletType | State | Alias | Hostname | MasterTermStartTime |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
| zone1 | clustercontrol | 0 | MASTER | SERVING | zone1-0000000402 | vagrant.vm | 2021-07-09T13:38:00Z |
| zone1 | clustercontrol | 0 | REPLICA | SERVING | zone1-0000000401 | vagrant.vm | |
| zone1 | commerce | 0 | MASTER | SERVING | zone1-0000000100 | vagrant.vm | 2021-07-08T13:12:21Z |
| zone1 | commerce | 0 | REPLICA | SERVING | zone1-0000000101 | vagrant.vm | |
| zone1 | commerce | 0 | RDONLY | SERVING | zone1-0000000102 | vagrant.vm | |
+-------+----------------+-------+------------+---------+------------------+------------+----------------------+
5 rows in set (0.00 sec)
Như bạn thấy, ở đây tất cả đều ổn. 402 là bản chính mới và 401 được đánh dấu là bản sao.
Tất nhiên, đây chỉ là một ví dụ về cách bạn có thể hưởng lợi từ khả năng giám sát và quản lý cơ sở dữ liệu MySQL của ClusterControl trong khi vẫn có thể tận dụng khả năng của Vitess để mở rộng và chia nhỏ dữ liệu. Vitess là một công cụ tuyệt vời nhưng nó thiếu một vài yếu tố. May mắn thay, ClusterControl có thể hỗ trợ bạn trong những trường hợp đó.