Cấu hình cơ bản của Elasticsearch phiên bản 6.6.0

Tổng quan các tệp cấu hình chính

1. elasticsearch.yml (Tệp cấu hình dịch vụ)

Vị trí tệp: ${ES_HOME}/config/elasticsearch.yml

# ======================== Cấu hình Elasticsearch =========================
#
# LƯU Ý: Elasticsearch đi kèm với các thiết lập mặc định hợp lý cho phần lớn trường hợp.
#       Trước khi bạn điều chỉnh và tối ưu hóa cấu hình, hãy đảm bảo rằng bạn
#       hiểu rõ mục tiêu cần đạt được và những hệ quả có thể xảy ra.
#
# Cách chính để cấu hình một node là thông qua tệp này. Mẫu này liệt kê
# các thiết lập quan trọng nhất mà bạn có thể muốn cấu hình cho cụm sản xuất.
#
# Xin vui lòng tham khảo tài liệu để biết thêm thông tin về các tùy chọn cấu hình:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html

1.1 Cấu hình cụm (Cluster)

# ---------------------------------- Cụm -----------------------------------
#
# Sử dụng tên mô tả cho cụm của bạn:
# Tên cụm, chỉ các node có cùng tên mới có thể tạo thành một cụm logic, mặc định là "elasticsearch", nên thay đổi thành tên liên quan đến dự án.
cluster.name: project_elasticsearch

1.2 Cấu hình node

# ------------------------------------ Node ------------------------------------
#
# Sử dụng tên mô tả cho node:
# Tên của node này, tên các node trong cùng cụm không được trùng nhau. Nếu không cấu hình, hệ thống sẽ tự động phân bổ.
# node.name: instance-01
#
# Thêm thuộc tính tùy chỉnh cho node:
# Chỉ định thuộc tính khu vực của node --- một phạm vi lớn hơn cụm, tức là định nghĩa một số thuộc tính chung, dùng để lọc khi cụm phân bổ phân mảnh. 
#node.attr.zone: zone_a

Trong phiên bản Elasticsearch 6.6.0, các cấu hình sau đã bị loại bỏ:

# Xác định xem node này có đủ điều kiện bầu chọn làm master hay không, mặc định là true. 
# Trong cụm ES, máy đầu tiên được mặc định là master, nếu node này chết, sẽ bầu lại master. 
# node.master=true
# 
# Xác định xem node này có lưu trữ dữ liệu trong cụm hay không, mặc định là true. 
# node.data=true
#
# Tệp cấu hình đưa ra ba mô hình cấu hình kiến trúc cụm hiệu suất cao như sau: 
# 1. Nếu muốn node không được bầu làm master, chỉ dùng để lưu trữ dữ liệu, có thể làm tải cân bằng:  
# node.master: false 
# node.data: true 
# node.ingest: true  # Mặc định là true
#
# 2. Nếu muốn node trở thành master, không lưu trữ dữ liệu, giữ tài nguyên trống, có thể làm bộ điều phối: 
# node.master: true 
# node.data: false
# node.ingest: true
#
# 3. Nếu muốn node không làm master cũng không làm node dữ liệu, có thể làm node tìm kiếm, lấy dữ liệu từ các node khác, tạo kết quả tìm kiếm:  
# node.master: false 
# node.data: false 
# node.ingest: true
#
# 4. Chỉ làm bộ điều phối: 
# node.master: false 
# node.data: false
# node.ingest: false

1.3 Cấu hình đường dẫn

# ----------------------------------- Đường dẫn ------------------------------------
#
# Đường dẫn thư mục nơi lưu trữ dữ liệu (phân tách nhiều vị trí bằng dấu phẩy):
# Nếu không cấu hình hai mục dưới đây, ES sẽ tạo trong thư mục gốc của nó. Nên tách riêng chương trình và dữ liệu để thuận tiện di chuyển và nâng cấp hệ thống. 
# Thư mục lưu trữ dữ liệu chỉ mục
path.data: /opt/elk-data/storage
#
# Đường dẫn tệp nhật ký: thư mục lưu trữ thông tin nhật ký
path.logs: /opt/elk-data/logs

1.4 Cấu hình bộ nhớ

