Elasticsearch(2)安装、配置与运行

安装与运行

本示例使用的Elasticsearch版本:Elasticsearch 6.8.0,JDK版本:1.8,系统:Linux CentOS 7。

1. 确保合适的JDK版本已经安装

Elasticsearch是java开发的,所以要先确保机器上已经安装了JDK。Elasticsearch对JDK版本的要求:

1
2
3
4
5
6
7
8
9
10
11
ES          JDK
0.90 1.6
----------------
1.3 1.7
... 1.7
2.4 1.7

----------------
5.0 1.8
... 1.8
————————————————

参考地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html 。比如Elasticsearch 6.6版本中的设置中(Elasticsearch Reference [6.6] ——> Set up Elasticsearch)就有介绍:

Java (JVM) Version
Elasticsearch is built using Java, and requires at least Java 8 in order to run. Only Oracle’s Java and the OpenJDK are supported. The same JVM version should be used on all Elasticsearch nodes and clients.
We recommend installing Java version 1.8.0_131 or a later version in the Java 8 release series. We recommend using a supported LTS version of Java. Elasticsearch will refuse to start if a known-bad version of Java is used.
The version of Java that Elasticsearch will use can be configured by setting the JAVA_HOME environment variable.

2.下载

从官网下载对应的压缩包并解压,https://www.elastic.co/cn/downloads/past-releases#elasticsearch

1
tar -zxvf elasticsearch-6.8.0.tar.gz

3.运行

进入到压后的,Elasticsearch的目录,执行./bin/elasticsearch即可启动Elasticsearch。

打开另一个终端进行测试:

1
curl 'http://localhost:9200/?pretty'

可以看到以下返回信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name" : "iQ0-NOB",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "DWm71mBHSKq0oWVxdF2h4g",
"version" : {
"number" : "6.8.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "65b6179",
"build_date" : "2019-05-15T20:06:13.172855Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

注意:

  • 如果你想把 Elasticsearch 作为一个守护进程在后台运行,那么可以在启动命令后面添加参数-d
  • tail -f ./logs/elasticsearch.log可以查看日志。

4.启动时可能会出现的异常

异常一: Elasticsearch有执行脚本的能力,因安全因素,在root用户下运行会报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@server01 elasticsearch-6.8.0]# bin/elasticsearch
[2021-03-28T16:59:19,426][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] 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.8.0.jar:6.8.0]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.8.0.jar:6.8.0]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.8.0.jar:6.8.0]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.8.0.jar:6.8.0]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.8.0.jar:6.8.0]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.8.0.jar:6.8.0]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.8.0.jar:6.8.0]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.8.0.jar:6.8.0]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.8.0.jar:6.8.0]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.8.0.jar:6.8.0]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.8.0.jar:6.8.0]
... 6 more

解决办法:使用非root帐户,并把 Elasticsearche 的解压目录的所有者和所属组给这个新建的用户,我这里使用的是名为hadoop的帐户。

异常二:内存不足

1
2
3
4
5
6
7
[hadoop@server01 elasticsearch-6.8.0]# bin/elasticsearch
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /opt/elasticsearch-5.6.3/bin/hs_err_pid1280.log

解决办法:修改conf目录下的JVM配置文件(jvm.options),将2g改成512m。

1
2
3
4
5
6
7
################################################################

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms512m
-Xmx512m

异常三:进程最大同时打开文件数太小

1
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

每个进程最大同时打开文件数太小,可通过下面2个命令查看当前数量。

1
2
ulimit -Hn
ulimit -Sn

解决方式:修改/etc/security/limits.conf文件,增加如下配置,用户退出后重新登录生效。

1
2
*               soft    nofile          65536
* hard nofile 65536

其中*表示对每个Linux用户都生效,当然也可以指定为要启动ES的用户,比如本文的hadoop

异常四:用户最大线程个数太低

1
max number of threads [3818] for user [es] is too low, increase to at least [4096]

问题同上,最大线程个数太低。修改配置文件/etc/security/limits.conf(和问题1是一个文件),增加如下配置,用户退出后重新登录生效。

1
2
*               soft    nproc           4096
* hard nproc 4096

可通过如下命令查看:

1
2
ulimit -Hu
ulimit -Su

异常五:vm.max_map_count太小

1
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解决办法:修改/etc/sysctl.conf文件,增加配置vm.max_map_count=262144,执行命令sysctl -p生效。

1
2
vim /etc/sysctl.conf
sysctl -p

常用配置

Elasticsearch配置文件路径是:%ES_HOME%/config/elasticsearch.yml。下面介绍一些常用的配置项:

cluster.name: elasticsearch
配置elasticsearch的集群名称,默认是elasticsearch。elasticsearch会自动发现在同一网段下的集群名为elasticsearch的主机,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。生成环境时建议更改。

node.name: “Franz Kafka”
节点名,默认随机指定一个name列表中名字,该列表在elasticsearch的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字,大部分是漫威动漫里面的人物名字。生成环境中建议更改以能方便的指定集群中的节点对应的机器

node.master: true
指定该节点是否有资格被选举成为node,默认是true,elasticsearch默认集群中的第一台启动的机器为master,如果这台机挂了就会重新选举master。

node.data: true
指定该节点是否存储索引数据,默认为true。如果节点配置node.master:false并且node.data: false,则该节点将起到负载均衡的作用

index.number_of_shards: 5
设置默认索引分片个数,默认为5片。索引分片对ES的查询性能有很大的影响,在应用环境,应该选择适合的分片大小。

index.number_of_replicas: 1
设置默认索引副本个数,默认为1个副本。此处的1个副本是指对所有shards的一个完全拷贝;默认5个分片1个拷贝;即总分片数为10。

path.conf: /path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。

path.data: /path/to/data1,/path/to/data2
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开。

path.work:/path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。

path.logs: /path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹。

path.plugins: /path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹

transport.tcp.port: 9300
设置交互的tcp端口,默认是9300。

transport.tcp.compress: true
设置是否压缩tcp传输时的数据,默认为false,不压缩。

http.port: 9200
设置交互的http端口,默认为9200。

------ 本文完 ------