+1

Khuyến nghị về số lượng node và vai trò của từng node trong Elasticsearch

Trong bài trước, mình đã chia sẻ về các vai trò (role) của các node trong cụm cluster Elasticsearch. Hôm nay, mình muốn chia sẻ một số kinh nghiệm cá nhân về phương án tối ưu cluster Elasticsearch của bạn thông qua việc cấu hình số lượng node và vai trò của chúng.

Số lượng node nên có trong cluster

Một câu hỏi rõ ràng mình thường gặp khi triển khai ElasticSearch là: "Cần bao nhiêu node trong cluster Elasticsearch?" "Cấu hình bao nhiêu thì tối ưu?" "Hay làm thế nào để tối ưu chi phí hệ thống khi sử dụng Elastic search" ... Thành thật mà nói, mình không có câu trả lời cho câu hỏi này.

Câu trả lời hoàn toàn phụ thuộc vào quy mô dữ liệu và yêu cầu hiệu suất của hệ thống.

Mình chỉ có thể gợi ý một số mô hình để các bạn tham khảo:

  1. Cluster nhỏ (1-3 node):

    • Nếu bạn chỉ chạy một cluster nhỏ để phát triển hoặc kiểm thử, bạn có thể bắt đầu với 1-3 node. Trong trường hợp này, tất cả các node có thể đảm nhận vai trò "master", "data", và "ingest".
    • Tuy nhiên, cần lưu ý rằng nếu bạn chỉ có một node, bạn sẽ mất khả năng chịu lỗi (fault tolerance).
  2. Cluster vừa (4-10 node):

    Mình khuyên bạn nên tách riêng các vai trò của node.

    • Master node: Tối thiểu có 3 node đảm nhận vai trò master để đảm bảo tính ổn định khi xảy ra sự cố.
    • Data node: Số lượng data node tùy thuộc vào khối lượng dữ liệu của bạn. Mình thường dùng khoảng 60-70% tổng số node làm data node.
    • Ingest node: Nếu bạn có nhiều xử lý trước khi index (ví dụ như pipeline xử lý dữ liệu), hãy thêm 1-2 ingest node.
  3. Cluster lớn (>10 node):

    Khi hệ thống lớn, mình thường thiết kế cluster với các vai trò chuyên biệt:

    • Master node: Luôn giữ 3 node chuyên biệt cho vai trò này. Không nên để chúng kiêm nhiệm vai trò khác.
    • Data node: Số lượng data node chiếm phần lớn, vì đây là nơi lưu trữ dữ liệu chính.
    • Ingest node: Tăng số lượng ingest node nếu bạn xử lý khối lượng lớn pipeline ingest.
    • Machine learning node: Nếu bạn sử dụng các tính năng machine learning của Elasticsearch, hãy bổ sung các node chuyên biệt cho vai trò này.
    • Coordinating node: Đối với các cluster rất lớn, mình khuyên nên có các coordinating node để xử lý truy vấn và phân phối yêu cầu.

Chiến lược tăng node

Một cluster Elasticsearch cần được mở rộng đúng thời điểm và theo chiến lược cụ thể để đáp ứng nhu cầu sử dụng ngày càng tăng:

  1. Khi nào nên tăng node?
  • Tăng lượng dữ liệu: Khi dữ liệu lưu trữ bắt đầu chiếm hơn 80% dung lượng của các data node.
  • Hiệu suất giảm: Khi thời gian phản hồi truy vấn (query latency) tăng đáng kể hoặc pipeline ingest không xử lý kịp.
  • Tăng người dùng: Khi số lượng người dùng hoặc lượng truy vấn đồng thời tăng lên đáng kể.
  • Sử dụng CPU/RAM cao: Nếu các node hiện tại thường xuyên sử dụng trên 75% CPU hoặc RAM.
  1. Tăng node cho vai trò nào?
  • Master node: Chỉ cần 3 node và không tăng thêm trừ khi cluster quá lớn (hàng trăm node).
  • Data node: Đây là vai trò cần được tăng đầu tiên khi dữ liệu hoặc truy vấn tăng.
  • Ingest node: Tăng số lượng ingest node nếu pipeline xử lý dữ liệu quá tải.
  1. Cách tăng node hiệu quả
  • Phân bổ shard hợp lý: Khi thêm data node, đảm bảo các shard được phân bổ lại để tận dụng tối đa tài nguyên.
  • Kiểm tra cấu hình heap: Đảm bảo bộ nhớ heap (heap size) được cấu hình đúng trên các node mới.
  • Giám sát hiệu suất: Sử dụng các công cụ giám sát như Elastic Monitoring để theo dõi hiệu quả của cluster sau khi mở rộng, như Cerebro, Grafana + Prometheus, hay New Relic....

Mình có note một số link tham khảo dưới cuối bài, các bạn cùng đọc nhé.

Một số lưu ý quan trọng

  • Không để tất cả các node làm master và data: Mình đã thấy nhiều trường hợp các cluster nhỏ cho phép tất cả các node kiêm nhiệm cả vai trò master và data để tiết kiệm tài nguyên. Tuy nhiên, điều này dễ dẫn đến tình trạng quá tải trên master node, ảnh hưởng đến khả năng quản lý cluster.

  • Heap memory: Dung lượng heap tối đa nên được giới hạn ở mức 50% RAM vật lý, với tối đa là 32GB. Heap quá lớn có thể gây ra thời gian dọn dẹp (GC) dài, làm chậm hệ thống.

  • Split-brain: Để tránh tình trạng "split-brain" (khi cluster bị phân tách), luôn cấu hình tối thiểu 3 master node và thiết lập discovery.zen.minimum_master_nodes.

  • Snapshot và backup: Luôn cấu hình cơ chế snapshot để sao lưu dữ liệu thường xuyên. Điều này không chỉ giúp bạn phục hồi nhanh chóng mà còn đảm bảo an toàn dữ liệu trong trường hợp có sự cố.

  • Theo dõi hiệu suất: Sử dụng Kibana hoặc các công cụ như Elastic Monitoring để theo dõi tài nguyên cluster, phát hiện kịp thời các bottleneck và điều chỉnh.

  • Tính toán shard hợp lý: Tránh tạo quá nhiều shard nhỏ (oversharding) vì nó sẽ làm tăng chi phí quản lý. Quy tắc chung là một shard nên có dung lượng từ 20GB đến 50GB.

  • Kiểm tra plugin: Chỉ cài đặt những plugin thực sự cần thiết để tránh làm tăng nguy cơ lỗi hoặc giảm hiệu suất.

  • Phân bổ lại shard: Khi thêm node mới, hãy sử dụng API cluster.reroute để đảm bảo shard được phân bổ lại đồng đều giữa các node.

Kết

Hy vọng những chia sẻ trên sẽ giúp bạn xây dựng và tối ưu hóa cluster Elasticsearch hiệu quả hơn. Nếu bạn có thắc mắc hoặc kinh nghiệm muốn chia sẻ, hãy để lại bình luận nhé!

Bài viết đã tham khảo:


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.