Phân tích và xử lý lỗi kết nối Node
Khi triển khai cụm CockroachDB trong môi trường production, lỗi kết nối giữa các node là nguyên nhân phổ biến nhất gây downtime hoặc phân mảnh dữ liệu. Bạn cần biết cách đọc log và cấu hình firewall để xử lý nhanh.
Định dạng và đọc log lỗi kết nối
CockroachDB ghi log chi tiết vào thư mục `data` của node. Để xác định nguyên nhân node không join được vào cụm, hãy kiểm tra log của node bị lỗi.
Truy cập vào máy chủ bị lỗi, tìm file log mới nhất (thường là `cockroach.log` hoặc `cockroach.log.1`).
grep -i "failed to connect\|gossip\|TLS handshake\|connection refused" /var/lib/cockroach/cockroach-data/cockroach.log | tail -n 50
Kết quả mong đợi: Bạn thấy dòng log chỉ rõ IP bị từ chối hoặc lỗi chứng chỉ (certificate) không khớp. Ví dụ: "failed to connect to :9000: tls: failed to verify certificate".
Cấu hình Firewall (UFW) cho cổng CockroachDB
Ubuntu 24.04 mặc định bật UFW. CockroachDB cần mở 2 cổng: 26257 (Client SQL) và 9000 (Node-to-Node Gossip/Heartbeat). Nếu thiếu cổng 9000, các node sẽ không thấy nhau.
Thực hiện lệnh mở cổng trên TẤT CẢ các node trong cụm (bao gồm cả node mới và node hiện có).
sudo ufw allow 26257/tcp
sudo ufw allow 9000/tcp
sudo ufw status
Kết quả mong đợi: UFW trả về trạng thái "active" và hiển thị 2 dòng cho phép 26257 và 9000 trên giao diện TCP.
Reset trạng thái node bị treo (Stale Node)
Nếu một node cũ bị mất mạng lâu ngày, khi bật lại nó có thể giữ "view" cũ về cụm và bị coi là "stale" hoặc "out of range". Bạn cần reset trạng thái này.
Dừng service CockroachDB trên node bị lỗi, sau đó xóa thư mục data cũ (nếu không cần dữ liệu) hoặc chỉ reset metadata nếu muốn giữ dữ liệu (khuyến nghị xóa để join lại sạch sẽ).
sudo systemctl stop cockroach
rm -rf /var/lib/cockroach/cockroach-data/*
sudo systemctl start cockroach
Kết quả mong đợi: Service khởi động lại, log xuất hiện dòng "bootstrapping cluster" hoặc "joining cluster" thay vì lỗi "node is not part of the cluster".
Chiến lược mở rộng cụm (Scaling)
Việc thêm node mới vào cụm đang chạy (Online Scaling) là yêu cầu cốt lõi của kiến trúc phân tán. Quy trình này phải đảm bảo dữ liệu được rebalance tự động mà không làm gián đoạn dịch vụ.
Thêm Node mới vào cụm đang hoạt động
Để thêm node mới, bạn cần biết IP của ít nhất một node hiện có đang hoạt động để trỏ vào (join flag). Node mới sẽ tự động tải về chứng chỉ và đồng bộ dữ liệu.
Trên máy chủ mới (Node 4), cài đặt CockroachDB và khởi động với tham số `--join` trỏ đến IP của Node 1 (hoặc bất kỳ node nào đang up).
sudo systemctl start cockroach
# Hoặc nếu chạy bằng command trực tiếp lần đầu:
cockroach start --certs-dir=/var/lib/cockroach/cockroach-certs \
--host=0.0.0.0 \
--port=26257 \
--http-port=8080 \
--advertise-addr= \
--join=:9000
Kết quả mong đợi: Log xuất hiện dòng "started node with node ID 4" và sau vài giây xuất hiện "added to cluster".
Verify và Rebalance dữ liệu tự động
Sau khi node mới join, CockroachDB sẽ tự động kích hoạt cơ chế Rebalance. Dữ liệu (range) sẽ được di chuyển từ các node cũ sang node mới để phân bổ đều tải (load) và dung lượng (capacity).
Đang nhập vào CLI của bất kỳ node nào đang chạy để kiểm tra số lượng range trên từng node.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "SELECT node_id, count(*) FROM crdb_internal.ranges GROUP BY node_id;"
Kết quả mong đợi: Bảng trả về hiển thị Node mới (Node 4) có số lượng range tăng dần theo thời gian, và tổng số range trên tất cả các node xấp xỉ bằng nhau.
Tinh chỉnh Rebalance (Tùy chọn)
Nếu dữ liệu di chuyển quá chậm hoặc gây quá tải CPU cho node mới, bạn có thể điều chỉnh tốc độ di chuyển range (Replication Rate).
Giảm tốc độ copy dữ liệu để tránh làm chậm hệ thống khi thêm nhiều node cùng lúc.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "SET CLUSTER SETTING kv.rebalance.rate = '100 MB/s';"
Kết quả mong đợi: Lệnh chạy thành công "SET". Bạn có thể kiểm tra lại bằng `SHOW CLUSTER SETTING kv.rebalance.rate;`.
Xử lý tình huống mất Node (Node Failure)
Khi một node vật lý bị hỏng hoàn toàn (mất điện, hỏng ổ cứng, mất mạng vĩnh viễn), bạn cần loại bỏ nó khỏi cụm để tránh cảnh báo và đảm bảo tính sẵn sàng.
Xác định Node đã mất (Dead Node)
CockroachDB có cơ chế "dead node detection". Nếu một node không gửi heartbeat trong thời gian cấu hình (mặc định 30s), nó sẽ được đánh dấu là dead. Dữ liệu sẽ tự động được phục hồi từ các replica khác nếu số lượng replica còn lại đủ (quorum).
Kiểm tra trạng thái các node trong cụm.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "SELECT node_id, address, status, liveness_state FROM crdb_internal.node_liveness;"
Kết quả mong đợi: Node bị mất sẽ có trạng thái `status = 'DEAD'` hoặc `liveness_state = 'UNKNOWN'`.
Đưa Node vào chế độ Decommission
Trước khi xóa node khỏi hệ thống, bạn phải thực hiện lệnh `DECOMMISSION`. Lệnh này sẽ di chuyển toàn bộ dữ liệu (range) từ node sắp mất sang các node còn lại, sau đó đánh dấu node đó là "decommissioned".
Thực hiện lệnh này trên bất kỳ node nào còn hoạt động, thay thế `` bằng ID của node bị lỗi.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "ALTER SYSTEM DECOMMISSION ;"
Kết quả mong đợi: Lệnh trả về "ALTER SYSTEM". Sau vài phút, khi chạy lại lệnh chọn node, node đó sẽ có trạng thái `status = 'DECOMMISSIONED'`.
Xóa hoàn toàn Node khỏi cụm
Sau khi node đã ở trạng thái Decommissioned, bạn cần xóa nó khỏi danh sách cấu hình của cụm để hệ thống không còn cố gắng liên lạc với nó.
Sử dụng lệnh `REMOVE` trong SQL để xóa node khỏi metadata của cụm.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "ALTER SYSTEM REMOVE NODE ;"
Kết quả mong đợi: Lệnh chạy thành công. Khi kiểm tra lại `crdb_internal.node_liveness`, node đã mất sẽ không còn xuất hiện trong danh sách.
Cấu hình High Availability (HA) với Load Balancer
Để đảm bảo dịch vụ SQL luôn sẵn sàng ngay cả khi một node client bị lỗi, bạn cần đặt một Load Balancer (như HAProxy hoặc Nginx) ở phía trước cụm CockroachDB.
Cấu hình HAProxy cho SQL Traffic
HAProxy sẽ cân bằng tải các kết nối SQL (cổng 26257) đến tất cả các node trong cụm. CockroachDB hỗ trợ định tuyến query đến node gần nhất hoặc node ít tải nhất thông qua Load Balancer.
Cài đặt HAProxy trên một máy chủ riêng hoặc node bất kỳ.
sudo apt update
sudo apt install haproxy
Tạo file cấu hình `/etc/haproxy/haproxy.cfg` với nội dung dưới đây. Thay thế các IP bằng IP thực tế của các node CockroachDB.
global
log stdout format raw local0
maxconn 4096
daemon
defaults
log global
mode tcp
option tcplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend cockroachdb
bind *:26257
default_backend cockroachdb-servers
backend cockroachdb-servers
balance roundrobin
option ssl-hello-chk
server node1 192.168.1.10:26257 check
server node2 192.168.1.11:26257 check
server node3 192.168.1.12:26257 check
Kết quả mong đợi: Restart HAProxy bằng `sudo systemctl restart haproxy`. Client có thể kết nối vào IP của HAProxy cổng 26257 để truy cập database.
Verify HA với HAProxy
Kiểm tra xem HAProxy có đang cân bằng tải đúng không bằng cách quan sát file log hoặc stats.
watch -n 1 'grep "26257" /var/log/haproxy.log | tail -n 5'
Kết quả mong đợi: Log hiển thị các kết nối được phân phối đều đến node1, node2, node3. Nếu một node bị tắt, HAProxy sẽ tự động loại bỏ nó khỏi danh sách (nếu cấu hình `check` đúng) và không gửi request đến đó.
Mẹo tối ưu bảo mật và vận hành Production
Để vận hành CockroachDB ổn định trong môi trường production, cần áp dụng các biện pháp bảo mật và giám sát chặt chẽ.
Giới hạn tài nguyên (Resource Limit)
Tránh để CockroachDB chiếm hết RAM của máy chủ gây ra OOM Killer. Cần cấu hình giới hạn bộ nhớ trong file systemd.
Chỉnh sửa file service của CockroachDB để giới hạn RAM (ví dụ: 8GB trên máy 16GB).
sudo systemctl edit cockroach
Dán nội dung sau vào file tạm được mở:
[Service]
LimitNOFILE=100000
LimitMEMLOCK=500000
LimitAS=8589934592
Kết quả mong đợi: Reload systemd (`sudo systemctl daemon-reload`) và restart service. CockroachDB sẽ chạy giới hạn trong 8GB RAM, tránh làm sập hệ điều hành.
Cấu hình tự động mở rộng (Auto-Scaling) cho Replication
Trong môi trường production, bạn nên đảm bảo mức replication luôn đủ (mặc định là 3). Nếu bạn thêm nhiều node, CockroachDB tự tăng replication nếu cấu hình cho phép, nhưng an toàn nhất là đặt cứng hoặc dùng range zone.
Tạo một Range Zone cho database quan trọng để đảm bảo luôn có 3 replica trên 3 node khác nhau.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "CREATE ZONE CONFIGURATION my_db_zone FOR DATABASE my_production_db WITH OPTIONS ('replication.num_replicas' = '3', 'gc.ttlseconds' = '86400');"
Kết quả mong đợi: Lệnh chạy thành công. Dữ liệu trong `my_production_db` sẽ luôn được nhân bản trên 3 node, đảm bảo chịu được 2 node lỗi.
Cấu hình Audit Log cho bảo mật
Để ghi lại các hành động truy cập nhạy cảm (SELECT, UPDATE, DROP) vào log riêng biệt để audit.
Bật tính năng audit log và cấu hình lưu vào file.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "SET CLUSTER SETTING sql.audit.log.enabled = true;
SET CLUSTER SETTING sql.audit.log.path = '/var/log/cockroach/audit.log';"
Kết quả mong đợi: File `/var/log/cockroach/audit.log` được tạo và bắt đầu ghi lại các thao tác SQL quan trọng. Bạn có thể dùng `tail -f` để theo dõi.
Verify tổng thể hệ thống
Sau khi hoàn thành tất cả các bước, chạy lệnh kiểm tra sức khỏe tổng thể của cụm.
cockroach sql --certs-dir=/var/lib/cockroach/cockroach-certs -e "SHOW CLUSTER SETTING kv.rangefeed.enabled;
SELECT * FROM crdb_internal.cluster_settings WHERE name LIKE '%replication%';
SELECT count(*) FROM crdb_internal.ranges WHERE state != 'LEADER';"
Kết quả mong đợi: Không có cảnh báo về range không có leader, số lượng replica đúng như cấu hình, và các setting bảo mật đã được áp dụng.
Đ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 4: Quản lý dữ liệu và tối ưu hóa hiệu năng