Cài đặt Elasticsearch đơn lẻ và giải quyết các vấn đề thường gặp

Mục lục

  • 1. Chuẩn bị
    • 1.1. Cài đặt JDK
    • 1.2. Tải xuống gói cài đặt
    • 1.3. Tạo người dùng elastic
  • 2. Khởi động dịch vụ ES
    • 2.1. Chỉnh sửa tệp cấu hình
    • 2.2. Khởi động dịch vụ
  • 3. Xác minh dịch vụ ES có sẵn sàng không
  • 4. Tắt và khởi động lại dịch vụ
    • 4.1. Tắt dịch vụ
    • 4.2. Khởi động lại dịch vụ
  • 5. Các vấn đề thường gặp và cách giải quyết
    • 5.1. Lỗi khi đăng nhập bằng người dùng chuyên dụng của ES
    • 5.2. syscall filter - Không thể cài đặt
    • 5.3. memory is not locked - Bộ nhớ không bị khóa
    • 5.4. max virtual memory - Bộ nhớ ảo tối đa quá nhỏ
    • 5.5. max number of threads - Số lượng luồng tối đa quá nhỏ
    • 5.6. max file descriptors - Số lượng tệp có thể tạo tối đa quá nhỏ

Quá trình triển khai này lấy Elasticsearch phiên bản 6.6.0 làm ví dụ, các bài học và minh họa sau này cũng sử dụng phiên bản này.

1. Chuẩn bị

1.1. Cài đặt JDK

Điều kiện tiên quyết để học cách sử dụng ES là cài đặt JDK thành công - một bước cơ bản rất đơn giản, ở đây bỏ qua.

JDK phiên bản được sử dụng cho việc minh họa học tập này là:

[root@localhost ~]# java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

1.2. Tải xuống gói cài đặt

(1) Tải xuống gói cài đặt tương ứng với phiên bản hệ thống của bạn, liên kết như sau:

https://www.elastic.co/downloads/elasticsearch

Tại đây tải xuống phiên bản cho hệ thống MacOS/Linux: elasticsearch-6.6.0.tar.gz.

(2) Tải lên và giải nén:

# Đường làm việc
mkdir -p /data/elk-6.6.0
# Tải lên gói cài đặt sau đó giải nén
tar -zxf elasticsearch-6.6.0.tar.gz

1.3. Tạo người dùng elastic

Dịch vụ Elasticsearch phải được khởi động bằng người dùng chuyên dụng elastic, nếu không sẽ báo lỗi.

# Tạo người dùng
useradd elastic -s /bin/bash
# Cấp cho người dùng này các quyền thao tác cần thiết
chown -R elastic:elastic /data/elk-6.6.0
# Thay đổi tên thư mục cài đặt
mv elasticsearch-6.6.0 es-node

2. Khởi động dịch vụ ES

2.1. Chỉnh sửa tệp cấu hình

Chỉnh sửa tệp ${ES_HOME}/config/elasticsearch.yml về cấu hình mạng:

# Khoảng dòng 17, thay đổi tên cụm, trong cùng một cụm, tên này phải giống nhau để tạo thành một cụm logic:
cluster.name: heal_es

# Khoảng dòng 23, thay đổi tên nút, có thể đặt giống với tên máy chủ:
node.name: es-1

# Khoảng dòng 55, chỉ định có thể truy cập dịch vụ ES cục bộ từ máy chủ bên ngoài:
network.host: 0.0.0.0
# Và chỉ định cổng truy cập, mặc định là 9200, để tránh xung đột, ở đây thay đổi thành 9301:
http.port: 9301

Ngoài ra, nếu muốn xem xét việc nâng cấp phiên bản sau này, có thể chỉ định đường dẫn lưu trữ chỉ mục và tệp nhật ký của ES, nếu không dễ xảy ra tình trạng mất dữ liệu.

Đường dẫn mặc định là datalogs bên trong gói cài đặt Elasticsearch.

