1

一、介绍

  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
1

发表评论

验证码: + 19 = 23