Cấu hình tham số hệ thống Ubuntu để tối ưu I/O và mạng
Tối ưu hóa kernel của Ubuntu 24.04 là bước bắt buộc để giảm độ trễ mạng và tăng thông lượng I/O cho Spanner Local, đặc biệt khi chạy trên môi trường giả lập hoặc container.
Chúng ta cần điều chỉnh các tham số liên quan đến TCP window scaling, buffer size và file descriptors để xử lý hàng ngàn kết nối đồng thời mà không bị nghẽn cổ chai.
Điều chỉnh tham số mạng và I/O
Chỉnh sửa file cấu hình sysctl để tăng giới hạn buffer mạng và tối ưu hóa giao thức TCP cho lưu lượng lớn.
File cấu hình: /etc/sysctl.d/99-spanner-optimization.conf
cat > /etc/sysctl.d/99-spanner-optimization.conf
Áp dụng các thay đổi ngay lập tức bằng lệnh sysctl.
sysctl --system
Verify kết quả: Chạy lệnh sysctl -a | grep tcp_rmem để kiểm tra giá trị net.ipv4.tcp_rmem đã tăng lên 4096 87380 16777216.
Giới hạn Resource cho User
Spanner Local thường chạy dưới user root hoặc một user chuyên biệt, cần mở rộng giới hạn file descriptors (ulimit) để tránh lỗi "Too many open files" khi mở rộng quy mô.
Chỉnh sửa file /etc/security/limits.conf để tăng giới hạn soft và hard limit.
cat >> /etc/security/limits.conf
Khởi động lại session hoặc reboot server để áp dụng. Verify bằng lệnh ulimit -n trong terminal hiện tại (cần logout/login lại) để thấy giá trị 65536.
Chia tách Instance và Database để phân phối tải
Trong kiến trúc Spanner, Instance là đơn vị tài nguyên (vCPU, RAM) và Database là nơi chứa dữ liệu. Để mở rộng quy mô hiệu quả, không nên nhồi nhét nhiều Database nặng vào một Instance.
Chiến lược: Tạo nhiều Instance riêng biệt cho các nhóm workload khác nhau (ví dụ: Instance cho Transaction, Instance cho Analytics) để phân phối tải (Load Balancing) và tránh contention.
Tạo nhiều Instance với cấu hình tài nguyên khác nhau
Thực hiện tạo 2 Instance: một Instance nhỏ cho Dev/Test và một Instance lớn cho Production để phân tách tài nguyên.
Giả sử bạn đã cài đặt Spanner Local Emulator và đang chạy nó. Sử dụng gcloud (hoặc tương đương cho Local Emulator) để tạo instance.
gcloud spanner instances create dev-instance \
--project=your-project-id \
--region=us-central1 \
--config=spanner-config \
--display-name="Dev Instance" \
--nodes=1
gcloud spanner instances create prod-instance \
--project=your-project-id \
--region=us-central1 \
--config=spanner-config \
--display-name="Prod Instance" \
--nodes=3
Lưu ý: Khi chạy Spanner Local Emulator trên Ubuntu, bạn có thể cần cấu hình file spanner-local-config.json để giả lập nhiều instance logic, hoặc chạy nhiều instance emulator song song trên các port khác nhau nếu cần tách biệt vật lý.
Verify kết quả: Liệt kê danh sách instance bằng lệnh gcloud spanner instances list --project=your-project-id. Bạn sẽ thấy 2 instance với số node (nodes) khác nhau.
Phân bổ Database vào Instance tương ứng
Tạo Database mới và gán nó vào Instance cụ thể để kiểm soát tài nguyên.
gcloud spanner databases create dev-db \
--instance=dev-instance \
--database-dialect=GOOGLE_STANDARD_SQL \
--ddl="CREATE TABLE Users (Id INT64, Name STRING(100)) PRIMARY KEY (Id)"
gcloud spanner databases create prod-db \
--instance=prod-instance \
--database-dialect=GOOGLE_STANDARD_SQL \
--ddl="CREATE TABLE Transactions (Id INT64, Amount INT64, UserId INT64) PRIMARY KEY (Id)"
Verify kết quả: Chạy gcloud spanner databases list --instance=dev-instance và gcloud spanner databases list --instance=prod-instance để xác nhận Database đã được tạo đúng instance.
Sử dụng Spanner Partition Keys để giảm Contention
Contention xảy ra khi nhiều transaction cố gắng ghi vào cùng một key hoặc cùng một shard dữ liệu. Trong Spanner, việc sử dụng Partition Keys (trong các phiên bản mới hỗ trợ) hoặc thiết kế Schema thông minh giúp phân tán tải ghi (Write Skew).
Mục tiêu: Thiết kế Primary Key và Index để dữ liệu được phân tán đều trên các node của Spanner.
Thiết kế Schema với Partition Key
Tạo một bảng mới sử dụng Partition Key để chia nhỏ dữ liệu thành các nhóm logic, giúp Spanner tự động sharding hiệu quả hơn.
File DDL: /tmp/schema-optimization.sql
cat > /tmp/schema-optimization.sql
Áp dụng DDL vào Database đã tạo ở phần trước.
gcloud spanner databases update prod-db \
--instance=prod-instance \
--ddl=@/tmp/schema-optimization.sql
Verify kết quả: Chạy lệnh gcloud spanner databases describe prod-db --instance=prod-instance và kiểm tra phần "Schema" để thấy bảng EventLogs có cấu trúc Partition Key.
Test Load với Partition Key
Thực hiện chèn dữ liệu song song để quan sát sự khác biệt về hiệu năng khi có và không có Partition Key.
python3
Verify kết quả: Quan sát log của Spanner Local hoặc dashboard monitoring (nếu đã setup) để thấy thông lượng ghi (Write Throughput) ổn định và không bị tăng độ trễ đột ngột khi số lượng record tăng.
Cấu hình Backup và Restore cho dữ liệu Spanner Local
Dù là môi trường Local, việc cấu hình Backup tự động là cực kỳ quan trọng để đảm bảo tính sẵn sàng (High Availability) và khả năng phục hồi (Disaster Recovery).
Trong Spanner, Backup là điểm ảnh chụp (snapshot) ở một thời điểm cụ thể. Chúng ta sẽ cấu hình Backup Schedule và thực hiện Restore thủ công để kiểm tra.
Tạo Backup theo lịch trình (Backup Schedule)
Tạo một lịch trình backup tự động mỗi 24 giờ cho Database Production.
gcloud spanner backup-schedules create daily-backup \
--instance=prod-instance \
--database=prod-db \
--schedule="0 0 * * *" \
--retention-period="7d"
Verify kết quả: Chạy gcloud spanner backup-schedules list --instance=prod-instance để xem lịch trình đã được tạo với retention 7 ngày.
Tạo Backup thủ công và Restore
Tạo một backup ngay lập tức để test quy trình khôi phục.
gcloud spanner backups create backup-2024-05-20 \
--instance=prod-instance \
--database=prod-db \
--backup-location=us-central1
Thực hiện Restore dữ liệu từ Backup vào một Database mới (Restore to a new database là best practice).
gcloud spanner databases create restored-prod-db \
--instance=prod-instance \
--from-backup=backup-2024-05-20 \
--restore-to-time="2024-05-20T12:00:00Z"
Verify kết quả: Chạy gcloud spanner databases describe restored-prod-db --instance=prod-instance để kiểm tra trạng thái "READY" và xác minh dữ liệu bên trong bằng câu lệnh SELECT.
Giám sát hiệu năng bằng Prometheus và Grafana
Để tối ưu hóa liên tục, bạn cần có dashboard giám sát các chỉ số quan trọng như CPU, Memory, Latency (P99), và Throughput của Spanner Local.
Chúng ta sẽ cấu hình Prometheus để scrape metrics từ Spanner (thông qua exporter) và hiển thị trên Grafana.
Deploy Prometheus để scrape metrics
Giả sử Spanner Local đã expose metrics trên port 9090 (hoặc bạn cần chạy một Spanner Metrics Exporter). Dưới đây là cấu hình Prometheus để kết nối.
File cấu hình: /etc/prometheus/prometheus.yml
cat > /etc/prometheus/prometheus.yml
Khởi động lại Prometheus để áp dụng cấu hình mới.
systemctl restart prometheus
Verify kết quả: Truy cập http://localhost:9090/targets trên trình duyệt, bạn sẽ thấy trạng thái "UP" cho job 'spanner-local'.
Cấu hình Dashboard Grafana
Đưa Grafana lên và tạo Dashboard để xem trực quan.
apt update && apt install -y grafana
systemctl enable grafana-server
systemctl start grafana-server
Tạo datasource trong Grafana (thông qua UI hoặc config file /etc/grafana/provisioning/datasources/ds.yml).
cat > /etc/grafana/provisioning/datasources/ds.yml
Khởi động lại Grafana.
systemctl restart grafana-server
Verify kết quả: Truy cập http://localhost:3000, đăng nhập (admin/admin), vào "Connections" -> "Data Sources", xác nhận Prometheus đã kết nối. Sau đó import một dashboard mẫu cho Spanner (nếu có) hoặc tạo dashboard mới với các query như rate(spanner_requests_total[5m]).
Điều hướng series:
Mục lục: Series: Triển khai Database NewSQL với Google Spanner và Ubuntu 24.04
« Phần 4: Tích hợp ứng dụng Go và Python với Google Spanner
Phần 6: Xử lý sự cố, bảo mật và các mẹo nâng cao »