# Path to directory where to store the data (separate multiple locations by comma):
#path.data: /data/elk-6.6.0/data
#
# Path to log files:
#path.logs: /data/elk-6.6.0/logs

2.2. Khởi động dịch vụ

# Chuyển đổi người dùng
su elastic
# Khởi động dịch vụ, -d có nghĩa là khởi động ở chế độ nền, nếu không sử dụng tham số này, ES sẽ chặn chức năng nhập lệnh của terminal hiện tại, nếu bắt buộc sử dụng, sẽ dẫn đến việc dịch vụ ES kết thúc
cd /data/elk-6.6.0/es-node
./bin/elasticsearch -d

Lưu ý:

Elasticsearch phải được khởi động bằng người dùng không phải root, nếu không sẽ ném ra lỗi như sau:

[2019-06-24T21:02:07,654][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [es-1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.6.0.jar:6.6.0]
        at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.6.0.jar:6.6.0]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.6.0.jar:6.6.0]
        ... 6 more

3. Xác minh dịch vụ ES có sẵn sàng không

(1) Thông qua lệnh jps để xem tất cả các tiến trình Java đang chạy trong hệ thống hiện tại, điều kiện tiên quyết là biến môi trường JDK được đặt đúng:

[elastic@localhost bin]$ jps
25810 Elasticsearch   # ID tiến trình của Elasticsearch
25926 Jps

(2) Thông qua lệnh ps -ef hoặc ps aux để xem - có thể xem được các tham số JVM khi khởi động ES:

[elastic@gosearch-03 bin]$ ps aux | grep elasticsearch
elastic  24181 83.5  1.2 26269656 1701524 pts/0 Sl  13:51   2:03 /data/jdk1.8.0_151/bin/java 
	-Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly 
	-Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m 
	-Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true 
	-Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false 
	-Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch-8345885453572562051 -XX:+HeapDumpOnOutOfMemoryError 
	-XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
	-XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log -XX:+UseGCLogFileRotation 
	-XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/data/elk-6.6.0/es-node -Des.path.conf=/data/elk-6.6.0/es-node/config 
	-Des.distribution.flavor=default -Des.distribution.type=tar -cp /data/elk-6.6.0/es-node/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
elastic  28089  0.0  0.0 103248   844 pts/0    S+   13:54   0:00 grep elasticsearch

(3) Chạy lệnh trong terminal của MacOS/Linux (hoặc dòng lệnh của Windows):

# Dưới MacOS/Linux:
curl http://localhost:9301/
# Dưới Windows:
Invoke-RestMethod http://localhost:9301

Nếu có thể xuất hiện thông tin tương tự như trong trình duyệt, thì ES đã khởi động thành công.

(4) Hoặc truy cập "http://localhost:9301/" trong trình duyệt, nếu có thể xuất hiện thông tin sau, thì dịch vụ ES đã khởi động thành công:

(5) Giải thích các tham số giao diện khởi động:

