12/08/2018, 15:53

Tính toán dung lượng ổ cứng cần cho Elasticsearch

Gần đây trong dự án của mình có phát sinh yêu cầu cần nâng cấp ổ cứng cho Cluster Elasticsearch, tuy nhiên để đưa ra con số chính xác cần tăng thêm bao nhiêu thì mình lại không thể cho ra con số cụ thể. Sau khi search google một hồi thì mình tìm thấy công thức cho vấn đề này. http://svops.com/blog/ ...

Gần đây trong dự án của mình có phát sinh yêu cầu cần nâng cấp ổ cứng cho Cluster Elasticsearch, tuy nhiên để đưa ra con số chính xác cần tăng thêm bao nhiêu thì mình lại không thể cho ra con số cụ thể. Sau khi search google một hồi thì mình tìm thấy công thức cho vấn đề này. http://svops.com/blog/elasticsearch-disk-space-calculations/ Bài viết khá tương đồng với hệ thống Elasticsearch mà dự án mình đang gặp phải, vì vậy mình muốn ghi lại và chia sẻ với các bạn.

Dung lượng giới hạn để Elasticsearch có thể hoạt động là bao nhiêu ?

Thông thường chúng ta hay nghi rằng bao giờ Elasticsearch dùng hết dung lượng ổ cứng thì nó se không hoạt động thôi. Mình cung nghi như vậy cho đến khi 1 node ES của mình lăn ra chết khi nó vân còn dung lượng trống đến vài GB. Sao vậy nhỉ, cùng tìm hiểu nhé.

Hóa ra ES kiểm soát dung lượng giới hạn qua tham số cluster.routing.allocation.disk.watermark.low parameter. Theo mặc định tham số này se là 85% không gian của ổ cứng. Nếu một node quá không gian giới hạn này thì shard mới se không được cấp phát thêm và node này se ngừng cấp phát chỉ mục mới.

Suy ra, chúng ta cần ước lượng dung lượng 1 node của ES cần lưu trư trong một khoảng thời gian sau đó / 0,85 là se ra dung lượng ổ cứng cần cho một node.

Tuy nhiên đó mới chỉ là dung lượng tối thiểu cần khi tất cả các node của bạn hoạt động bình thường thôi. Điều gì se xảy ra khi một hoặc nhiều node gặp vấn đề ?

Dung lượng cần bổ sung khi một node fail là bao nhiêu ?

Lấy ví dụ 1 cluster ES gồm 3 node với thiết lập 3 shard và 1 replica, khi đó dư liệu se được phân bổ như sau:

Node1: P1 + R3
Node2: P2 + R1
Node3: P3 + R2

Phân bổ trên nghia là: 1 index se được chia thành 3 primary shards P1, P2, P3 chia đều cho 3 node. Môi primary shard se có một replica shard gọi là R1, R2, R3 phân bố đều cho 3 node nhưng đảm bảo một node không vừa chứa P và R giống nhau.

Nếu môi node có dung lượng ổ cứng là 1TB, thì chúng se có dung lượng giới hạn là 850GB. Nếu một node fail thì 6 shard cần được phân bổ lại trên 2 node còn lại.

Ví dụ chúng ta mất Node1, thì P1 và R3 se mất. R1 trên Node2 se lập tức chuyển thành P1, tuy nhiên ta se không có R1 và R3, vì vậy ES se rebuild lại 2 replica trên 2 node còn lại như sau:

Node2: P2 + P1 + R3
Node3: P3 + R2 + R1

Việc rebuild này là tốt, nó đảm bảo các phần dư liệu của chúng ta luôn có 1 bản sao backup, giảm thiểu khả năng mất dự liệu. Tuy nhiên nó khiến 2 node còn lại phải gánh thêm 425GB môi node. 2 node còn lại se full và shard se không được tạo thêm, khiến toàn bộ ES không thể thêm index.

Do đó chúng ta cần thêm không gian trống đủ để môi node có thể tái phân bổ lại primary và replica từ node fail. Đây là công thức tính dung lượng tối đa để một node có thể an toàn:

(disk per node * .85) * (node count - 1 / node count)

Trong ví dụ trên, chúng ta có kết quả sau:

( 1TB * .85 ) * ( 2 / 3 ) = 566GB

Nếu 3 node đều chứa 566GB thì khi một node fail, 283GB data se được rebuild trên 2 node còn lại. Lúc đó, dung lượng 2 node còn lại se là 849GB, nó nằm trong nhương an toàn <850GB.

Ta se làm tròn con số 566 thành 550GB, thì tức là tổng số data mà cluster có thể lưu trư là 550GB * 3 = 1,65TB. Nếu muốn tăng dung lượng lưu trư cho cluster thì ta cần tăng không gian ổ cứng cho môi node hoặc tăng thêm node. Nếu số node là 4 thì dung lượng tối đa cho môi node là:

(1TB * 0,85) * (3/4) = 637GB

Công thức trên là ứng với một replica, nếu có nhiều replica thì công thức se là:

(disk per node * .85) * (node count - replica count / node count)

Nếu có 2 replica thì công thức là ta se là:

( 1TB * .85 ) * ( 1 / 3 ) = 283GB

Tham khảo

http://svops.com/blog/elasticsearch-disk-space-calculations/ https://www.elastic.co/guide/en/elasticsearch/reference/master/disk-allocator.html

0