1. Yêu cầu phần cứng và Môi trường vận hành
Để chạy một cụm YugabyteDB (YB) ổn định trên môi trường Kubernetes, bạn cần đáp ứng các thông số phần cứng tối thiểu. YugabyteDB yêu cầu tài nguyên lớn hơn so với các database NoSQL thông thường do cơ chế đồng bộ dữ liệu và giao dịch ACID.
Yêu cầu tối thiểu cho mỗi Node (Master hoặc TServer):
- CPU: Tối thiểu 2 vCPU (Khuyến nghị 4 vCPU trở lên cho môi trường production).
- RAM: Tối thiểu 4GB (Khuyến nghị 8GB để tránh OOM Kill do JVM và RocksDB).
- Disk: SSD bắt buộc. Tối thiểu 20GB dung lượng trống cho dữ liệu và logs.
- OS: Linux (Ubuntu 20.04/22.04, CentOS 7/8, Debian 10/11).
Yêu cầu cho Kubernetes Cluster:
- Node Control Plane: 2 vCPU, 4GB RAM.
- Node Worker: 4 vCPU, 8GB RAM (để chạy 3 pods YugabyteDB: 1 Master, 2 TServer).
2. Cài đặt Docker Engine và Kubernetes (K3s)
Chúng ta sẽ sử dụng K3s thay vì Minikube cho môi trường này vì K3s được thiết kế nhẹ hơn, tối ưu cho production và edge computing, đồng thời tương thích tốt hơn với các script tự động hóa.
Bước 1: Cài đặt Docker Engine
Trước khi cài K3s, hãy đảm bảo Docker đã được cài đặt để quản lý container.
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Kiểm tra phiên bản Docker đã cài thành công:
docker --version
Kết quả mong đợi: Xuất hiện dòng phiên bản, ví dụ: Docker version 24.0.5.
Bước 2: Cài đặt K3s
Chạy lệnh cài đặt K3s phiên bản ổn định nhất. Lệnh này sẽ tự động cấu hình container runtime và khởi động cluster.
curl -sfL https://get.k3s.io | sh -
Chờ quá trình cài đặt hoàn tất. K3s sẽ tạo file config kubectl mặc định.
Bước 3: Cấu hình quyền truy cập kubectl
File cấu hình kubeconfig được tạo bởi K3s nằm ở đường dẫn cố định. Bạn cần copy file này vào thư mục home của user hiện tại để kubectl nhận diện.
mkdir -p $HOME/.kube
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kết quả mong đợi: Không có lỗi hiển thị, file config đã được chuyển quyền sở hữu cho user hiện tại.
Bước 4: Verify Kubernetes Cluster
Kiểm tra trạng thái các node trong cluster.
kubectl get nodes
Kết quả mong đợi: Hiển thị ít nhất 1 node với trạng thái Ready.
3. Cài đặt kubectl và Helm
Helm là package manager cho Kubernetes, cần thiết để deploy YugabyteDB từ Helm Chart chính thức.
Bước 1: Cài đặt kubectl (nếu chưa có sẵn)
Trong trường hợp K3s không tự động cài kubectl (hoặc trên các cluster khác), thực hiện lệnh sau:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
Verify kubectl:
kubectl version --client
Kết quả mong đợi: Hiển thị phiên bản Client.
Bước 2: Cài đặt Helm v3
Helm v3 là phiên bản hiện đại, không yêu cầu Tiller server. Sử dụng script chính thức để cài đặt.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash
Kiểm tra phiên bản Helm:
helm version
Kết quả mong đợi: Hiển thị phiên bản Helm v3.x.x.
Bước 3: Thêm repository YugabyteDB
Thêm chart repository chính thức của YugabyteDB vào Helm.
helm repo add yugabyte https://charts.yugabyte.com
helm repo update
Kết quả mong đợi: Hiển thị thông báo Hang on to your hats boys and girls! và cập nhật danh sách charts.
4. Tổng quan kiến trúc YugabyteDB
Trước khi deploy, cần hiểu rõ các thành phần để cấu hình đúng trong các phần sau.
1. Yugabyte Master:
Đây là thành phần quản lý metadata của cụm (cluster metadata). Nó chịu trách nhiệm quản lý vị trí của dữ liệu, phân vùng (tablet placement) và cân bằng tải (load balancing). Master không lưu trữ dữ liệu thực tế (row data). Trong Kubernetes, Master chạy dưới dạng StatefulSet.
2. Yugabyte TServer (Tablet Server):
Là thành phần thực thi chính. TServer lưu trữ dữ liệu thực tế (row data) dưới dạng RocksDB. Nó xử lý các request đọc/ghi từ ứng dụng. Mỗi TServer chứa nhiều Tablet (một phần của table được phân vùng). TServer cũng đóng vai trò là node của YSQL và YCQL.
3. YSQL (YSQL Server):
Là giao thức truy vấn tương thích với PostgreSQL. YSQL chạy như một tiến trình riêng biệt trên mỗi TServer, cho phép bạn sử dụng các công cụ PostgreSQL (psql, pgAdmin) để kết nối. Nó không lưu dữ liệu, chỉ dịch lệnh SQL thành giao thức YB-TServer.
4. YCQL (YCQL Server):
Là giao thức truy vấn tương thích với Cassandra. YCQL cũng chạy trên TServer, cho phép sử dụng CQL (Cassandra Query Language). Nó tương thích với các client Cassandra và công cụ như DataStax Studio.
Mô hình hoạt động:
- Ứng dụng kết nối vào YSQL/YCQL endpoint (port 5433/9042).
- YSQL/YCQL forward request đến TServer chứa dữ liệu.
- TServer đọc/ghi dữ liệu từ RocksDB local.
- Master quản lý metadata và điều phối các Tablet giữa các TServer.
5. Khái niệm Replication Factor và Placement Groups
Đây là hai khái niệm cốt lõi quyết định độ tin cậy và tính sẵn sàng của dữ liệu trong YugabyteDB.
1. Replication Factor (RF):
RF là số lượng bản sao (replica) của dữ liệu được lưu trữ trên các node khác nhau.
- RF = 1: Dữ liệu chỉ có 1 bản. Rủi ro mất dữ liệu nếu node đó hỏng.
- RF = 3: (Mặc định khuyến nghị). Dữ liệu có 3 bản sao trên 3 node khác nhau. Cho phép mất 1 node mà vẫn đảm bảo tính sẵn sàng (High Availability) và tính nhất quán (Consistency).
Trong YugabyteDB, RF được cấu hình tại mức Table hoặc Keyspace. Khi một node chết, hệ thống tự động tạo lại replica trên node mới để duy trì RF.
2. Placement Groups (PG):
YugabyteDB sử dụng mô hình "Placement Group" để quản lý các replica.
- Một Tablet (phân vùng dữ liệu) thuộc về một Placement Group.
- Một Placement Group bao gồm tập hợp các replica của Tablet đó.
- YugabyteDB đảm bảo các replica trong cùng một PG được phân tán trên các Rack hoặc Availability Zone khác nhau (nếu được cấu hình) để tránh điểm chết duy nhất (Single Point of Failure).
Khi bạn tạo một Keyspace với RF=3, hệ thống sẽ tự động tạo một PG cho mỗi Tablet, đảm bảo 3 replica nằm trên 3 TServer khác nhau.
Tổng kết kiến thức nền tảng:
Bạn đã hiểu rõ:
- Phân bổ tài nguyên CPU/RAM cho Node.
- Cách thiết lập môi trường K3s và Helm.
- Vai trò của Master (Metadata) và TServer (Data).
- Cách dữ liệu được nhân bản (RF) và phân tán (PG).
Sẵn sàng cho phần tiếp theo: Triển khai cụm YugabyteDB trên Kubernetes bằng Helm.
Điều hướng series:
Mục lục: Series: Xây dựng hệ thống Database phân tán với YugabyteDB và Kubernetes
Phần 2: Triển khai cụm YugabyteDB trên Kubernetes bằng Helm »