# ----------------------------------- Bộ nhớ -----------------------------------
#
# Khóa bộ nhớ khi khởi động:
# Có khóa bộ nhớ mà ES cần chạy hay không, mặc định là false. 
# true: khóa --- ngăn ES sử dụng không gian hoán đổi Swap, hiệu suất cao hơn. Lúc này phải đảm bảo người dùng hiện tại có quyền memlock. 
# false: sẽ sử dụng không gian hoán đổi Swap.
# bootstrap.memory_lock: false 
bootstrap.system_call_filter: false
# 
# Đảm bảo tham số ES_HEAP_SIZE được đặt khoảng một nửa dung lượng RAM khả dụng của hệ thống, không vượt quá vì Lucene vẫn cần một lượng bộ nhớ nhất định cho việc lập chỉ mục và truy vấn. 
# Hãy chắc chắn rằng kích thước heap được đặt khoảng một nửa bộ nhớ
# có sẵn trên hệ thống và người sở hữu tiến trình được phép sử dụng giới hạn này.
# 
# Khi hệ thống sử dụng hoán đổi bộ nhớ, hiệu suất của ES sẽ rất kém
# Elasticsearch hoạt động kém khi hệ thống đang hoán đổi bộ nhớ.

1.5 Cấu hình mạng

# ---------------------------------- Mạng -----------------------------------
#
# Đặt địa chỉ bind thành IP cụ thể (IPv4 hoặc IPv6):
# IP cổng ra ngoài, mặc định là localhost, lúc này chỉ có thể truy cập qua localhost hoặc 127.0.0.1. 
# Đặt thành 0.0.0.0, có thể được truy cập bởi tất cả mạng bên ngoài, nhưng không an toàn, có thể chỉ định một đoạn mạng cụ thể:
network.host: 0.0.0.0
#network.host: 192.168.1.10
#
# Đặt cổng tùy chỉnh cho HTTP:
# Cổng truy cập HTTP cung cấp bên ngoài, mặc định là 9200. Để tăng tính bảo mật, nên đặt giá trị khác.
# Có thể chỉ định một giá trị hoặc một dải, nếu là dải thì sẽ chọn cổng đầu tiên khả dụng trong dải.
#http.port: 9200
# 
# Để biết thêm thông tin, hãy tham khảo tài liệu mô-đun mạng.

Phiên bản Elasticsearch 6.6.0 đã loại bỏ thiết lập transport.tcp.port:

# 
# Cổng truyền TCP cho giao tiếp giữa các node cụm. Thiết lập phần Discovery dưới đây, API Java của ES cũng truyền dữ liệu qua cổng này. Mặc định là 9300. 
# Có thể chỉ định một giá trị hoặc một dải, nếu là dải thì sẽ chọn cổng đầu tiên khả dụng trong dải.
# transport.tcp.port: 9300

① Trong API Java phiên bản cũ, client TransportClient sử dụng cổng 9300, thực hiện yêu cầu Java tuần tự hóa, hiệu suất thấp, sẽ lỗi thời ở phiên bản 7.x và bị loại bỏ ở phiên bản 8.x;
② Phiên bản mới khuyến nghị sử dụng client Java High Level REST Client, tức là RestHighLevelClient, thực hiện yêu cầu HTTP, sử dụng cổng http.port, mặc định là 9200.

1.6 Cấu hình phát hiện node

# --------------------------------- Phát hiện ----------------------------------
# 
# Khi khởi động node mới, thông qua danh sách IP để phát hiện node, xây dựng cụm
# Truyền danh sách host ban đầu để thực hiện phát hiện khi node mới được khởi động:
# Danh sách host mặc định là ["127.0.0.1", "[::1]"]
# '127.0.0.1' là địa chỉ loopback IPv4, '[::1]' là địa chỉ loopback IPv6
# 
# Trong 1.x mặc định sử dụng giao thức multicast: tự động phát hiện các node ES trong cùng đoạn mạng và xây dựng cụm; 
# Trong 2.x mặc định sử dụng giao thức unicast: để xây dựng cụm, cần chỉ định thông tin node cụm tại đây -- an toàn hiệu quả, nhưng linh hoạt kém hơn. 
# 
# Chức năng giao thức multicast (multicast) phát hiện node tự động đã bị tắt mặc định: 
# discovery.zen.ping.multicast.enabled: false
# 
# Chỉ định danh sách IP (hoặc hostname) cho chế độ unicast: 
# Cũng có thể cấu hình thành: ["ip:port", "ip:port"]. Nếu chưa đặt port, sẽ sử dụng giá trị của transport.tcp.port. 
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
# 
# Ngăn chặn "split brain" bằng cách cấu hình đa số node (tổng số node đủ điều kiện master / 2 + 1):
# Cấu hình tham số này để ngăn ngừa hiện tượng "split brain" trong cụm: xuất hiện 2 master trở lên trong cụm, dẫn đến dữ liệu không nhất quán. 
# Gợi ý chính thức: số node bầu cử master tối thiểu = (số node đủ điều kiện master / 2) + 1
#discovery.zen.minimum_master_nodes: 
# 
# Đặt thời gian chờ kết nối để phát hiện các node khác trong cụm, mặc định là 3 giây.
# Khi mạng yếu, tăng giá trị này sẽ tăng thời gian chờ phản hồi của node, có thể giảm sai sót.
# discover.zen.ping.timeout: 3s
# 
# Để biết thêm thông tin, hãy tham khảo tài liệu mô-đun phát hiện zen.

