Chuông báo động lúc 2 giờ sáng: Nỗi ám ảnh mang tên Single Point of Failure
Nếu bạn từng bị dựng đầu dậy vì database sập, bạn sẽ hiểu cảm giác bất lực khi chờ hệ thống recover. Mình đã từng mất 20 phút quý giá chỉ để promote một node Standby của PostgreSQL lên làm Primary sau khi con server chính lăn đùng ra chết phần cứng. Trong 20 phút đó, tỷ lệ lỗi 5xx tăng vọt, sếp nhắn tin liên tục, còn mình thì tay run rẩy gõ lệnh cấu hình thủ công.
MySQL và PostgreSQL là những chuẩn mực lâu đời với độ tin cậy cực cao. Tuy nhiên, khi cần mở rộng quy mô (scaling) hoặc tự phục hồi (self-healing) ở mức hạ tầng, chúng thường trở thành nút thắt cổ chai. Việc thiết lập Master-Slave hay Sharding thủ công cực kỳ phức tạp và dễ sai sót. Đó chính là lúc mình tìm đến CockroachDB.
Đúng như tên gọi “Gián”, CockroachDB được thiết kế để sống sót trong những môi trường khắc nghiệt nhất. Đây là một SQL database phân tán, sử dụng chung giao thức với PostgreSQL nhưng sở hữu kiến trúc hiện đại hơn hẳn. Mọi node trong cụm đều bình đẳng. Khi một node gặp sự cố, hệ thống tự động điều phối lại công việc mà không cần bạn sửa bất kỳ dòng code ứng dụng nào.
Cài đặt CockroachDB trên Linux: Nhanh gọn và chuẩn bài
Hãy bắt đầu với một bản phân phối Linux như Ubuntu 22.04 để nắm chắc cách nó tương tác với OS trước khi chuyển sang Docker. Một lưu ý kỹ thuật cực quan trọng: CockroachDB rất nhạy cảm với độ lệch thời gian giữa các máy (clock skew). Hãy đảm bảo bạn đã cài chrony hoặc ntp để đồng bộ thời gian giữa các server.
Tải bản binary chính thức và đưa vào thư mục hệ thống:
curl https://binaries.cockroachdb.com/cockroach-v23.1.10.linux-amd64.tgz | tar -xz
sudo cp -i cockroach-v23.1.10.linux-amd64/cockroach /usr/local/bin/
Xác nhận cài đặt thành công bằng cách kiểm tra phiên bản:
cockroach version
Nếu terminal trả về thông số phiên bản, bạn đã xong bước chuẩn bị. Nhưng sức mạnh thực sự chỉ xuất hiện khi chúng ta kết nối các node lại với nhau.
Cấu hình Cluster 3 Node: Công thức cho uptime 99.99%
Trong môi trường production, 3 là con số tối thiểu. CockroachDB sử dụng thuật toán đồng thuận Raft để quản lý dữ liệu. Với 3 node, bạn có thể hy sinh hẳn 1 node (33% hệ thống) mà database vẫn hoạt động bình thường. Nếu chỉ có 2 node, khi một cái sập, cái còn lại sẽ rơi vào trạng thái “mất đa số” và ngừng nhận query để bảo vệ tính toàn vẹn dữ liệu.
Giả sử bạn có 3 server IP: 10.0.0.1, 10.0.0.2, 10.0.0.3. Để test nhanh luồng chạy, chúng ta sẽ dùng flag --insecure. Lưu ý: Tuyệt đối dùng SSL certificates khi deploy thực tế để bảo mật dữ liệu trên đường truyền.
Kích hoạt node đầu tiên:
cockroach start \
--insecure \
--store=node1 \
--listen-addr=10.0.0.1:26257 \
--http-addr=10.0.0.1:8080 \
--join=10.0.0.1:26257,10.0.0.2:26257,10.0.0.3:26257 \
--background
Lặp lại thao tác trên node 2 và 3 với IP tương ứng. Cuối cùng, chạy lệnh khởi tạo cụm (chỉ thực hiện một lần duy nhất trên bất kỳ node nào):
cockroach init --insecure --host=10.0.0.1:26257
CockroachDB không có khái niệm Master node. Bạn có thể trỏ ứng dụng vào bất kỳ IP nào trong cluster, nó sẽ tự biết cách định tuyến dữ liệu đến đúng nơi cần thiết. Để tối ưu, hãy đặt một con HAProxy phía trước để cân bằng tải cho các kết nối SQL.
Thử nghiệm thực tế: Khi lý thuyết đối mặt với ‘Kill -9’
Sau khi cluster ổn định, hãy truy cập Admin UI tại http://10.0.0.1:8080. Tại đây, bạn sẽ thấy các chỉ số quan trọng như QPS (Query Per Second) và P99 Latency. Đừng chỉ nhìn biểu đồ, hãy thử làm điều gì đó ‘điên rồ’ hơn.
Mình đã từng thử dùng kill -9 để ép chết tiến trình Cockroach trên một node ngay lúc đang chạy script ghi dữ liệu với cường độ 500 requests/giây. Kết quả rất ấn tượng: Hệ thống chỉ khựng lại khoảng 2-3 giây để bầu lại leader cho các vùng dữ liệu (ranges), sau đó tiếp tục ghi như chưa có chuyện gì xảy ra. Dữ liệu hoàn toàn khớp nhờ tính chất ACID nghiêm ngặt.
Thao tác SQL cực kỳ quen thuộc nếu bạn đã biết Postgres:
cockroach sql --insecure --host=10.0.0.1:26257
CREATE DATABASE itfromzero_prod;
USE itfromzero_prod;
CREATE TABLE users (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name STRING, created_at TIMESTAMP DEFAULT now());
INSERT INTO users (name) VALUES ('Engineer_A');
SELECT * FROM users;
Hầu hết các ORM phổ biến như TypeORM, Prisma hay SQLAlchemy đều kết nối mượt mà với CockroachDB. Bạn gần như không phải thay đổi tư duy lập trình SQL thông thường.
Lời kết: CockroachDB có phải là phương thuốc vạn năng?
Thẳng thắn mà nói, CockroachDB không phải lúc nào cũng là lựa chọn số một. Do cơ chế đồng thuận qua mạng, Write Latency (độ trễ ghi) của nó sẽ cao hơn vài mili giây so với một con PostgreSQL chạy đơn lẻ trên ổ NVMe. Nếu app của bạn cần tốc độ ghi cực nhanh trên một node duy nhất, hãy cân nhắc kỹ.
Tuy nhiên, nếu ưu tiên của bạn là hệ thống không bao giờ chết, kể cả khi cả một trung tâm dữ liệu gặp sự cố, CockroachDB chính là cứu cánh. Đừng đợi đến khi server sập mới cuống cuồng tìm giải pháp High Availability. Hãy xây dựng nền tảng vững chắc ngay từ đầu.

