1. Thiết kế và định nghĩa cấu trúc Shard trong VSchema
Bước đầu tiên là xác định chiến lược phân vùng dữ liệu (Sharding Strategy). Chúng ta sẽ sử dụng Range Sharding dựa trên user_id (kiểu BigInt). Điều này cho phép Vitess tự động phân bổ các range giá trị vào các Tablet khác nhau.
Chúng ta cần tạo file vschema.json để định nghĩa các bảng (Keyspace), các Shard, và quan trọng nhất là ánh xạ cột phân vùng (Sharding Column).
Tạo file cấu hình VSchema tại đường dẫn sau:
cat > /etc/vitess/vschema.json
File này định nghĩa Keyspace tên là commerce. Bảng users được cấu hình để sử dụng vindex user_id_vindex (loại hash) trên cột user_id. Bảng products hiện chưa có vindex nên sẽ nằm trong tất cả các Shard (unsharded table).
Kiểm tra tính hợp lệ của JSON:
python3 -m json.tool /etc/vitess/vschema.json > /dev/null && echo "VSchema JSON syntax: VALID" || echo "VSchema JSON syntax: INVALID"
Kết quả mong đợi: VSchema JSON syntax: VALID. Nếu có lỗi, hãy kiểm tra dấu phẩy hoặc ngoặc trong file.
2. Định nghĩa Schema SQL cho MySQL
Vitess yêu cầu định nghĩa Schema SQL rõ ràng tương ứng với VSchema. Bảng users phải có cột user_id với kiểu dữ liệu phù hợp (BigInt) để làm Sharding Key.
Tạo file schema.sql chứa lệnh tạo bảng:
cat > /etc/vitess/schema.sql
File này định nghĩa cấu trúc vật lý của dữ liệu. Lưu ý: Cột user_id trong bảng users phải trùng khớp với tên cột được khai báo trong vschema.json.
Để đảm bảo cú pháp SQL đúng chuẩn MySQL, hãy kiểm tra bằng cách chạy qua parser (nếu có mysql-client) hoặc chỉ cần kiểm tra file tồn tại:
ls -lh /etc/vitess/schema.sql
Kết quả mong đợi: File tồn tại với kích thước khoảng 400-500 bytes.
3. Cấu hình định nghĩa Shard và Cell trong VConfig
Trong kiến trúc Geo-distributed, chúng ta cần định nghĩa các Cell (vùng địa lý) và cách các Shard được phân bổ vào đó. Ở giai đoạn này, chúng ta sẽ mô phỏng cấu trúc bằng file cấu hình tĩnh hoặc thông qua Topology Server (etcd/consul). Tuy nhiên, để chuẩn bị cho Vitess, chúng ta cần xác định rõ các tham số này trong file cấu hình vconfig hoặc file topology giả lập.
Tạo file cấu hình định nghĩa Cell và Shard mapping tại /etc/vitess/vconfig.json:
cat > /etc/vitess/vconfig.json
File này mô tả kiến trúc 2 Cell: cell-us-east và cell-eu-west. Mỗi Cell chứa 1 Shard (0) và mỗi Shard có 1 Tablet (UID 100 và 200). Cấu trúc này là cơ sở để Vitess biết nên route request đến đâu dựa trên Cell.
Kiểm tra cấu trúc JSON:
python3 -m json.tool /etc/vitess/vconfig.json > /dev/null && echo "VConfig JSON syntax: VALID" || echo "VConfig JSON syntax: INVALID"
Kết quả mong đợi: VConfig JSON syntax: VALID.
4. Kiểm tra tính hợp lệ toàn bộ trước khi khởi động
Trước khi khởi động các thành phần Vitess (vttablet, vtgate, vtctld), chúng ta cần chạy lệnh kiểm tra toàn bộ bộ cấu hình để đảm bảo không có xung đột giữa VSchema và Schema SQL.
Sử dụng công cụ vtctl (hoặc vtcombo trong môi trường dev) để validate. Vì chưa chạy server, chúng ta sẽ dùng lệnh giả lập kiểm tra logic của VSchema:
mkdir -p /var/lib/vitess/backup && cp /etc/vitess/vschema.json /var/lib/vitess/backup/vschema_backup.json && echo "Backup schema created"
Để verify logic sharding key, hãy chạy lệnh kiểm tra xem VSchema có chứa đúng column vindex cho bảng users không:
grep -A 5 '"users"' /etc/vitess/vschema.json | grep -q '"column_vindexes"' && echo "Sharding key configuration: PRESENT" || echo "Sharding key configuration: MISSING"
Kết quả mong đợi: Sharding key configuration: PRESENT. Điều này xác nhận bảng users đã được cấu hình để phân vùng.
Khớp tên cột giữa VSchema và SQL:
grep '"column"' /etc/vitess/vschema.json | grep -o '"user_id"' && grep 'user_id' /etc/vitess/schema.sql | grep -q 'BIGINT' && echo "Schema column type: MATCHED" || echo "Schema column type: MISMATCH"
Kết quả mong đợi: Xuất hiện dòng "user_id" và thông báo Schema column type: MATCHED. Nếu không khớp, Vitess sẽ không thể khởi động hoặc phân vùng dữ liệu.
Kiểm tra quyền truy cập file (chmod) để đảm bảo người dùng vt (hoặc root tùy cài đặt) có thể đọc:
chmod 644 /etc/vitess/vschema.json /etc/vitess/schema.sql /etc/vitess/vconfig.json && ls -l /etc/vitess/*.json /etc/vitess/*.sql
Kết quả mong đợi: Các file có quyền đọc (r) cho tất cả người dùng (644).
5. Tổng kết cấu hình và chuẩn bị cho phần tiếp theo
Hiện tại, chúng ta đã hoàn tất việc định nghĩa:
- VSchema: Chứa logic phân vùng (Hash) cho bảng
users.
- Schema SQL: Chứa cấu trúc bảng vật lý tương ứng.
- VConfig: Định nghĩa sơ bộ các Cell và Shard mapping cho kiến trúc Geo-distributed.
Tất cả các file đã được tạo, kiểm tra cú pháp và quyền truy cập. Dữ liệu này sẽ được sử dụng trong Phần 3 để khởi động cụm Vitess đơn Cell (local mode) nhằm test tính năng phân vùng trước khi mở rộng ra nhiều Region.
Không cần thực hiện thêm bước nào ở giai đoạn này. Cấu hình đã sẵn sàng để được load bởi vttablet và vtgate.
Điều hướng series:
Mục lục: Series: Triển khai Database Geo-distributed với Vitess trên Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và cài đặt các thành phần nền tảng
Phần 3: Khởi động cụm Vitess đơn Cell với mode local để kiểm thử »