[Elasticsearch] Các thông số cấu hình bổ sung, tunning cho elasticsearch


Mặc định, Elasticsearch giả định rằng chúng ta đang làm việc trong development mode. Nếu bất cứ cấu hình nào dưới đây không chính xác, một cảnh báo sẽ được viết vào log file, nhưng chúng ta vẫn có thể bấm start và chạy Elasticsearch node.

Ngay khi các cấu hình mạng như network.host được thiết đặt, Elasticsearch sẽ tự giả định rằng chúng ta đã chuyển sang môi trường production, những cảnh báo warning ở trên sẽ được chuyển sang exception và ngăn chặn việc khởi động Elasticsearch. Đây là điều cực quan trọng trong việc đo lường mức độ an toàn của hệ thống, đảm bảo rằng chúng ta sẽ không bị mất dữ liệu cho cấu hình ngu.

Các thiết đặt hệ thống.
Các thiết đặt cần lưu ý:
- ulimit: thông số cấu hình số lượng file mà 1 user có thể mở đồng thời, mặc định thường là 4096 file (xem bằng lệnh ulimit -a), Chúng ta cần tăng con số này lên:

  • ulimit -n 65536
Lệnh trên tăng số file tối đa có thể mở lên 65536, lưu sử dụng user root để thực hiện. Con số này sẽ quay về mặc định khi reboot máy.
Để thiết lập số này vĩnh viễn, thêm dòng này vào /etc/security/limits.conf
elasticsearch  -  nofile  65536


trong đó, elasticsearch là user thực hiện để chạy ES, nếu dùng root thì sửa lại thành root nhé.
Lưu ý: đối với Ubuntu, thằng này bỏ qua limits.conf nên cần phải sửa lại cho nó không thể bỏ qua :3 Edit file /etc/pam.d/su và bỏ comment dòng bên dưới đi, sau đó save lại.
# session    required   pam_limits.so

Khi sử dụng các gói cài đặt Rpm, deb thì  các biến môi trường, thiết đặt khác có thể được chỉ định trong file cấu hình, nằm ở:
RPM
/etc/sysconfig/elasticsearch
Debian
/etc/default/elasticsearch
Tuy nhiên, đối với hệ thống sử dụng systemd (như centos 7) thì các giới hạn hệ thống có thể được chỉ định bởi systemd.
File systemd service /usr/lib/systemd/system/elasticsearch.service chứa các giới hạn được áp dụng mặc định. Để thay đổi các giới hạn này, thêm 1 file /etc/systemd/system/elasticsearch.service.d/override.conf để thay đổi những gì mình muốn, như là
[Service]
LimitMEMLOCK=infinity
Ngoài ra, cũng có thể thực hiện điều này bằng lệnh
systemctl edit elasticsearch
Lệnh này sẽ thay cho bước sửa file, thêm file lằng tờ nhằng ở trên.
Sau khi sửa sang chán chê các bạn reload systemd nhé
systemctl daemon-reload

-----------------------------------------------
Disable swapping
Phần lớn các OS đều cố sử dụng RAM càng nhiều càng tốt cho cache, và cố đẩy phần cache đó sang swap khi cảm thấy nó hết giá trị sử dụng. Điều này dẫn đến một phần heap của JVM, hoặc tiến trình quan trọng bị ném sang swap.
Swap làm giảm hiệu năng một cách trầm trọng, disk tốc độ quá chậm so với RAM, đối với 1 node đang hoạt động ổn định, việc này cần tránh hết cỡ. Việc này có thể là nguyên nhân dẫn tới tiến trình GC (dọn rác của java JVM) kéo dài trong vài phút, thay vì vài mili giây, làm cho node phản hồi chậm hơn con rùa, và tệ hơn, là bị đá văng ra khỏi cluster.
Chúng ta có thể disable hoàn toàn swap để tránh việc này, hoặc thay đổi tỉ lệ move dữ liệu từ RAM sang swap (việc này lại phụ thuộc vào môi trường sử dụng)

Disable toàn bộ swap
Thông thường elasticsearch chạy trong 1 cái hộp (JVM), toàn bộ tiến trình do java quản lý, vì thế nó không cần đến swap. Để disable tạm thời swap, ta chạy lệnh
sudo swapoff -a
Để disable vĩnh viễn, sửa file /etc/fstab và comment tất cả dòng nào có chữ swap mà ta nhìn thấy
Với windows, thực hiện System Properties → Advanced → Performance → Advanced → Virtual memory.

Cấu hình Swappiness
Sửa file /etc/sysctl.conf , thêm cho nó dòng
vm.swappiness=1
Sau đó gõ sysctl -p để thay đổi có hiệu lực
Option này ngăn kernel đưa dữ liệu vào swap trong điều kiện thường, lúc khẩn cấp (RAM hết sạch) thì vẫn chạy qua swap trú tạm như thường. Phương pháp này ôn hoà hơn cách trên :)))