1.7 Cấu hình cổng ra

# ---------------------------------- Cổng ra -----------------------------------
# 
# Chặn khôi phục ban đầu sau khi khởi động lại cụm đầy đủ cho đến khi N node được khởi động:
# Cấu hình sau khi N node trong cụm khởi động mới cho phép xử lý khôi phục dữ liệu. Mặc định là 1.
#gateway.recover_after_nodes: 3
#
# Để biết thêm thông tin, hãy tham khảo tài liệu mô-đun cổng ra.

1.8 Cấu hình khác

# ---------------------------------- Các mục khác -----------------------------------
# 
# Cấm khởi động nhiều dịch vụ es trên một máy chủ
# Vô hiệu hóa việc khởi động nhiều node trên một hệ thống:
#
# node.max_local_storage_nodes: 1
#
# Thiết lập có thể xóa hoặc đóng chỉ mục thông qua regex hoặc _all hay không, mặc định true có nghĩa là phải chỉ định rõ ràng tên chỉ mục
# 
# Yêu cầu tên rõ ràng khi xóa chỉ mục:
#action.destructive_requires_name: true


# Có nén dữ liệu truyền qua TCP hay không, mặc định là false: 
# transport.tcp.compress: false

# Có sử dụng giao thức HTTP để cung cấp dịch vụ bên ngoài hay không, mặc định là true:
# http.cors.enabled: true

# Dung lượng nội dung truyền HTTP tối đa, mặc định là 100MB:
# http.max_content_length: 100mb
  • Lưu ý:
    Trong tệp cấu hình phiên bản 2.x, tồn tại mục cấu hình Index, có thể cấu hình số phân mảnh, số phân mảnh bản sao và các mục khác.
    Trong phiên bản 5.x, không hỗ trợ thiết lập các mục này trong tệp cấu hình nữa, xin lưu ý sự khác biệt này.
  • Sau khi sửa đổi, sử dụng lệnh để xem các giá trị đã sửa đổi cụ thể:
    # Xem nội dung sửa đổi lần trước của một tệp: 
    grep '^[a-z]' /opt/elk-data/config/elasticsearch.yml
    

2. jvm.options (Cấu hình tham số JVM)

Vị trí tệp: ${ES_HOME}/config/jvm.options

## Cấu hình JVM

################################################################
## QUAN TRỌNG: Kích thước heap JVM
################################################################
##
## Bạn nên luôn đặt giá trị min và max của heap JVM
## bằng nhau. Ví dụ, để đặt
## heap thành 4 GB, đặt:
##
## -Xms4g
## -Xmx4g
##
## Xem https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## để biết thêm thông tin
##
################################################################

# Xms đại diện cho kích thước heap tổng ban đầu
# Xmx đại diện cho kích thước heap tổng tối đa
# Cấu hình dưới tốt nhất không vượt quá 50% RAM vật lý của node, để lại 50% cho việc lập chỉ mục và truy vấn của Lucene 
-Xms2g
-Xmx2g

################################################################
## Thiết lập chuyên gia
################################################################
##
## Tất cả thiết lập dưới phần này đều được coi là
## thiết lập chuyên gia. Không can thiệp trừ khi
## bạn hiểu rõ mình đang làm gì
##
################################################################

## Cấu hình GC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly

