Xử lý lỗi Network Connectivity giữa các vùng (Cross-Region)
TiDB Multi-Cloud hoạt động dựa trên giao tiếp liên tục giữa các thành phần PD, TiKV và TiDB. Nếu firewall hoặc network policy chặn traffic giữa các region, cluster sẽ mất cân bằng hoặc treo.
Nguyên nhân phổ biến là các port mặc định (2379, 2380 cho PD; 20160, 20180 cho TiKV) bị chặn bởi Security Group hoặc Network Policy trong Kubernetes.
1. Kiểm tra kết nối giữa các Pod và Node
Thực hiện lệnh ping và telnet từ một Pod trong Region A đến Pod trong Region B để xác minh đường truyền vật lý và port.
Đầu tiên, vào Pod PD trong region 1 để test kết nối đến PD trong region 2.
kubectl exec -it tidb-pd-0 -n tidb -- ping -c 4 tidb-pd-1-peer -n tidb
Kết quả mong đợi: 4 packets transmitted, 4 packets received, 0% packet loss.
Tiếp theo, kiểm tra port 2380 (peer communication) giữa các node PD. Đây là port quan trọng nhất cho sự sống còn của Raft consensus.
kubectl exec -it tidb-pd-0 -n tidb -- nc -vz tidb-pd-1-peer -n tidb 2380
Kết quả mong đợi: Connection to tidb-pd-1-peer port 2380 [tcp/*] succeeded!
2. Cấu hình NetworkPolicy cho Cross-Region
Trong môi trường Kubernetes phân tán, bạn cần đảm bảo NetworkPolicy cho phép traffic giữa các namespace hoặc các cluster khác nhau nếu sử dụng Federation.
Tạo file cấu hình NetworkPolicy để mở port 2379, 2380, 20160, 20180 cho tất cả các pod trong cluster TiDB.
Đường dẫn file: /etc/tidb/networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tidb-cross-region-policy
namespace: tidb
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: tidb
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector: {}
ports:
- protocol: TCP
port: 2379
- protocol: TCP
port: 2380
- protocol: TCP
port: 20160
- protocol: TCP
port: 20180
egress:
- to:
- podSelector: {}
ports:
- protocol: TCP
port: 2379
- protocol: TCP
port: 2380
- protocol: TCP
port: 20160
- protocol: TCP
port: 20180
Áp dụng file này vào cluster:
kubectl apply -f /etc/tidb/networkpolicy.yaml
Kết quả mong đợi: networkpolicy.networking.k8s.io/tidb-cross-region-policy created
3. Xử lý lỗi "PD leader election timeout"
Thông báo lỗi này xuất hiện khi PD không thể giao tiếp với các follower để bầu leader, thường do network latency quá cao giữa các region.
Chạy lệnh để xem trạng thái leader và các member trong cluster PD.
kubectl exec -it tidb-pd-0 -n tidb -- pd-ctl cluster members
Kết quả mong đợi: Danh sách các member với trạng thái "healthy" và một member có trạng thái "leader".
Nếu thấy trạng thái "disconnected", hãy kiểm tra lại firewall trên OS Ubuntu (ufw) hoặc Cloud Security Group.
sudo ufw allow from 10.0.0.0/8 to any port 2379,2380,20160,20180
Kết quả mong đợi: Rule added và Rule added (v4).
Verify kết quả bằng cách chạy lại lệnh pd-ctl cluster members và đảm bảo không còn member nào ở trạng thái disconnected.
Phân tích log PD và TiKV để tìm nguyên nhân treo hoặc chậm
Khi hệ thống bị chậm hoặc treo, log là nguồn dữ liệu duy nhất để xác định bottleneck. TiDB sử dụng cấu trúc log JSON hoặc Text tùy cấu hình.
1. Thu thập và lọc log quan trọng
Đầu tiên, xác định Pod nào đang gặp sự cố bằng cách xem trạng thái resource và events.
kubectl get pods -n tidb -o wide | grep -E "TiKV|PD"
Kết quả mong đợi: Danh sách các pod TiKV và PD với IP và NodeName.
Lấy log của Pod TiKV bị lỗi (giả sử là tidb-tikv-0) và lọc từ khóa "slow", "panic", hoặc "leader lost".
kubectl logs -f tidb-tikv-0 -n tidb | grep -E "slow|panic|leader lost" --color=always
Kết quả mong đợi: Các dòng log màu đỏ hoặc màu vàng chỉ ra lỗi cụ thể.
2. Phân tích lỗi "Region not found" hoặc "Store unavailable"
Lỗi này thường xảy ra khi TiKV bị OOM (Out of Memory) hoặc bị Kubernetes kill do resource limit.
Để xác minh, hãy xem events của Node chứa TiKV đó.
kubectl describe node | grep -A 10 "tidb-tikv"
Kết quả mong đợi: Có thể thấy dòng "OOMKilled" hoặc "Evicted".
Nếu log PD hiện thông báo "store is unavailable", hãy kiểm tra xem TiKV có đang try to start lại không.
kubectl logs tidb-pd-0 -n tidb | grep "store.*unavailable" --color=always
Kết quả mong đợi: Log PD báo lỗi store bị mất kết nối.
3. Sử dụng TiDB Dashboard để phân tích performance
Dashboard tích hợp sẵn trong TiDB cung cấp view trực quan về slow query và resource usage.
Port 2379 của PD thường expose dashboard. Port mặc định là 2379, nhưng dashboard chạy ở 2379 hoặc 2380 tùy cấu hình. Thường là 2379.
Port-forward để truy cập dashboard từ local machine.
kubectl port-forward -n tidb svc/tidb-pd 2379:2379
Kết quả mong đợi: Forwarding from 127.0.0.1:2379 -> 2379
Mở trình duyệt truy cập http://localhost:2379/dashboard.
Trong tab "Slow Query", tìm các query có execution time > 1s.
Trong tab "Cluster", kiểm tra biểu đồ "Disk Usage" và "Memory Usage" của từng TiKV store.
Verify kết quả: Xác định được query gây chậm hoặc node TiKV bị full disk/memory.
Mẹo nâng cao: Tối ưu hóa Query, Cân bằng tải và Bảo mật TLS
Sau khi hệ thống ổn định, bước tiếp theo là tối ưu hiệu năng và bảo mật để đáp ứng yêu cầu production.
1. Tối ưu hóa Query với EXPLAIN và Index
Truy vấn chậm thường do thiếu index hoặc plan thực thi không tối ưu. TiDB sử dụng Cost-Based Optimizer (CBO).
Thực hiện lệnh EXPLAIN ANALYZE để xem chi tiết thực thi query.
mysql -h tidb-server -P 4000 -u root -p -e "EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123;"
Kết quả mong đợi: Table output hiện các bước như "IndexLookUp", "Selection", "Time: 0.05s".
Nếu thấy "TableFullScan", hãy tạo index cho cột lọc.
mysql -h tidb-server -P 4000 -u root -p -e "CREATE INDEX idx_user_id ON orders (user_id);"
Kết quả mong đợi: Query OK, 0 rows affected.
Chạy lại EXPLAIN để xác nhận plan đã chuyển sang "IndexRangeScan".
2. Cân bằng tải dữ liệu (Data Balancing) với PD
TiDB tự động cân bằng dữ liệu, nhưng trong môi trường Multi-Cloud, đôi khi cần can thiệp thủ công để đảm bảo dữ liệu phân bố đều giữa các vùng.
Truy cập vào PD để kiểm tra trạng thái cân bằng.
kubectl exec -it tidb-pd-0 -n tidb -- pd-ctl config schedule
Kết quả mong đợi: Hiển thị các thông số như "max-replicas", "max-merge-region-size", "max-snapshot-count".
Để tăng tốc độ cân bằng, tăng số snapshot đồng thời (cẩn thận với load mạng).
kubectl exec -it tidb-pd-0 -n tidb -- pd-ctl config schedule max-snapshot-count 10
Kết quả mong đợi: OK
Kiểm tra lại sự phân bố vùng (Region) giữa các Store (TiKV).
kubectl exec -it tidb-pd-0 -n tidb -- pd-ctl cluster store
Kết quả mong đợi: Các store có số lượng "leader" và "region" tương đối bằng nhau.
3. Cấu hình TLS cho bảo mật giao tiếp nội bộ
Trong môi trường Multi-Cloud, dữ liệu đi qua public internet hoặc VPC cross-region nên được mã hóa bằng TLS.
Đầu tiên, tạo self-signed certificate cho TiDB, PD và TiKV. Sử dụng OpenSSL trên Ubuntu.
Tạo thư mục chứa chứng chỉ.
mkdir -p /etc/tidb/tls && cd /etc/tidb/tls
Đường dẫn file cấu hình OpenSSL: /etc/tidb/tls/openssl.cnf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = tidb-cluster
[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = tidb-server
DNS.2 = tidb-pd
DNS.3 = tidb-tikv
Generate Private Key và Certificate.
openssl req -x509 -nodes -newkey rsa:2048 -keyout tidb.key -out tidb.crt -days 365 -config openssl.cnf
Kết quả mong đợi: Generating a RSA private key... và writing new self-signed certificate to tidb.crt.
Tạo Kubernetes Secret để lưu trữ chứng chỉ.
kubectl create secret generic tidb-tls-secret --from-file=ca.crt=tidb.crt --from-file=tidb.key=tidb.key --from-file=tidb.crt=tidb.crt -n tidb
Kết quả mong đợi: secret/tidb-tls-secret created
Cập nhật TiDB Cluster CR (Custom Resource) để enable TLS.
Đường dẫn file: /etc/tidb/tidbcluster-tls.yaml
apiVersion: pingcap.com/v1alpha1
kind: TiDBCluster
metadata:
name: tidb
namespace: tidb
spec:
tlsCluster:
enabled: true
caSecretName: tidb-tls-secret
clientSecretName: tidb-tls-secret
serverSecretName: tidb-tls-secret
Áp dụng cấu hình TLS.
kubectl apply -f /etc/tidb/tidbcluster-tls.yaml
Kết quả mong đợi: tidbcluster.pingcap.com/tidb configured
Verify kết quả bằng cách kiểm tra xem các pod có restart để load chứng chỉ mới và log có hiển thị "TLS enabled" hay không.
kubectl logs tidb-pd-0 -n tidb | grep "TLS"
Kết quả mong đợi: Log hiển thị thông báo thành công khi khởi động với TLS.
Điều hướng series:
Mục lục: Series: Triển khai Database Multi-Cloud với TiDB và Ubuntu 24.04
« Phần 6: Tối ưu hiệu năng và quản lý tài nguyên trong môi trường phân tán