Blog
Lập trình

Switching from PostgreSQL to ClickHouse for Improved Performance and Scalability

3 phut doc0 luot xem

KẾT LUẬN

Việc chuyển từ PostgreSQL sang ClickHouse đã giúp Momentic mở rộng hệ thống cache từ ~600.000 truy vấn/ngày lên hơn 2 triệu truy vấn/ngày với 20 tỷ bản ghi, duy trì độ trễ trung bình ~250ms — điều mà PostgreSQL không thể đáp ứng khi bảng cache tăng từ 80.000 lên 1 tỷ bản ghi do lock contention và resource usage tăng cao. Chiến lược di trú an toàn (dual-write song song, shadow query, diff kiểm tra tính đúng đắn, chuyển traffic dần dần, duy trì khả năng rollback) là yếu tố then chốt đảm bảo thành công của quá trình chuyển đổi.

LUẬN ĐIỂM CHÍNH

  • PostgreSQL gặp giới hạn hiệu năng nghiêm trọng với workload đọc-ghi cao và khối lượng dữ liệu lớn: lock contention và resource usage tăng đột biến khi bảng cache vượt ngưỡng 1 tỷ bản ghi, không thể duy trì sub-second latency.
  • ClickHouse sử dụng sparse primary index thay vì B-tree index, cho phép thu hẹp phạm vi tìm kiếm về một số granule khi biết giá trị khóa, giúp chi phí truy vấn không tăng tuyến tính theo kích thước dữ liệu — hiệu quả trong 90% trường hợp (feature branch).
  • Thiết kế primary key thông minh (test ID + step ID + version + git branch + commit timestamp) kết hợp materialized view để precompute commit timestamps giải quyết triệt để edge case của main branch vốn cần đọc gần như toàn bộ data parts.
  • Chuyển đổi từ mô hình SELECT+INSERT+UPDATE (3 truy vấn riêng biệt) sang mô hình INSERT-only với ReplacingMergeTree giúp đơn giản hóa kiến trúc, tăng hiệu năng và loại bỏ hoàn toàn lớp Redis vốn không còn giá trị do cardinality của cache key đã cao hơn.

LUẬN ĐIỂM PHỤ

  • Chiến lược di trú an toàn, từng bước: chạy ClickHouse song song PostgreSQL, dual-write vào cả hai hệ thống, shadow query ClickHouse và diff kết quả để xác minh tính đúng đắn trước khi chuyển traffic thật — duy trì dual-write một thời gian sau cutover để đảm bảo khả năng rollback nếu cần.
  • Materialized views trong ClickHouse được tận dụng để precompute available commit timestamps cho từng test ID, cho phép truy vấn nhảy thẳng đến đúng data part thay vì phải quét qua hàng loạt parts — giải quyết vấn đề spiky memory usage và disk operations trên main branch.

LUẬN CỨ & VÍ DỤ

  • Because of the high-write, high-read workload, we were running into both elevated resource usage as well as lock contention from queries trying to read and write to the cache concurrently, and as we increased the number of entries by several orders of magnitude, this only became worse — dẫn chứng trực tiếp từ đội ngũ Momentic về giới hạn của PostgreSQL khi scale.
  • Most queries were reading 1-2 data parts, but some outliers were reading almost all of the parts on every query, leading to spiky memory usage and disk operations — dẫn chứng về edge case main branch và động lực để áp dụng materialized views.
  • Instead we switched to using only INSERTS combined with ClickHouse ReplacingMergeTree: SELECT to get caches, re-INSERT caches that were used to extend TTL, INSERT new caches after test run, and let ClickHouse deduplicate entries asynchronously. This was such an improvement that we were able to fully eliminate the Redis layer — dẫn chứng về tối ưu hóa query pattern và loại bỏ Redis.

Nguồn: InfoQ | Phân tích bởi AI

Ban thay bai viet nay the nao?

Bình luận (0)

Bài viết liên quan

Gợi ý dựa trên điểm tương quan phân cấp và danh mục chung

Ngưỡng tương quan tối thiểu:30%
Tất cả (0%)Tương quan mạnh (70%+)

Không có bài viết nào đạt ngưỡng tương quan này. Hãy thử kéo thanh trượt sang trái.

--- Het ---