一、介绍
Elasticsearch 是一个分布式、高扩展、高实时的全文搜索和数据分析引擎,基于RESTful web接口,使用Java语言开发的,是一款开源软件。
Elasticsearch、Logstash(数据收集日志解析引擎)和Kibana(分析和可视化平台)一起被设计成一个集成解决方案,称为Elastic Stack(ELK),它能够安全可靠地获取各种类型格式的数据,并且实时地对数据进行搜索、分析和可视化。
官方文档(7.10):https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
二、配置文件
相关配置文件
类型 | 描述 | 默认位置 |
---|---|---|
home | 主目录 | /usr/share/elasticsearch |
bin | 二进制脚本,包括elasticsearch启动一个节点和elasticsearch-plugin来安装插件等。 | /usr/share/elasticsearch/bin |
conf | 配置文件,包括主配置文件elasticsearch.yml等。 | /etc/elasticsearch |
conf | 环境变量,包括堆大小、文件描述符等。 | /etc/sysconfig/elasticsearch |
data | 节点上分配的每个索引/分片的数据文件的位置,可以保存多个位置。可通过主配置文件的path.data自定义。 | /var/lib/elasticsearch |
jdk | JAVA开发工具包位置,用于运行Elasticsearch,可以通过在Java环境中设置JAVA_HOME来覆盖 /etc/sysconfig/elasticsearch 中设定的变量 | /usr/share/elasticsearch/jdk |
logs | 日志文件位置,可通过主配置文件的path.logs自定义。 | /var/log/elasticsearch |
plugins | 插件文件位置,每个插件都将包含在一个子目录中。 | /usr/share/elasticsearch/plugins |
其他配置文件:
[root@es01 ~]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml # 主配置文件
/etc/elasticsearch/jvm.options # JVM配置文件(主要是内存设置)
/etc/elasticsearch/log4j2.properties # 日志配置文件
/etc/elasticsearch/role_mapping.yml # 索引的规则文件
/etc/elasticsearch/roles.yml # 规则文件
/etc/init.d/elasticsearch # 启动脚本
/etc/sysconfig/elasticsearch # 环境变量,包括堆大小、文件描述符。
/usr/lib/sysctl.d/elasticsearch.conf # 库文件的配置
/usr/lib/systemd/system/elasticsearch.service # systemd管理启动程序
三、安装
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html
(1)安装JAVA环境
[root@es01 ~]# yum install -y java
(2)下载安装Elasticsearch
[root@es01 ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-x86_64.rpm
[root@es01 ~]# rpm -vih elasticsearch-7.10.0-x86_64.rpm
(3)启动验证
[root@es01 ~]# systemctl start elasticsearch
[root@es01 ~]# netstat -ntlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 8568/java
tcp6 0 0 ::1:9200 :::* LISTEN 8568/java
tcp6 0 0 127.0.0.1:9300 :::* LISTEN 8568/java
tcp6 0 0 ::1:9300 :::* LISTEN 8568/java
[root@es01 ~]# curl 127.0.0.1:9200
{
"name" : "es01",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RvOKQG-xTjSh5KYT4haRdQ",
"version" : {
"number" : "7.10.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
"build_date" : "2020-11-09T21:30:33.964949Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
四、基本配置
前面安装只是基本安装,都是默认配置,我们还要根据自身情况对Elasticsearch(以下简称ES)进行配置。当然如果是生产环境,就必须考虑更多的事项。
[root@es01 ~]# vim /etc/elasticsearch/elasticsearch.yml
#集群名称(设置集群名称,想要其他节点加入同一个集群必须集群名称相同,单节点可以不配置)
cluster.name: es-cluster
#节点名字(通过此配置项来区分集群中的所有节点)
node.name: es-1
#数据目录
path.data: /data/es/data
#日志目录
path.logs: /data/es/log
#开启内存锁(在CentOS7中支持内存锁并且要修改systemd管理ES的配置文件)
bootstrap.memory_lock: true
#监听地址
network.host: 10.0.0.5
#监听端口
http.port: 9200
#配置集群节点IP
discovery.seed_hosts: ["10.0.0.5"]
修改systemd管理ES的配置文件。
[root@elkstack01 ~]# vim /usr/lib/systemd/system/elasticsearch.service # 添加以下配置
LimitMEMLOCK=infinity
[root@es01 ~]# systemctl daemon-reload
创建目录并授权
[root@es01 ~]# mkdir -p /data/es/{data,log}
[root@es01 ~]# chown -R elasticsearch.elasticsearch /data/es
启动测试
[root@es01 ~]# systemctl restart elasticsearch
[root@es01 ~]# curl 10.0.0.5:9200
{
"name" : "es-1",
"cluster_name" : "es-cluster",
"cluster_uuid" : "mBrkZUAuSfit1JYjrKRwig",
"version" : {
"number" : "7.10.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
"build_date" : "2020-11-09T21:30:33.964949Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
五、重要配置详解
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html
Elasticsearch只需很少的配置即可上手,但是在生产环境中使用集群之前,就必须考虑更多的事项。以下只详解以上配置用到的部分,其它请阅读官方文档。
1、集群名字设置
当节点与集群中的所有其它节点共享集群名称时,该节点只能加入此集群,集群默认名称是elasticsearch。
cluster.name: es-cluster
2、节点名字设置
ES使用节点名称作为ES特定实例的可读标识符,当ES启动时,节点名称默认为计算机的主机名。
node.name: es-1
可以从单个节点上用相同的ES主目录启动多个节点,此设置对于测试ES形成集群的能力很有用,但不建议用于生产环境。
3、内存锁
为了防止ES堆内存被换出,开启内存锁使用 mlockall 将进程地址空间锁定在RAM中。需要注意的是使用内存锁时,某些平台仍会交换堆外内存,为防止堆外内存交换,请禁用所有交换文件。
bootstrap.memory_lock: true
如果 mlockall 尝试分配的内存超过可用内存,则可能导致JVM或Shell会话退出,如下:
[ 128.909028] Out of memory: Kill process 7545 (java) score 279 or sacrifice child
[ 128.989845] Killed process 7787(controller) total-m:37948kB, anon-rss:8kB, file-rss:600kB, shme m-rss:0kB
[ 121.838354] Out of memory: Kill process 7545(java) score 279 or sacrifice child
[ 121.830373] Killed process 7545(java) total-m:2772612kB, anon-rss:642348kB, file-rss:228532kB, shmem-rss:0kB [ 121.831867] Out of memory: Kill process 7684 (java) score 279 or sacrifice child
[ 121.831883] Killed process 7684 (java) total-um:2772612kB, anon-rss:642736kB, file-rss:228688kB, shmem-rss:8kB
如果出现以下报错
[root@es01 ~]# tailf /data/es/log/es-cluster.log
......
[2020-12-01T11:33:38,875][ERROR][o.e.b.Bootstrap ] [es-1] node validation exception
[2] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
......
最可能的原因是运行ES的用户无权锁定内存,对于RPM包安装使用systemd管理ES的,可以通过修改systemd管理ES的配置文件解决。
[root@elkstack01 ~]# vim /usr/lib/systemd/system/elasticsearch.service # 添加以下配置
LimitMEMLOCK=infinity
[root@es01 ~]# systemctl daemon-reload
4、网络主机设置
默认情况下,ES仅绑定到环回地址,例如127.0.0.1和[:: 1],此绑定足以在服务器上运行单节点。要与其它服务器上的节点形成集群,节点需要绑定到非环回地址。
network.host: 10.0.0.5
5、发现和集群形成设置
发现和集群形成设置,主要是两个重要的配置,以便集群中的节点可以彼此发现并选举一个主节点。
(1)discovery.seed_hosts
不做任何配置,ES将绑定到可用的环回地址,并扫描本地端口9300至9305以连接在同一服务器上运行的其它节点,此行为无需进行任何配置即可提供自动集群体验,可以用于测试ES形成集群的能力。
如果要与其他主机上的节点形成集群,就需要对此配置进行设置。此配置提供了集群中其它符合主机资格的节点的列表,这些节点可能处于活动状态且可与之联系以传播发现过程。此配置接受YAML序列或群集中所有符合主机资格的节点的地址数组,每个地址可以是IP地址,也可以是通过DNS解析为一个或多个IP地址的主机名。如:
discovery.seed_hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
- [0:0:0:0:0:ffff:c0a8:10c]:9301
端口是可选的,默认为9300,可以被覆盖。
如果主机名解析为多个IP地址,则该节点将尝试在所有解析的地址处发现它。
IPv6地址必须放在方括号中。
(2)cluster.initial_master_nodes
当首次启动ES集群时,集群引导步骤将确定符合主节点资格的节点集中确定,节点集的票数将在第一次选举中进行计数。未配置发现设置,此步骤由节点自身自动执行。
由于自动引导本质上是不安全的,因此在生产模式下启动新集群时,必须明确列出符合资格的主机,这些节点的票数会在首次选举中进行计数,然后选择票数最多的为主节点,使用“cluster.initial_master_nodes”来设置列表。
cluster.initial_master_nodes:
- es-1
- es-2
- es-3
此配置通过“node.name”来标识初始主节点,确保 “cluster.initial_master_nodes” 中的值与“node.name”完全匹配。
6、堆大小设置
默认情况下,ES告诉JVM使用最小和最大的堆大小为1GB。 ES可用的堆越多,它可用于其内部缓存的内存就越多,但可供操作系统用于文件系统缓存的内存就越少。因此根据服务器自身情况设置合理的堆大小是非常重要。
ES将为JVM分配指定堆大小。通过Xms(最小堆大小)和Xmx(最大堆大小)设置进行设置,这两个设置必须彼此相等。
这些设置的值取决于服务器上可用的RAM大小。将Xmx和Xms设置为不超过物理RAM的50%, ES会出于JVM堆以外的目的而需要内存,因此为此留出内存空间是很重要。
例如,ES使用堆外缓冲区来进行网络通信,依靠操作系统的文件系统缓存来访问文件,而JVM本身也需要一些内存。如果观察ES进程使用的内存多于Xmx设置配置的限制,这是正常的。
我们可以通过jvm.options配置文件(位于/etc/elasticsearch下)来设定堆大小,单位可以是g可以是m。
[root@es01 ~]# vim /etc/elasticsearch/jvm.options
-Xms512m
-Xmx512m