Bật bootstrap.memory_lock
Một tuỳ chọn khác là sử dụng mlockall trên linux hoặc virtuallock  trên windows. Tuỳ chọn này cho phép khoá không gian địa chỉ của tiến trình trên RAM, ngăn không có bất cứ mảnh bộ nhớ nào của ứng dụng bị đưa vào swap. Phần này cấu hình trên file cấu hình của elasticsearch: config/elasticsearch.yml (hoặc /etc/elasticsearch/elasticsearch.yml nếu cài bằng rpm, msi, deb)
bootstrap.memory_lock: true
Lưu ý: Nếu lượng RAM còn thừa không đủ, thì JVM sẽ không chạy, hoặc bị exit luôn nếu đang chạy mà thiếu hàng.
Sau khi khởi động lại elasticsearch để cấu hình có hiệu lực, check giá trị mlockall bằng API
GET _nodes?filter_path=**.mlockall
Nếu thấy mlockall là False, mò mẫm trong log sẽ thấy dòng Unable to lock JVM Memory thì tức là không thể lock đc bộ nhớ rồi. Cấu hình không hiệu quả. Nguyên nhân đa phần do user không có quyền, khắc phục bằng cách

  • Đối với cài đặt qua .zip, .tar.gz: chạy lệnh ulimit -l unlimited hoặc đặt memlock unlimited trong file /etc/security/limits.conf. Bước này cần làm trước khi bật elasticsearch.
  • Đối với RPM và DEB: Đặt MAX_LOCKED_MEMORY  thành unlimited trong /etc/sysconfig/elasticsearch (đối với RPM) và /etc/default/elasticsearch ( đối với deb)
  • Đối với hệ thống chạy systemd như centos7, cần LimitMEMLOCK  thành infinity (đã đề cập tới ở trên)
Một lý do khiến mlockall bị false nữa là do thư mục tạm /tmp bị mount với tuỳ chọn noexec. Khắc phục bằng cách thêm biến môi trường ES_JAVA_OPTS
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
hoặc thêm cờ jvm.options trong file cấu hình
Sau đó khởi động lại elasticsearch.
------------------------------------------------------------------------
File Descriptors
Elasticsearch sử dụng rất nhiều xử lý file. Các thông số File Descriptors nếu không đáp ứng được có thể dẫn đến mất dữ liệu nghiêm trọng. Elasticsearch khuyến cáo tăng thông số này lên ít nhất là 65536
ulimit -n 65536
hoặc
sửa file /etc/security/limits.conf thêm dòng
elasticsearch  -  nofile  65536
Đối với MacOS, có thể sử dụng JVM option -XX:-MaxFDLimit
Cài đặt bằng gói RPM hoặc DEB thì các con số này đã được tối ưu luôn, không cần làm gì cả. Đối với windows cũng không cần can thiệp gì.
Kiểm tra thông số này trên mỗi node:
GET _nodes/stats/process?filter_path=**.max_file_descriptors
-----------------------------------------------------------------------------------
Virtual memory

Elasticsearch sử dụng thư mục mmapfs để lưu trữ indices, mặc định OS giới hạn con số này khá thấp, tăng nó lên thôi
sysctl -w vm.max_map_count=262144
Với gói cài RPM, DEB thì khỏi cần làm gì, người ta làm sẵn cho rồi.
-----------------------------------------------------------------------------------
Số luồng
https://www.elastic.co/guide/en/elasticsearch/reference/current/max-number-of-threads.html
xem tại đây nhé, ngắn gọn.
về cơ bản, elasticsearch sử dụng một số các thread pool cho các tiến trình khác  nhau. Điều quan trọng nhất là nó luôn sẵn sàng tạo thread mới bất cứ khi nào nó cần. Nếu hệ thống sử dụng systemd thì không cần làm gì cả, mọi thứ được cấu hình tự động. Nếu không các bạn thêm số
nproc 4096 vào file /etc/security/limits.conf
--------------------------------------------------------------------------------------
DNS cache
Elasticsearch chạy với 1 module bảo mật, JVM  mặc định cache các thông tin phân giải hostname, và cache này mặc định không có thời gian hết hạn. Nếu Elasticsearch chạy trong môi trường sử dụng hostname/domain, mà IP của các hostname/domain này có thể thay đổi theo thời gian thì cần sửa lại JVM, bằng cách thêm networkaddress.cache.ttl=<timeout> vào java sercutity policy (https://docs.oracle.com/javase/8/docs/technotes/guides/security/PolicyFiles.html)
Tất cả các host không thể phân giải đều sẽ được log lại.
Chú ý: JVM còn cache cả các phân giải lỗi (phân giải fail) trong 10s, vì thế cũng cần sửa lại java sercurity policy
networkaddress.cache.negative.ttl=<timeout>
------------------------------------------------------------------------------------

Nhận xét