## Cấu hình G1GC
# LƯU Ý: G1GC chỉ được hỗ trợ trên JDK phiên bản 10 trở lên.
# Để sử dụng G1GC, bỏ comment các dòng dưới.
# 10-:-XX:-UseConcMarkSweepGC
# 10-:-XX:-UseCMSInitiatingOccupancyOnly
# 10-:-XX:+UseG1GC
# 10-:-XX:InitiatingHeapOccupancyPercent=75

## Chính sách cache DNS
# cache ttl tính bằng giây cho tra cứu DNS tích cực, lưu ý rằng điều này ghi đè lên
# thuộc tính bảo mật JDK networkaddress.cache.ttl; đặt thành -1 để cache mãi mãi
-Des.networkaddress.cache.ttl=60
# cache ttl tính bằng giây cho tra cứu DNS tiêu cực, lưu ý rằng điều này ghi đè lên
# thuộc tính bảo mật JDK networkaddress.cache.negative ttl; đặt thành -1 để cache
# mãi mãi
-Des.networkaddress.cache.negative.ttl=10

## tối ưu hóa

# chạm trước vào các trang bộ nhớ được JVM sử dụng trong quá trình khởi tạo
-XX:+AlwaysPreTouch

## cơ bản

# đặt rõ ràng kích thước stack (giảm xuống 320k trên JVM client 32-bit)
-Xss1m

# đặt thành headless, phòng trường hợp
-Djava.awt.headless=true

# đảm bảo mã hóa UTF-8 mặc định (ví dụ: tên tệp)
-Dfile.encoding=UTF-8

# sử dụng JNA do chúng tôi cung cấp thay vì của hệ thống
-Djna.nosys=true

# tắt tối ưu hóa JDK loại bỏ stack trace cho các
# ngoại lệ phổ biến vì stack trace rất quan trọng để gỡ lỗi
-XX:-OmitStackTraceInFastThrow


# cờ để cấu hình Netty
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0

# log4j 2
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true

## dump heap

# tạo dump heap khi phân bổ từ heap Java thất bại
# các dump heap được tạo trong thư mục làm việc của JVM
-XX:+HeapDumpOnOutOfMemoryError

# chỉ định đường dẫn thay thế cho dump heap; đảm bảo thư mục tồn tại và có đủ dung lượng
# trong môi trường sản xuất, chỉ định đường dẫn Dump Heap khi xảy ra ngoại lệ OOM, mặc định là -XX:HeapDumpPath=data
-XX:HeapDumpPath=/opt/elasticsearch/dumps

# chỉ định đường dẫn thay thế cho nhật ký lỗi nghiêm trọng của JVM
-XX:ErrorFile=logs/fatal_error_%p.log

## Nhật ký GC JDK 8

8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:logs/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m

# Nhật ký GC JDK 9+
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
# do cải tiến quốc tế hóa trong JDK 9 nên Elasticsearch cần đặt nhà cung cấp thành COMPAT nếu không
# phân tích cú pháp thời gian/ngày sẽ bị lỗi cho một số mẫu ngày và ngôn ngữ địa phương nhất định
9-:-Djava.locale.providers=COMPAT

# giải pháp tạm thời cho lỗi C2 với JDK 10 trên phần cứng có AVX-512
10-:-XX:UseAVX=2

Trong Elasticsearch 6.6.0 đã loại bỏ các cấu hình tối ưu hóa sau:

# vô hiệu hóa các cuộc gọi đến System#gc
-XX:+DisableExplicitGC

# ép VM máy chủ (loại bỏ trên JVM client 32-bit)
-server

# sử dụng quyền hạn tập tin kiểu cũ trên JDK9
-Djdk.io.permissionsUseCanonicalPath=true

Giải thích khác:

-Xmx4g        # Tham số này không giới hạn phiên bản JVM
8: -Xmx4g     # Giới hạn phiên bản JVM là 8
8-: -Xmx4g    # Giới hạn phiên bản JVM là 8 trở lên
8-11: -Xmx4g  # Giới hạn phiên bản JVM từ 8 đến 11

3. log4j2.properties (Cấu hình nhật ký)

Vị trí tệp: ${ES_HOME}/config/log4j2.properties

Thông thường sử dụng cấu hình nhật ký mặc định là đủ.

Thẻ: Elasticsearch Configuration JVM clustering Networking

Đăng vào ngày 27 tháng 5 lúc 19:01