Cấu hình Database đa vùng (Multi-Region) và Schema
Bước đầu tiên để xây dựng hệ thống phân tán là thiết lập Database với mô hình địa lý (geo-distributed). Chúng ta sẽ tạo một database có khả năng tự động phân phối dữ liệu sang các vùng (region) khác nhau dựa trên yêu cầu.
Mục đích: Tạo database global và định nghĩa các vùng (regions) để CockroachDB tự động phân vùng dữ liệu (zone placement).
Trước khi tạo, đảm bảo bạn đã kết nối vào cluster qua cockroach sql với quyền admin.
cockroach sql --insecure -e "CREATE DATABASE global_db WITH REGIONAL BY ROW DEFAULT REGION 'us-east-1';"
Kết quả mong đợi: Database global_db được tạo thành công với vùng mặc định là us-east-1. Nếu cluster đã có các vùng khác được cấu hình, dữ liệu mới sẽ tự động được nhân bản sang các vùng đó.
Tiếp theo, tạo bảng với cấu trúc phù hợp cho việc phân vùng theo vùng (region-aware). Cột region đóng vai trò là key để xác định vị trí lưu trữ chính của dữ liệu.
CREATE TABLE global_db.users (
id INT PRIMARY KEY,
region TEXT,
username TEXT NOT NULL,
email TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
) WITH REGIONAL BY ROW;
Kết quả mong đợi: Bảng users được tạo. CockroachDB sẽ tự động lưu trữ các hàng (row) có giá trị region khác nhau vào các node thuộc vùng tương ứng.
Thêm dữ liệu mẫu để kiểm tra sự phân phối tự động. Chèn dữ liệu vào các vùng khác nhau.
INSERT INTO global_db.users (id, region, username, email) VALUES
(1, 'us-east-1', 'user_east', 'east@example.com'),
(2, 'eu-west-1', 'user_west', 'west@example.com'),
(3, 'ap-south-1', 'user_south', 'south@example.com');
Kết quả mong đợi: 3 dòng dữ liệu được chèn thành công. Dữ liệu của mỗi user sẽ được lưu trữ chủ yếu trên node thuộc vùng tương ứng của họ.
Verify kết quả
Truy vấn để xem dữ liệu phân bố như thế nào và kiểm tra vùng lưu trữ của mỗi hàng.
SELECT id, region, crdb_region FROM global_db.users;
Kết quả: Cột crdb_region sẽ hiển thị vùng nơi dữ liệu đang được lưu trữ chính (leader). Nếu cấu hình đúng, crdb_region sẽ trùng khớp với cột region.
Cấu hình Zone Configuration và Replication Factor
Sau khi có schema, chúng ta cần cấu hình chính sách nhân bản (replication) cụ thể cho từng database hoặc bảng để đảm bảo tính sẵn sàng cao (High Availability) và an toàn dữ liệu.
Mục đích: Áp dụng Zone Configuration để đặt replication_factor = 3 và yêu cầu dữ liệu phải nằm trên ít nhất 3 node khác nhau (constrain).
Trước tiên, kiểm tra zone mặc định hiện hành.
SHOW ZONE CONFIGURATION FOR DATABASE global_db;
Kết quả mong đợi: Hiển thị cấu hình mặc định, thường là replication_factor: 3 nhưng có thể không có các ràng buộc (constraints) cụ thể về node hay region.
Để tối ưu cho môi trường sản xuất, chúng ta sẽ tạo một file cấu hình zone YAML để đảm bảo dữ liệu được phân tán trên các node khác nhau và các rack khác nhau (nếu có).
Tạo file cấu hình tại đường dẫn: /etc/cockroachdb/zone_global_db.yaml
cat > /etc/cockroachdb/zone_global_db.yaml
Kết quả mong đợi: File YAML được tạo thành công. Nội dung yêu cầu 3 bản sao, mỗi bản sao nằm ở một data center (dc) khác nhau.
Áp dụng cấu hình này vào database global_db thông qua lệnh SQL.
ALTER DATABASE global_db CONFIGURE ZONE USING
'num_replicas' = 3,
'constraints' = '{"dc=us-east-1","dc=eu-west-1","dc=ap-south-1"}',
'lease_preferences' = '{"dc=us-east-1","dc=eu-west-1"}';
Kết quả mong đợi: Lệnh ALTER DATABASE hoàn thành. CockroachDB sẽ bắt đầu di chuyển các replica (rebalance) để tuân thủ các ràng buộc mới. Quá trình này có thể mất vài phút.
Để áp dụng cho một bảng cụ thể với yêu cầu bảo mật cao hơn (ví dụ: bảng chứa dữ liệu nhạy cảm), ta dùng lệnh tương tự.
ALTER TABLE global_db.users CONFIGURE ZONE USING
'num_replicas' = 3,
'constraints' = '{"dc=us-east-1","dc=eu-west-1","dc=ap-south-1"}';
Kết quả mong đợi: Bảng users sẽ ưu tiên tuân thủ chính sách nhân bản mới.
Verify kết quả
Kiểm tra trạng thái cân bằng (rebalance) và xem số lượng replica thực tế.
SELECT database_name, table_name, num_replicas, lease_holder FROM crdb_internal.ranges WHERE database_name = 'global_db';
Kết quả: Cột num_replicas phải bằng 3 cho tất cả các range của bảng users. Cột lease_holder sẽ hiển thị node đang giữ quyền write.
Đợi một chút và kiểm tra lại để đảm bảo cluster đã phân phối lại dữ liệu đúng theo constraints.
SHOW ZONE CONFIGURATION FOR TABLE global_db.users;
Kết quả: Xuất ra cấu hình đã áp dụng với num_replicas: 3 và danh sách constraints đầy đủ.
Tối ưu hóa tham số bảo mật và hiệu năng
Việc cân bằng giữa bảo mật và hiệu năng là yếu tố sống còn. Chúng ta sẽ điều chỉnh các tham số server-side và session-level để phù hợp với workload thực tế.
Mục đích: Tối ưu hóa SQL Statement Budget và giới hạn tài nguyên để tránh các truy vấn nặng gây tê liệt cluster.
Cấu hình giới hạn thời gian thực thi query để ngăn chặn các lệnh SQL không tối ưu chạy quá lâu.
SET LOCAL max_execution_time = '30s';
Kết quả mong đợi: Session hiện tại sẽ tự động hủy các query chạy quá 30 giây. Đây là bảo vệ cơ bản trước các query "leaky".
Cấu hình statement_budget để giới hạn lượng CPU và I/O mà một transaction có thể sử dụng.
SET LOCAL max_execution_memory = '512MB';
Kết quả mong đợi: Giới hạn bộ nhớ cho các phép tính hash hoặc sort trong một query, ngăn ngừa OOM (Out of Memory) trên node.
Điều chỉnh tham số max_concurrent_queries tại mức hệ thống để kiểm soát tải. Thực hiện bằng cách chỉnh sửa file cấu hình cockroach.yaml hoặc set biến môi trường.
Chỉnh sửa file: /etc/cockroachdb/cockroach.yaml (hoặc file cấu hình bạn đang dùng).
cat > /etc/cockroachdb/cockroach.yaml
Kết quả mong đợi: File cấu hình được cập nhật. Cần restart node để áp dụng: sudo systemctl restart cockroach.
Tối ưu hóa bảo mật: Bật tính năng SQL Audit Logging để ghi lại tất cả các lệnh truy vấn nhạy cảm (SELECT, INSERT, UPDATE, DELETE) vào file log.
ALTER CLUSTER SET CLUSTER SETTING sql.audit.log.enabled = true;
Kết quả mong đợi: Hệ thống bắt đầu ghi log audit vào file audit.log tại thư mục dữ liệu của node (thường là /var/lib/cockroach/audit).
Tối ưu hóa hiệu năng cho Read-heavy workload: Tăng cường cache cho KV layer bằng cách điều chỉnh cache_size.
ALTER CLUSTER SET CLUSTER SETTING kv.transaction.max_retry_count = 50;
Kết quả mong đợi: Tăng khả năng chịu lỗi và tự động retry cho các giao dịch bị xung đột, cải thiện throughput trong môi trường có nhiều write đồng thời.
Verify kết quả
Kiểm tra các tham số cluster đã được áp dụng.
SHOW CLUSTER SETTING sql.audit.log.enabled;
Kết quả: Giá trị phải là true.
Kiểm tra log audit để đảm bảo hoạt động.
grep "SELECT" /var/lib/cockroach/audit/audit.log | tail -n 5
Kết quả: Xuất hiện các dòng log chứa thông tin về user, timestamp và lệnh SQL đã thực thi.
Thực hiện Backup và Restore với S3
Backup là biện pháp cuối cùng để đảm bảo an toàn dữ liệu. CockroachDB hỗ trợ backup incremental tự động vào các đối tượng lưu trữ như S3, GCS, hoặc Azure Blob.
Mục đích: Thiết lập Backup đầy đủ (full) và Incremental định kỳ vào bucket S3.
Trước tiên, tạo bucket S3 và cấu hình quyền truy cập. Giả sử bucket tên là cockroach-backups và bạn đã có AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY.
Thực hiện lệnh backup toàn bộ database global_db vào S3.
BACKUP global_db TO 'aws://cockroach-backups/global_db' WITH aws_s3_access_key_id = 'YOUR_ACCESS_KEY', aws_s3_secret_access_key = 'YOUR_SECRET_KEY', aws_s3_region = 'us-east-1', aws_s3_bucket_region = 'us-east-1';
Kết quả mong đợi: Lệnh chạy thành công và hiển thị job_id cùng thời gian hoàn thành. Dữ liệu sẽ được nén và chia nhỏ thành nhiều file trong bucket S3.
Tạo lịch backup tự động (Schedule) để thực hiện backup incremental hàng ngày vào lúc 2 AM.
CREATE SCHEDULE daily_backup FOR BACKUP global_db TO 'aws://cockroach-backups/global_db' WITH aws_s3_access_key_id = 'YOUR_ACCESS_KEY', aws_s3_secret_access_key = 'YOUR_SECRET_KEY', aws_s3_region = 'us-east-1', aws_s3_bucket_region = 'us-east-1' SCHEDULE '0 2 * * *';
Kết quả mong đợi: Lịch backup được tạo. CockroachDB sẽ tự động chạy job backup vào đúng giờ quy định mà không cần can thiệp thủ công.
Thực hiện lệnh Restore từ backup để kiểm chứng. Lưu ý: Restore sẽ tạo một database mới, không ghi đè lên database đang chạy (trừ khi dùng AS).
RESTORE global_db FROM 'aws://cockroach-backups/global_db' WITH aws_s3_access_key_id = 'YOUR_ACCESS_KEY', aws_s3_secret_access_key = 'YOUR_SECRET_KEY', aws_s3_region = 'us-east-1', aws_s3_bucket_region = 'us-east-1' AS global_db_restored;
Kết quả mong đợi: Database global_db_restored được tạo với dữ liệu giống hệt thời điểm backup.
Khôi phục đến một thời điểm cụ thể (Point-in-time recovery) trong trường hợp dữ liệu bị xóa nhầm.
RESTORE global_db FROM 'aws://cockroach-backups/global_db' WITH aws_s3_access_key_id = 'YOUR_ACCESS_KEY', aws_s3_secret_access_key = 'YOUR_SECRET_KEY', aws_s3_region = 'us-east-1', aws_s3_bucket_region = 'us-east-1' AS global_db_restored_pitr WITH OPTIONS ('revision_timestamp' = '2023-10-27 02:00:00');
Kết quả mong đợi: Database được khôi phục với trạng thái dữ liệu đúng vào thời điểm 2023-10-27 02:00:00.
Verify kết quả
Kiểm tra trạng thái của các job backup đã chạy.
SHOW BACKUP JOB FOR global_db;
Kết quả: Hiển thị danh sách các job backup, thời gian chạy, và trạng thái (succeeded/failed).
Kiểm tra dữ liệu trong database đã restore.
SELECT COUNT(*) FROM global_db_restored.users;
Kết quả: Số lượng dòng phải khớp với số lượng dòng tại thời điểm backup ban đầu.
Giám sát hiệu năng cụm qua Dashboard
Quản trị viên cần giám sát liên tục để phát hiện sớm các vấn đề về hiệu năng hoặc lỗi. CockroachDB cung cấp Dashboard tích hợp (UI) rất mạnh mẽ.
Mục đích: Truy cập Dashboard, theo dõi các chỉ số quan trọng (metrics) và cấu hình cảnh báo (alerting).
Truy cập giao diện web của CockroachDB. Địa mặc định là http://:8080.
Mở trình duyệt và nhập địa chỉ:
curl -s http://10.0.0.1:8080 | grep -o "cockroach-ui"
Kết quả mong đợi: Nếu cluster chạy insecure, bạn có thể truy cập trực tiếp. Nếu có SSL, cần dùng https. Giao diện Dashboard sẽ hiển thị trang chủ với tổng quan cluster.
Trong Dashboard, vào mục Nodes để kiểm tra sức khỏe từng node.
Chỉ số quan trọng cần theo dõi:
- Heartbeats: Số lần giao tiếp giữa node và coordinator.
- Range Count: Số lượng range dữ liệu trên mỗi node (cần cân bằng).
- GC Bytes: Lượng dữ liệu đã bị xóa bởi Garbage Collector.
Để giám sát hiệu năng query, vào mục SQL -> Statements.
Kiểm tra các query chạy chậm nhất (slowest queries).
SELECT query, mean_latency, max_latency FROM crdb_internal.node_statement_statistics LIMIT 5;
Kết quả mong đợi: Danh sách 5 query có độ trễ (latency) cao nhất. Nếu mean_latency > 1s, cần tối ưu hóa index hoặc query.
Cấu hình cảnh báo (Alerting) bằng cách tạo rule cảnh báo khi CPU hoặc RAM vượt quá 80%.
Trong Dashboard, vào Settings -> Alerts. Tạo rule mới với điều kiện:
CREATE ALERT cpu_high ON cpu_percent > 80 FOR 5m;
Kết quả mong đợi: Rule cảnh báo được tạo. Khi CPU > 80% trong 5 phút liên tục, hệ thống sẽ báo động (có thể tích hợp với email hoặc Slack nếu cấu hình webhook).
Giám sát lưu lượng mạng và I/O disk.
SELECT node_id, sum(traffic_bytes_received), sum(traffic_bytes_sent) FROM crdb_internal.node_metrics WHERE metric_name = 'network_traffic' GROUP BY node_id;
Kết quả: Hiển thị tổng lượng dữ liệu vào/ra của mỗi node. Nếu một node có traffic quá cao so với các node khác, có thể do dữ liệu chưa được phân bổ đều (hotspot).
Verify kết quả
Xác nhận Dashboard hoạt động và có dữ liệu thời gian thực.
SELECT count(*) FROM crdb_internal.node_status;
Kết quả: Số lượng phải bằng tổng số node trong cluster đang online.
Truy vấn trực tiếp các metric để kiểm tra tính chính xác.
SELECT metric_name, value FROM crdb_internal.node_metrics WHERE metric_name = 'replica_count' LIMIT 3;
Kết quả: Giá trị replica_count phải khớp với tổng số replica đang hoạt động trong cluster.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán an toàn với CockroachDB và Ubuntu 24.04
« Phần 3: Cấu hình bảo mật nâng cao và quản lý chứng chỉ
Phần 5: Xử lý sự cố, mở rộng cụm và các mẹo nâng cao »