Cấu hình bảo mật SSL/TLS và xác thực người dùng (Authentication)
Tạo chứng chỉ tự ký (Self-signed CA) cho Cluster
Bước này tạo chứng chỉ CA (Certificate Authority) và các chứng chỉ cụ thể cho node server cũng như client. CockroachDB yêu cầu SSL để bảo vệ dữ liệu khi truyền tải và xác thực danh tính node.
Mục đích: Tạo tập tin .pem để bảo vệ giao tiếp giữa các node và giữa client với server.
Kết quả mong đợi: Xuất hiện các file .pem trong thư mục đích, không có lỗi hiển thị trên terminal.
Thực thi lệnh tạo CA và chứng chỉ node (giả định IP node là 192.168.1.10):
mkdir -p /etc/cockroach/certs
cockroach cert create-ca --certs-dir=/etc/cockroach/certs --ca-key=/etc/cockroach/certs/ca.key
cockroach cert create-node --certs-dir=/etc/cockroach/certs --ca-key=/etc/cockroach/certs/ca.key --ips=192.168.1.10,127.0.0.1
Kiểm tra quyền sở hữu file chứng chỉ:
ls -l /etc/cockroach/certs/
Tạo chứng chỉ cho người dùng (User Certificates)
Tạo chứng chỉ riêng cho tài khoản admin để thực thi lệnh SQL an toàn qua giao thức SSL.
Mục đích: Cho phép xác thực dựa trên chứng chỉ (certificate-based authentication) thay vì chỉ dùng password.
Kết quả mong đợi: File chứng chỉ cho user 'admin' được tạo thành công.
cockroach cert create-client --certs-dir=/etc/cockroach/certs --ca-key=/etc/cockroach/certs/ca.key --ips=192.168.1.10 admin
Cấu hình Systemd để sử dụng SSL
Cập nhật file cấu hình systemd để CockroachDB khởi động với các tham số bảo mật SSL.
Mục đích: Đảm bảo khi service khởi động, nó tự động tìm và sử dụng chứng chỉ đã tạo.
Kết quả mong đợi: Service CockroachDB chạy với trạng thái "secure" trong logs.
Chỉnh sửa file `/etc/systemd/system/cockroach.service`. Tìm dòng `ExecStart` và thêm các cờ SSL:
sudo nano /etc/systemd/system/cockroach.service
Sửa dòng `ExecStart` thành nội dung sau (thay thế đường dẫn certs nếu cần):
ExecStart=/usr/local/bin/cockroach start --certs-dir=/etc/cockroach/certs --host=0.0.0.0 --port=26257 --http-port=8080
Tải lại cấu hình systemd và khởi động lại dịch vụ:
sudo systemctl daemon-reload
sudo systemctl restart cockroach
Verify kết quả bảo mật
Thử kết nối vào database với chứng chỉ client và kiểm tra trạng thái bảo mật.
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "SHOW CLUSTER SETTING cluster.ssl_mode;"
Kết quả mong đợi: Trả về giá trị "verify-full" hoặc "verify-ca".
Tích hợp CockroachDB với Prometheus và Grafana để giám sát
Kích hoạt endpoint metrics trong CockroachDB
Đảm bảo CockroachDB đang chạy với cổng HTTP (thường là 8080) để Prometheus có thể scrape dữ liệu.
Mục đích: Cung cấp dữ liệu raw metrics cho Prometheus thu thập.
Kết quả mong đợi: Truy cập được địa chỉ `http://:8080/_status/vars` bằng trình duyệt và thấy JSON metrics.
curl http://192.168.1.10:8080/_status/vars | jq . | head -n 20
Cấu hình Prometheus để thu thập metrics
Cài đặt Prometheus và cấu hình file `prometheus.yml` để định kỳ lấy dữ liệu từ CockroachDB.
Mục đích: Prometheus đóng vai trò lưu trữ và tính toán các chỉ số hiệu năng theo thời gian thực.
Kết quả mong đợi: Prometheus hiển thị target CockroachDB ở trạng thái "UP" trên giao diện web.
Cấu hình file `/etc/prometheus/prometheus.yml`:
sudo nano /etc/prometheus/prometheus.yml
Thêm nội dung sau vào phần `scrape_configs`:
scrape_configs:
- job_name: 'cockroachdb'
static_configs:
- targets: ['192.168.1.10:8080']
metrics_path: /_status/vars
relabel_configs:
- source_labels: [__name__]
regex: 'cockroach_.*'
action: keep
Khởi động lại Prometheus:
sudo systemctl restart prometheus
sudo systemctl status prometheus
Cấu hình Grafana để hiển thị Dashboard
Cài đặt Grafana và import dashboard mẫu dành riêng cho CockroachDB.
Mục đích: Trực quan hóa dữ liệu từ Prometheus thành các biểu đồ dễ đọc cho Sysadmin.
Kết quả mong đợi: Dashboard CockroachDB xuất hiện trên menu Grafana và hiển thị dữ liệu live.
Cài đặt Grafana (nếu chưa có):
sudo apt update
sudo apt install grafana -y
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
Truy cập `http://192.168.1.10:3000`, đăng nhập (mặc định admin/admin), vào Configuration -> Data Sources -> Add source -> Prometheus.
Hướng dẫn Import Dashboard:
- Vào menu "Dashboards" -> "Import".
- Nhập ID Dashboard: `1174` (CockroachDB Dashboard chính thức).
- Chọn Prometheus vừa cấu hình làm source data.
- Nhấn "Import".
Verify kết quả giám sát
Kiểm tra xem Prometheus có đang thu thập được metric quan trọng như số lượng request hay không.
curl http://192.168.1.10:9090/api/v1/query?query=cockroach_sql_statements_total
Kết quả mong đợi: Trả về JSON chứa giá trị số lớn hơn 0.
Xử lý các lỗi thường gặp: Node Down, Split-Brain, Disk Full
Xử lý lỗi Node Down (Node không phản hồi)
Khi một node trong cluster bị tắt hoặc mất kết nối mạng, CockroachDB sẽ đánh dấu nó là "dead" hoặc "draining".
Mục đích: Xác định nguyên nhân (mạng, CPU, hay crash) và khôi phục node đó về trạng thái healthy.
Kết quả mong đợi: Node trở lại trạng thái "live" và bắt đầu đồng bộ dữ liệu (rebalance).
Kiểm tra trạng thái các node:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "SELECT node_id, liveness, address FROM crdb_internal.cluster_nodes;"
Trên node bị lỗi, kiểm tra log để tìm nguyên nhân:
sudo journalctl -u cockroach -n 100 --no-pager
Nếu node đã khởi động lại, chờ hệ thống tự cân bằng. Nếu cần ép buộc, sử dụng lệnh:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "ALTER SYSTEM SET cluster.node_rebalance_interval = '5m';"
Xử lý Split-Brain (Chia tách Cluster)
Xảy ra khi mạng bị chia cắt, cluster bị chia thành 2 nhóm không liên lạc được, dẫn đến mất quorum (quyền đa số).
Mục đích: Đảm bảo chỉ có một nhóm duy nhất có quyền ghi (write) để tránh xung đột dữ liệu.
Kết quả mong đợi: Cluster trở về trạng thái ổn định, không có cảnh báo "unavailable" do mất quorum.
Kiểm tra trạng thái quorum:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "SELECT * FROM crdb_internal.ranges WHERE unavailable_ranges > 0;"
Nếu xảy ra split-brain, ưu tiên khôi phục kết nối mạng giữa các node. Nếu không thể, cần ép buộc nhóm chính (majority) hoạt động độc lập:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "ALTER SYSTEM SET cluster.zone_config_replication.num_replicas = 1;"
Chú ý: Chỉ thực hiện khi bạn chắc chắn về nhóm node nào là chính thống.
Xử lý lỗi Disk Full (Đĩa đầy)
Khi dung lượng đĩa của node vượt quá ngưỡng an toàn (thường là 80%), CockroachDB sẽ chuyển node sang chế độ "draining" và ngừng nhận dữ liệu mới.
Mục đích: Giải phóng dung lượng để node quay lại hoạt động bình thường.
Kết quả mong đợi: Node thoát khỏi trạng thái "draining" và bắt đầu nhận replica mới.
Kiểm tra dung lượng sử dụng của node:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "SELECT node_id, used_storage_bytes, total_storage_bytes FROM crdb_internal.node_storage_stats;"
Xóa các backup cũ hoặc log không cần thiết trên hệ thống:
sudo du -sh /var/log/cockroach*
sudo rm -rf /var/log/cockroach/*.log.old
Giảm ngưỡng cảnh báo tạm thời để cho phép node nhận dữ liệu (chỉ dùng trong khẩn cấp):
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "ALTER SYSTEM SET cluster.rangefeed.max_bytes_per_range = '10485760';"
Khuyến nghị: Thêm dung lượng đĩa hoặc mở rộng cluster là giải pháp lâu dài.
Các mẹo nâng cao: Backup/Restore và chuyển đổi Schema động
Thực thi Backup toàn bộ Cluster
Sử dụng lệnh BACKUP để lưu trữ toàn bộ dữ liệu vào một bucket S3 hoặc thư mục local.
Mục đích: Tạo điểm khôi phục (point-in-time recovery) để phòng chống mất dữ liệu thảm khốc.
Kết quả mong đợi: Xuất hiện thông báo "BACKUP completed" với thời gian thực hiện và kích thước dữ liệu.
Backup toàn bộ cluster vào thư mục local (yêu cầu node có quyền truy cập thư mục đó):
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "BACKUP testdb TO 'nodelocal://1/backup/full_backup' WITH CONSISTENCY AS OF SYSTEM TIME '2023-10-27 10:00:00';"
Backup chỉ định thời gian cụ thể:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "BACKUP testdb TO 'nodelocal://1/backup/point_in_time' WITH AS OF SYSTEM TIME '2023-10-27 12:30:00';"
Khôi phục dữ liệu từ Backup (Restore)
Sử dụng lệnh RESTORE để đưa dữ liệu về một database mới hoặc ghi đè database cũ.
Mục đích: Khôi phục dữ liệu sau sự cố hoặc di chuyển dữ liệu giữa các môi trường.
Kết quả mong đợi: Database mới được tạo với dữ liệu giống hệt thời điểm backup.
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "RESTORE testdb FROM 'nodelocal://1/backup/full_backup' WITH INTO DATABASE testdb_restored;"
Chuyển đổi Schema động (Online Schema Changes)
CockroachDB hỗ trợ thay đổi cấu trúc bảng (ADD COLUMN, DROP INDEX) mà không cần khóa bảng (lock) toàn bộ.
Mục đích: Cập nhật schema trong khi ứng dụng vẫn đang chạy, không gây gián đoạn dịch vụ.
Kết quả mong đợi: Lệnh ALTER TABLE thực thi thành công ngay lập tức, không bị treo (timeout).
Thêm cột mới vào bảng đang hoạt động:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "ALTER TABLE testdb.users ADD COLUMN last_login timestamp;"
Tạo chỉ số mới cho bảng lớn:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "CREATE INDEX idx_users_email ON testdb.users(email) WITH (split_by = 'hash', num_splits = 16);"
Verify kết quả nâng cao
Kiểm tra trạng thái các công việc (jobs) đang chạy trong hệ thống:
cockroach sql --certs-dir=/etc/cockroach/certs --user=admin -e "SELECT job_id, status, description FROM crdb_internal.jobs WHERE job_type IN ('BACKUP', 'RESTORE', 'SCHEMA_CHANGE') ORDER BY created_ts DESC LIMIT 5;"
Kết quả mong đợi: Bảng trả về hiển thị trạng thái "SUCCEEDED" cho các job đã hoàn thành.
Điều hướng series:
Mục lục: Series: Triển khai Database Row-Oriented với CockroachDB trên Ubuntu 24.04
« Phần 5: Triển khai cluster đa nút và cấu hình replication cho dữ liệu