{
  "name" : "es-1",
  "cluster_name" : "heal_es",            # Tên cụm hiện tại, trong cùng một cụm cần đảm bảo nhất quán
  "cluster_uuid" : "Rcgt8uy_T5uUAu4DsnXHdQ",
  "version" : {
    "number" : "6.6.0",                  # Phiên bản ES đang chạy
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "a9861f4",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,            # Phiên bản hiện tại có được xây dựng từ mã nguồn hay không
    "lucene_version" : "7.6.0",          # Phiên bản Lucene bên dưới ES hiện tại
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

4. Tắt và khởi động lại dịch vụ

4.1. Tắt dịch vụ

Elasticsearch không có lệnh tắt hoặc khởi động lại dịch vụ trực tiếp, việc tắt chỉ có thể thực hiện bằng cách lệnh kill để giết tiến trình, như sau:

[elastic@localhost bin]$ ps aux | grep elasticsearch  # Xem ID của tiến trình ES
[elastic@localhost bin]$ kill -8 25810  # Giết dịch vụ thông qua ID tiến trình

4.2. Khởi động lại dịch vụ

Khởi động trực tiếp dịch vụ:

[elastic@localhost bin]$ sh elasticsearch -d

Chắc chắn có thể viết một kịch bản dịch vụ, để khởi động hoặc tắt Elasticsearch một cách thuận tiện và nhanh chóng.

5. Các vấn đề thường gặp và cách giải quyết

Giải thích: Một số vấn đề sau đây gặp phải trong phiên bản Elasticsearch 5.x, một số trong phiên bản 6.6.0, bài viết này đã được cập nhật vào ngày 2019-06-24, chỉ để tham khảo.

5.1. Lỗi khi đăng nhập bằng người dùng chuyên dụng của ES

(1) Mô tả vấn đề:

Khi sử dụng người dùng chuyên dụng của ES để khởi động dịch vụ ES, terminal ném ra lỗi như sau:

[elastic@localhost bin]$ 2018-11-05 04:26:38,466 main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
     at java.lang.SecurityManager.checkPermission(SecurityManager.java:585)
     ......
     
SettingsException[Failed to load settings from /data/elk-6.6.0/es-node/config/elasticsearch.yml]; nested: AccessDeniedException[/data/elk-6.6.0/es-node/config/elasticsearch.yml];
     ......
     
Caused by: java.nio.file.AccessDeniedException: /data/elk-6.6.0/es-node/config/elasticsearch.yml
     ......

(2) Phân tích vấn đề:

Thông báo lỗi cho biết: quyền truy cập của người dùng hiện tại bị từ chối, có thể thấy người dùng chuyên dụng của ES không thể thực hiện ứng dụng hiện tại.

(3) Cách giải quyết:

Sau khi tạo người dùng chuyên dụng cho ES, hãy cấp cho họ các quyền đọc và ghi tương ứng.

# Cấp cho người dùng này các quyền thao tác cần thiết
chown -R elastic:elastic /data/elk-6.6.0

5.2. syscall filter - Không thể cài đặt

(1) Mô tả vấn đề:

Khi khởi động ES, ném ra thông báo lỗi như sau:

[2018-11-06T03:12:35,812][WARN ][o.e.b.JNANatives         ] unable to install syscall filter: 
java.lang.UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in
at org.elasticsearch.bootstrap.SystemCallFilter.linuxImpl(SystemCallFilter.java:329) ~[elasticsearch-5.6.10.jar:5.6.10]
......
[2018-11-06T03:12:39,947][INFO ][o.e.n.Node               ] initialized
[2018-11-06T03:12:39,947][INFO ][o.e.n.Node               ] [jVSUBme] starting ...
[2018-11-06T03:12:40,131][INFO ][o.e.t.TransportService   ] [jVSUBme] publish_address {10.0.20.50:9300}, bound_addresses {[::]:9300}
[2018-11-06T03:12:40,145][INFO ][o.e.b.BootstrapChecks    ] [jVSUBme] bound or publishing to a non-loopback address, enforcing bootstrap checks
[2018-11-06T03:12:40,148][ERROR][o.e.b.Bootstrap          ] [jVSUBme] node validation exception
[1] bootstrap checks failed
[1]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
[2018-11-06T03:12:40,150][INFO ][o.e.n.Node               ] [jVSUBme] stopping ...
[2018-11-06T03:12:40,186][INFO ][o.e.n.Node               ] [jVSUBme] stopped
[2018-11-06T03:12:40,186][INFO ][o.e.n.Node               ] [jVSUBme] closing ...
[2018-11-06T03:12:40,199][INFO ][o.e.n.Node               ] [jVSUBme] closed

(2) Cách giải quyết:

Centos 6.5 không hỗ trợ SecComp, và từ phiên bản ES 5.x, giá trị mặc định của bootstrap.system_call_filter là true.

Vô hiệu hóa: Đặt cấu hình bootstrap.system_call_filter=false trong elasticsearch.yml, lưu ý thêm dưới phần cấu hình Memory:

bootstrap.system_call_filter: false

5.3. memory is not locked - Bộ nhớ không bị khóa

(1) Mô tả vấn đề:

Khi khởi động Elasticsearch, ném ra thông báo lỗi như sau:

[2018-11-06T03:18:53,221][WARN ][o.e.b.JNANatives         ] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory
[2018-11-06T03:18:53,232][WARN ][o.e.b.JNANatives         ] This can result in part of the JVM being swapped out.
[2018-11-06T03:18:53,232][WARN ][o.e.b.JNANatives         ] Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
[2018-11-06T03:18:53,233][WARN ][o.e.b.JNANatives         ] These can be adjusted by modifying /etc/security/limits.conf, for example: 
# allow user 'elastic' mlockall
elastic soft memlock unlimited
elastic hard memlock unlimited
[2018-11-06T03:18:53,233][WARN ][o.e.b.JNANatives         ] If you are logged in interactively, you will have to re-login for the new limits to take effect.
    ......
[2018-11-06T03:18:57,644][ERROR][o.e.b.Bootstrap          ] [jVSUBme] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
[2018-11-06T03:18:57,646][INFO ][o.e.n.Node               ] [jVSUBme] stopping ...
[2018-11-06T03:18:57,693][INFO ][o.e.n.Node               ] [jVSUBme] stopped
[2018-11-06T03:18:57,693][INFO ][o.e.n.Node               ] [jVSUBme] closing ...
[2018-11-06T03:18:57,707][INFO ][o.e.n.Node               ] [jVSUBme] closed

(2) Phân tích vấn đề:

Trong tệp cấu hình Elasticsearch có tùy chọn sau: bootstrap.memory_lock: true, có nghĩa là khi khởi động dịch vụ Elasticsearch, khóa bộ nhớ cần thiết của JVM, tránh trao đổi Swap ở cấp độ OS - giảm hiệu suất dịch vụ ES.

Tùy chọn này mặc định là false, tức là không bật khóa.

(3) Cách giải quyết:

① Dùng "#" để ghi chú bootstrap.memory_lock: true trong tệp cấu hình, hoặc thay đổi giá trị của nó thành false;

② Hoặc sửa tệp hệ thống /etc/security/limits.conf, để gỡ bỏ hạn chế cho người dùng chuyên dụng elastic của ES:

# Thêm cấu hình sau vào cuối tệp, cho phép người dùng 'elastic' khóa bộ nhớ
elastic soft memlock unlimited
elastic hard memlock unlimited

5.4. max virtual memory - Bộ nhớ ảo tối đa quá nhỏ

(1) Mô tả vấn đề:

Khi khởi động Elasticsearch, ném ra thông báo lỗi như sau:

ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2019-06-24T21:05:12,355][INFO ][o.e.n.Node               ] [es-1] stopping ...
[2019-06-24T21:05:12,425][INFO ][o.e.n.Node               ] [es-1] stopped
[2019-06-24T21:05:12,426][INFO ][o.e.n.Node               ] [es-1] closing ...
[2019-06-24T21:05:12,439][INFO ][o.e.n.Node               ] [es-1] closed
[2019-06-24T21:05:12,442][INFO ][o.e.x.m.p.NativeController] [es-1] Native controller process has stopped - no new native processes can be started

(2) Phân tích vấn đề:

Dịch vụ Elasticsearch cần hỗ trợ một lượng lớn bộ nhớ ảo, bộ nhớ ảo tối đa mặc định của hệ thống là 65530, trong khi ES cần ít nhất 262144.

(3) Cách giải quyết:

① Chuyển sang người dùng root, sửa tệp cấu hình sysctl.conf:

vim /etc/sysctl.conf
# Sửa cấu hình sau, nếu không có thì thêm vào cuối tệp:
vm.max_map_count=655360
# Thực thi lệnh để sửa đổi có hiệu quả:
sysctl -p

② Sau đó khởi động lại Elasticsearch, có thể khởi động thành công.

5.5. max number of threads - Số lượng luồng tối đa quá nhỏ

(1) Mô tả vấn đề:

Khi khởi động Elasticsearch, ném ra thông báo lỗi như sau:

ERROR: [2] bootstrap checks failed
[1]: max number of threads [1024] for user [elastic] is too low, increase to at least [4096]
[2]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
[2019-06-24T21:51:04,810][INFO ][o.e.n.Node               ] [es-2] stopping ...
[2019-06-24T21:51:04,847][INFO ][o.e.n.Node               ] [es-2] stopped
[2019-06-24T21:51:04,847][INFO ][o.e.n.Node               ] [es-2] closing ...
[2019-06-24T21:51:04,864][INFO ][o.e.n.Node               ] [es-2] closed
[2019-06-24T21:51:04,867][INFO ][o.e.x.m.p.NativeController] [es-2] Native controller process has stopped - no new native processes can be started

(2) Phân tích vấn đề:

Dịch vụ Elasticsearch cần sử dụng đa luồng để tăng hiệu suất thực thi, số lượng luồng tối đa mặc định cho mỗi người dùng trong Cent OS 6.5 là 1024, trong khi người dùng ES cần ít nhất 4096.

(3) Cách giải quyết:

① Chuyển sang người dùng root, sửa tệp cấu hình:

[elastic@localhost bin]$ su root
Password: 
[root@localhost bin]# vim /etc/security/limits.d/90-nproc.conf
# Tìm nội dung sau, nếu không có thì tạo:
*  soft  nproc  1024
# Sửa thành 8192, trong đó * có nghĩa là tất cả người dùng:
*  soft  nproc  8192

② Lưu, thoát, sau đó đăng nhập lại (có thể mở terminal phiên bản mới), cuối cùng khởi động Elasticsearch, có thể khởi động thành công.

5.6. max file descriptors - Số lượng tệp có thể tạo tối đa quá nhỏ

(1) Mô tả vấn đề:

Khi khởi động Elasticsearch, ném ra thông báo lỗi như sau:

ERROR: bootstrap checks failed
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
[2019-06-24T22:06:04,810][INFO ][o.e.n.Node               ] [es-2] stopping ...
[2019-06-24T22:06:04,847][INFO ][o.e.n.Node               ] [es-2] stopped
[2019-06-24T22:06:04,847][INFO ][o.e.n.Node               ] [es-2] closing ...
[2019-06-24T22:06:04,864][INFO ][o.e.n.Node               ] [es-2] closed
[2019-06-24T22:06:04,867][INFO ][o.e.x.m.p.NativeController] [es-2] Native controller process has stopped - no new native processes can be started

(2) Phân tích vấn đề:

Trong quá trình chạy, dịch vụ Elasticsearch cần tạo một lượng lớn tệp cục bộ, số lượng tệp tối đa có thể thao tác cho mỗi người dùng mặc định trong Cent OS 6.5 là 4096, trong khi ES yêu cầu ít nhất 65536.

(3) Cách giải quyết:

① Chuyển sang người dùng root, sửa tệp cấu hình:

[elastic@localhost bin]$ su root
Password: 
[root@localhost bin]# vim /etc/security/limits.conf
# Tìm nội dung sau, nếu không có thì tạo:
*  soft  nofile  4096
# Sửa thành 65536, trong đó * có nghĩa là tất cả người dùng:
*  soft  nproc   65536

② Lưu, thoát, sau đó đăng nhập lại (có thể mở terminal phiên bản mới), cuối cùng khởi động Elasticsearch, có thể khởi động thành công.

Thẻ: Elasticsearch Java Cài đặt khởi động Vấn đề thường gặp

Đăng vào ngày 12 tháng 8 lúc 06:42