1简介
ELK是Elasticsearch+Logstash+Kibana的合集,对外作为一个日志管理系统的开源方案,能够可靠和安全地从任何格式的任何来源获取数据,并实时搜索、分析和可视化。
1.1Elasticsearch
Elasticsearch是一个高可扩展的、开源的、全文本搜索和分析的引擎。它能够近乎实时地存储,检索和分析大量数据,通常用作底层引擎/技术,为具有复杂搜索特性和需求的应用程序提供动力。
1.1.1集群
一个集群是一个或多个节点(服务器)的集合,这些节点一起保存你的整个数据,并提供垮所有节点的联合索引和搜索功能。集群由一个唯一的名称来表示,默认情况下该名称为elasticsearch。这个名称很重要,因为节点是集群的一部分,特别是集群设置为通过集群名称加入节点的时候。
确保你没有在不同的环境里使用重复的名称,否则你可能会把节点加入到错误的集群。
1.1.2节点
一个节点是一个单独服务器,是集群的一部分,存储数据,并且参与集群的索引和搜索功能。就像一个集群,一个节点是通过一个名称被识别的,默认是在安装时分配给节点的一个随机的UUID。如果你不想用默认的名称,你可以定义任何的节点名称。这个名称对于管理集群非常重要,特别是当我们想要确定网络中的哪些服务器对应于集群中的哪些节点时。
1.1.3索引
一个索引是一些有类似特征的文档的集合。索引由一个名称标识(必须是小写的),该名称用于对索引中的文档执行索引、搜索、更新和删除操作。
1.1.4文档
一个文档是一个可以建立索引的基本单元。文档是用JSON表示的,这是一种无处不在的互联网数据交换格式。
1.1.5碎片和副本
索引可能存储大量数据,超出单个节点的硬件限制。例如,一个包含10亿个文档的索引占用了1TB的磁盘空间,它可能不适合于单个节点的磁盘,或者可能太慢,无法单独为单个节点提供搜索请求。
为了解决这个问题,Elasticsearch提供了将索引细分为多个碎片的功能。当你创建索引时,可以简单地定义你想要的碎片的数量。每个碎片本身都是一个功能齐全、独立的“索引”,可以驻留在集群中的任何节点上。
碎片之所以重要,有两个主要原因:
- 它允许你水平地分割/缩放内容卷
- 它允许你在碎片(可能在多个节点上)之间分发和并行化操作,从而提高性能/吞吐量
碎片如何分布以及如何将其文档聚合回搜索请求的机制完全由Elasticsearch管理,对用户来说是透明的。
在任何时候都可能出现故障的网络/云环境中,有一个故障转移机制是非常有用的,强烈建议在碎片/节点脱机或因任何原因消失的情况下使用该机制。为此,Elasticsearch允许你将索引碎片的一个或多个副本复制到所谓的复制碎片中,或简称为副本。
副本之所以重要,有两个主要原因:
- 它提供了在碎片/节点失败时的高可用性。出于这个原因,需要注意的是,复本碎片从来不与它的原始/主碎片在同一个节点上分配。
- 它允许你扩展搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
总而言之,每个索引可以分成多个碎片。一个索引也可以被复制零次(意思是没有副本)或多次。一但复制,每个索引将具有主碎片(原始碎片)和复制碎片(主碎片的副本)。
在创建索引时,每个索引可以定义碎片和副本的数量。创建索引之后,还可以随时动态更改副本的数量。你可以使用_shrink和_split api更改现有索引的碎片数量,但是这不是一项简单的任务,预先计划正确的碎片数量是最佳方法。
默认情况下,Elasticsearch中的每个索引分配5个主碎片和1个副本,这意味着如果集群中至少有两个节点,那么索引将有5个主碎片和5个副本碎片(1个完整副本),每个索引总共有10个碎片。
1.2Logstash
Logstash是一个功能强大的工具,可与各种部署集成。它提供了大量插件,可帮助我们解析,丰富,转换和缓冲来自各种来源的数据。
1.2.1管道
logstash的事件处理管道通常具有一个或多个的输入插件、过滤器、输出插件。logstash的事件处理通常分为三个阶段:输入→过滤器→输出。
1.2.2输入
使用输入插件将数据导入logstash。一些更常用的输入是:
- file:从文件系统上的文件读取,与UNIX命令非常相似 tail -0F。
- syslog:在已知端口514上侦听syslog消息并根据RFC3164格式进行解析。
- redis:使用redis通道和redis列表从redis服务器读取。
- beats:处理 Beats发送的事件。
本文介绍的是beats输入插件。
有关可用输入的更多信息,请参阅 输入插件。
1.2.3过滤器
过滤器是Logstash管道中的中间处理设备。可以将过滤器与条件组合,以便在事件满足特定条件时对其执行操作。一些有用的过滤包括:
- grok:解析并构造任意文本。Grok是目前Logstash中将非结构化日志数据解析为结构化和可查询内容的最佳方式。有了内置于Logstash的120种模式,很可能会找到满足需求的模式!
- mutate:对事件字段执行常规转换。可以重命名,删除,替换和修改事件中的字段。
- drop:完全删除事件。
- clone:制作事件的副本,可能添加或删除字段。
- geoip:添加有关IP地址的地理位置的信息。
有关可用过滤器的详细信息,请参阅 过滤器插件。
1.2.4输出
输出是Logstash管道的最后阶段。事件可以通过多个输出,但是一旦所有输出处理完成,事件就完成了它的执行。此处介绍最长用的输出——Elasticsearch:将事件数据发送到Elasticsearch。如果计划以高效,方便且易于查询的格式保存数据,Elasticsearch是最佳选择。
有关可用输出的更多信息,请参阅 输出插件。
1.2.5编解码器
编解码器基本上是流过滤器,可以作为输入或输出的一部分。使用编解码器可以轻松地将消息传输与序列化过程分开。流行的编解码器包括json,msgpack,plain。
- json:以JSON格式编码或解码数据。
- multiline:将多行文本事件(如java异常和堆栈跟踪消息)合并到一个事件中。
有关可用编解码器的更多信息,请参阅 Codec插件。
1.3kibana
Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。使用Kibana搜索,查看和与存储在Elasticsearch索引中的数据进行交互。使用Kibana可以轻松执行高级数据分析,并在各种图表,表格和地图中可视化数据。
Kibana使可以轻松理解大量数据。其简单的基于浏览器的界面能够快速创建和共享动态仪表板,实时显示Elasticsearch查询的更改。
1.4filebeat
filebeat是轻量级数据托运人,用于转发和集中日志数据。Filebeat作为代理安装在服务器上,监视指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。
Filebeat的工作原理:启动Filebeat时,它会启动一个或多个输入,这些输入将查找日志数据指定的位置。对于Filebeat找到的每个日志,Filebeat启动一个收集器。每个收集器为新内容读取单个日志,并将新日志数据发送到libbeat,libbeat聚合事件并将聚合数据发送到Filebeat配置的输出。
2安装
在开始之前:
需要注意的是,在正式的生产环境上,ELK平台的每个服务都最好拥有自己的独有的服务器,特别是每个Elasticsearch节点,因为生产上的es出于性能和平台健壮性考虑,对系统配置有要求,比如内存锁、禁用交换区间、最大文件描述符等系统设置。Logstash对系统资源占用比较大,较好的方式是配给一台性能较好的服务器,而在每台需要收集日志的服务器上安装filebeat,filebeat是轻量级的,对系统的资源占用比较低。
2.1安装ELasticsearch
要下载和安装Elasticsearch,首先要明确服务器的操作系统,不同的操作系统使用不同的系统命令来下载和启动Elasticsearch。
下面只列出最常用的服务器操作系统对应的命令(deb为Debian/Ubuntu, rpm为Redhat/Centos/Fedora):
deb
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.deb
sudo dpkg -i elasticsearch-6.6.0.deb
rpm
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm
sudo rpm -i elasticsearch-6.6.0.rpm
第一行命令是下载Elasticsearch安装包
第二行命令是用root账户安装Elasticsearch
安装后Elasticsearch不会自动启动。如何启动和停止Elasticsearch取决于服务器系统使用sysvinit还是systemd(由较新的发行版使用)。可以通过运行以下命令来判断正在使用的是哪个:
ps -p 1
- sysvinit
使用以下命令设置Elasticsearch开机自启动:
sudo chkconfig --add elasticsearch
使用以下命令启动和停止Elasticsearch:
sudo -i service elasticsearch start
sudo -i service elasticsearch stop
- systemd
使用以下命令配置ELasticsearch随系统开机自启动:
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
使用以下命令启动和停止Elasticsearch:
sudo systemctl start elasticsearch.service
sudo systemctl stop elasticsearch.service
使用以下命令测试ELasticsearch守护进程是否已启动并运行:
curl http://127.0.0.1:9200
正确情况下将看到类似下面的响应:
{
"name" : "QtI5dUu",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "DMXhqzzjTGqEtDlkaMOzlA",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "00d8bc1",
"build_date" : "2018-06-06T16:48:02.249996Z",
"build_snapshot" : false,
"lucene_version" : "7.3.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
安装后的配置文件、日志、数据目录位置:
Type | Description | Default Location | Setting |
---|---|---|---|
home | Elasticsearch主目录或者$ES_HOME
|
/usr/share/elasticsearch | |
bin | 二进制脚本包括启动节点的elasticsearch和安装插件的elasticsearch插件 | /usr/share/elasticsearch/bin | |
config | 配置文件,包括elasticsearch.yml
|
/etc/elasticsearch | ES_PATH_CONF |
conf | 环境变量包括堆大小、文件描述符。 | deb:/etc/default/elasticsearch;rpm:/etc/sysconfig/elasticsearch | |
data | 节点上分配的每个索引/碎片的数据文件的位置。可以容纳多个位置。 | /var/lib/elasticsearch | path.data |
logs | 日志文件位置 | /var/log/elasticsearch | path.logs |
plugins | 插件文件的位置。每个插件将包含在子目录中。 | /usr/share/elasticsearch/plugins | |
repo | 共享的文件系统存储库位置。可以容纳多个位置。文件系统存储库可以放在这里指定的任何目录的任何子目录中。 | 未配置 | path.repo |
2.2安装Logstash
同Elasticsearch一样,选择适用于自己的服务器系统的安装包(deb为Debian/Ubuntu, rpm为Redhat/Centos/Fedora):
deb:
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.deb
sudo dpkg -i logstash-6.6.0.deb
rpm:
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.rpm
sudo rpm -i logstash-6.6.0.rpm
同样的Logstash安装后不会自启动。如何启动和停止Logstash取决于服务器系统使用的是systemd还是sysvinit。
systemd:
sudo systemctl start logstash.service
sudo systemctl stop logstash.service
sysvinit:
sudo /etc/init.d/logstash start
sudo /etc/init.d/logstash stop
Debian软件包和RPM软件包都将配置文件,日志和设置文件放在系统的适当位置:
Type | Description | Default Location | Setting |
---|---|---|---|
home | Logstash安装的主目录 | /usr/share/logstash | |
bin | 二进制脚本包括启动logstash和logstash-plugin安装插件 | /usr/share/logstash/bin | |
settings | 配置文件,包括logstash.yml ,jvm.options ,startup.options
|
/etc/logstash | path.settings |
conf | logstash的管道配置文件 | /etc/logstash/conf.d/*.conf | 参见/etc/logstash/pipelines.yml
|
data | 节点上分配的每个索引/碎片的数据文件的位置。可以容纳多个位置。 | /var/lib/logstash | path.data |
logs | 日志文件位置 | /var/log/logstash | path.logs |
plugins | 插件文件的位置。每个插件将包含在子目录中。 | /usr/share/logstash/plugins | path.plugins |
2.3安装Kibana
同样对于最常见的服务器操作系统给出两种不同的安装命令(deb为Debian/Ubuntu, rpm为Redhat/Centos/Fedora):
deb:
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.0-amd64.deb
sudo dpkg -i kibana-6.6.0-amd64.deb
rpm:
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.0-x86_64.rpm
sudo rpm --install kibana-6.6.0-x86_64.rpm
安装后Kibana不会自启动。如何启动和停止Kibana取决于服务器操作系统使用的是sysvinit还是systemd(由较新的发行版使用)。可以通过运行以下命令来判断正在使用哪个:
ps -p 1
sysvinit:
设置Kibana随服务器开机自启动:
sudo chkconfig --add kibana
使用以下命令启动和停止Kibana:
sudo -i service kibana start
sudo -i service kibana stop
systemd
设置Kibana随服务器开机自启动使用以下命令:
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable kibana.service
启动和停止Kibana使用以下命令:
sudo systemctl start kibana.service
sudo systemctl stop kibana.service
Debian软件包和RPM软件包都将配置文件,日志和数据目录放在系统的适当位置:
Type | Description | Default Location | Setting |
---|---|---|---|
home | Kibana安装的主目录 | /usr/share/kibana | |
bin | 二进制脚本包括启动kibana和kibana-plugin安装插件 | /usr/share/kibana/bin | |
config | 配置文件,包括kibana.yml
|
/etc/kibana | |
data | Kibana及其插件写入磁盘的数据文件的位置 | /var/lib/kibana | path.data |
optimize | 透明的源代码。某些管理操作(例如插件安装)导致源代码在运行中重新传输。 | /usr/share/kibana/optimize | |
plugins | 插件文件的位置。每个插件将包含在子目录中。 | /usr/share/kibana/plugins |
2.4安装filebeat
同样对于最常见的服务器操作系统给出两种不同的安装命令(deb为Debian/Ubuntu, rpm为Redhat/Centos/Fedora):
deb:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.0-amd64.deb
sudo dpkg -i filebeat-6.6.0-amd64.deb
rpm:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.0-x86_64.rpm
sudo rpm -vi filebeat-6.6.0-x86_64.rpm
启动filebeat:
sudo service filebeat start
使用init.d脚本在deb或rpm上启动filebeat时无法指定命令参数,要指定参数,请在前台启动filebeat。
3配置
3.1配置es
在生产环境上es需要配置一些比较重要的本身设置和系统设置。
3.1.1配置日志和数据的文件夹位置
如果这些重要的文件夹保留在其默认位置,在升级es到新版本时,存在数据丢失的高风险,在生产使用中,最好更改数据和日志文件夹的位置。
path:
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
path.data可以设置为多条路径,在这种情况下,所有的路径将被用于存储数据,但是属于单个碎片文件将全部存储在相同的数据路径上。
path:
data:
- /mnt/elasticsearch_1
- /mnt/elasticsearch_2
- /mnt/elasticsearch_3
3.1.2配置集群名称
节点只能在与集群中其他节点拥有共同的集群名称才被允许加入集群。默认情况下,cluster.name:elasticsearch,我们应该修改为适当的集群名称。确保在不要在不同的环境中重用相同的集群名称,否则会导致节点加入错误的集群。
3.1.3配置节点名称
默认情况下,es将使用随机生成的UUID的前七个字符作为节点id(即节点名称)。节点名称是持久的,在节点重新启动时不会更改,因此默认节点名称也不会更改。我们应该配置一个更有意义的名称,便于管理集群。
node.name: node_1
node.name,也可以设置为服务器的主机名:
node.name: $ {HOSTNAME}
3.1.4配置network.host
默认情况下,Elasticsearch仅绑定到环回地址-例如127.0.0.1和[::1],这足以在服务器上运行单个开发节点。为了与在其他服务器上的节点形成集群,节点需要绑定到非环回地址。一般情况下,为了允许外部能够访问es集群,network.host这样设置:
network.host: 0.0.0.0
只要我们提供了自定义的network.host设置,Elasticsearch就会假定我们从开发模式转移到生产模式,并将许多系统启动检查从警告升级到异常。
3.1.5发现设置
Elasticsearch使用名为"Zen Discovery"的自定义发现机制实现节点到节点的集群形成和主节点选举。在投入生产之前,应该配置两个重要的发现设置。
-
discovery.zen.ping.unicast.hosts
开箱即用,没有进行任何的网络配置时,Elasticsearch将绑定到可用的环回地址,并将扫描端口9300到9305以尝试连接到在同一服务器上运行的其他节点。这提供了自动集群体验,无需进行任何配置。
当需要与其他服务器上的节点形成集群时,必须提供集群中可能是活动的和可接触的其他节点的种子列表:
discovery.zen.ping.unicast.hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
如果未指定端口,将默认使用transport.profiles.default.port和transport.tcp.port。
解析为过个IP地址的主机名,将尝试所有已解析的地址。
-
discovery.zen.minimum_master_nodes
为防止数据丢失,必须配置discovery.zen.minimum_master_nodes设置,以便为了形成集群每个符合主节点的节点都知道最大主节点数。如果没有此设置,遭受网络故障的集群可能会将集群拆分为两个独立的集群——分裂的大脑,这将导致数据丢失。为了避免脑裂,应将此设置设为法定数量的符合主节点的节点:
(master_eligible_nodes / 2) + 1
换句话说,如果集群中三个符合主节点的节点,则应将最小主节点设置为(3 / 2) + 1:
discovery.zen.minimum_master_nodes: 2
因此可见集群中符合主节点的节点数应该为奇数。集群中节点的类型有客户端节点、数据节点、主节点。默认情况下,节点同时据有这三种属性。各种节点的分工参考:https://www.cnblogs.com/sunfie/p/9598464.html。
更详细的解释参见避免脑裂。
3.1.6设置堆大小
默认情况下,Elasticsearch设置JVM使用最大和最小为1GB的堆。生产环境时,配置堆大小确保Elasticsearch有足够的可用堆是非常重要的。ELasticsearch将通过设置最小堆大小和最大堆大小分配jvm.options中指定的整个堆。最大堆大小和最小堆大小的值取决于服务器上可用的RAM的量。好的经验法则是:
- 将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等。
- Elasticsearch可用的堆越多,它可用于缓存的内存就越多。但是请注意,过多的堆可能会使服务陷入长时间的垃圾收集暂停。
- 设置Xmx为不超过物理RAM的50%,以确保有足够的物理RAM用于内核文件系统缓存。
- 不要设置Xmx为JVM用于压缩对象指针的截止值之上。确切的截止值不同但是接近32GB。
- 更好的是,尽量保持低于零基础压缩oops的阈值,确切的截止值有所不同,但是大多数系统上26GB是安全的,但在某些系统上可高达30GB。
以下是如何通过jvm.options文件设置堆大小的示例:
-Xms2g
-Xmx2g
将最小堆大小设置为2g
将最大堆大小设置为2g
3.1.7设置JVM堆转储路径
默认情况下,Elasticsearch配置JVM将内存异常转储到默认的数据目录。如果这个路径不适合接受堆转储,应该修改在jvm.options文件中的-XX:HeapDumpPath=...配置项。如果指定目录,JVM将根据正在运行的实例PID为堆转储文件生成文件名。如果指定固定文件名,则当JVM需要在内存不足异常上执行堆转储时,该文件不能存在,否则堆转储将失败。
3.1.8设置GC日志
默认情况下,ELasticsearch启用GC日志。这些配置在jvm.options文件中且默认使用与ELasticsearch默认日志的相同位置。默认配置每64 MB轮换一次日志,最多可占用2 GB的磁盘空间。
3.1.9配置临时目录
默认情况下,Elasticsearch使用启动脚本在系统临时目录下创建的专用临时目录。
在某些Linux发行版上,系统实用程序将清除/tmp下的文件和目录,如果它们最近未被访问过。如果长时间不使用需要临时目录的功能,则可能导致在Elasticsearch运行时删除其专用的临时目录。如果随后使用需要临时目录的功能,则会导致问题。
如果使用deb或rpm包安装Elasticsearch并在systemd下运行,那么Elasticsearch使用的专用临时目录将从定期清理中排除。
但是如果打算使用.tar.gz包在Linux上运行一段时间,那么应该考虑为ELasticsearch创建一个专用的临时目录,该目录不在定期清除旧文件和目录的路径下。此目录应具有权限,以便只有运行ELasticsearch的用户才能访问它。 然后在启动Elasticsearch之前将环境变量$ES_TEMDIR设置为指定该目录。
3.1.10配置JVM致命错误日志位置
默认情况下,ELasticsearch将JVM配置为将致命错误日志写入到默认的日志记录目录。这些是JVM在遇到致命错误时生成的日志。如果该路径不适合接收这种日志,则应该在jvm.options文件中修改-XX:ErrorFile=...到备用路径。
3.2重要的系统配置
理想情况下,ELasticsearch应该在服务器上单独运行,并使用它可用的所有资源。为此,需要配置操作系统以允许运行ELasticsearch的用户访问比默认情况下允许的资源更多的资源。
在投入生产之前,必须考虑以下设置:
- 禁用交换区间
- 增加文件描述符
- 确保足够的虚拟内存
- 确保足够的线程
- JVM DNS缓存设置
- 不使用noexec挂载的临时目录
默认情况下, ELasticsearch假定处于开发模式下。如果未正确配置上述任何配置,则会向日志文件写入警告,但是能够启动并运行ELasticsearch节点。
一旦配置了网络配置network.host,Elasticsearch就会假定正在转向生产环境并将上述警告升级为异常。这些异常将阻止Elasticsearch节点启动。这是一项重要的安全措施,可确保不会因服务器配置错误而丢失数据。
3.2.1配置系统设置
哪里配置系统设置取决于哪个包安装的Elasticsearch和操作系统。
1、当使用.zip或者.tar.gz包时,系统设置可以如下配置:
- 临时配置,使用ulimit命令:
在Linux系统上, ulimit可以用于临时更改资源限制。通常需要root权限设置ulimit在运行Elasticsearch之前。例如打开文件句柄(ulimit -n)的数量设置为65536,可以执行以下操作:
sudo su
ulimit -n 65536
su elasticsearch
切换root用户
更改打开文件最大数量
切换elasticsearch用户以启动Elasticsearch
新限制只在当前会话期间起作用。
- 永久配置,修改/etc/security/limits.conf文件
在Linux系统上,可以通过编辑/etc/security/limits.conf文件为特定用户设置持久限制。要将elasticsearch用户的最大打开文件数设置为65536, 请将以下行添加到limits.conf文件中:
elasticsearch - nofile 65536
此更改仅在elasticsearch用户下次打开新会话时生效。
注意:ubuntn系统对于由init.d启动的进程忽略limits.conf文件。要启用limits.conf文件,编辑/etc/pam.d/su文件,取消下面一行的注释:
# session required pam_limits.so
2、使用RPM或Debian软件包时,大多数系统设置都在系统配置文件中设置。但是,使用systemd的系统要求在systemd配置文件中指定系统限制。
使用RPM或者Debian软件包时,可以在系统配置文件中指定系统设置和环境变量,该文件位于:
- RPM: /etc/sysconfig/elasticsearch
- Debian: /etc/default/elasticsearch
但是,对于使用systemd系统,需要通过systemd指定系统限制。
systemd服务文件(/usr/lib/systemd/system/elasticsearch.service)包含默认应用的限制。
要覆盖它们,请添加一个名为/etc/systemd/elasticsearch.service.d/override.conf文件或者可以运行sudo systemctl edit elasticsearch命令,此命令在默认编辑器中自动打开上述文件。设置文件中的任何更改,例如:
[Service]
LimitMEMLOCK=infinity
完成修改后,运行以下命名重载单元:
sudo systemctl daemon-reload
3.2.2禁用交换区间
大多数操作系统尝试使用尽可能多的内存来存储文件系统缓存,并急切地交换掉未使用的应用程序内存。这可能导致部分JVM堆甚至其可执行页面被换出到磁盘。
交换对性能,节点稳定性非常不利,应该不惜一切代价避免。它可能导致垃圾收集持续数分钟而不是毫秒,并可能导致节点响应缓慢甚至断开与集群的连接。在弹性分布式系统中,让操作系统终止节点更有效。
有三种禁用交换的方法,分别是完全禁用交换区间、最小化交换区间、内存锁定。首选选项是完全禁用交换区间,如果这不是你的可选项,那么选择最小化交换区间还是选择内存锁定取决于你的环境。
- 禁用所有交换文件
通常Elasticsearch是在服务器上运行的唯一服务,其内存使用量由JVM选项控制,应该没有必要启用交换。在Linux系统上,可以通过以下命令暂时禁用交换:
sudo swapoff -a
要永久禁用它,请编辑/etc/fstab文件并注释掉所有包含单词swap
的行。
-
配置swappiness
Linux系统上可用的另一选项是确保将vm.swappiness的系统值设置为1。这降低了内核交换倾向,在正常情况下不应导致交换,同时扔允许整个系统在紧急情况下交换。 -
启用bootstrap.memory_lock
另一种选择是在Linux/Unix系统上使用mlockall,从而防止Elasticsearch内存被换出。可以将以下行添加到config/elasticsearch.yml文件中:
bootstrap.memory_lock: true
启动Elasticsearch后,可以在Kibana界面Dev Tools / Console下通过以下请求的响应值检查mlockall是否已成功应用此设置:
GET _nodes?filter_path=**.mlockall
如果你看到mlockall是false,那么意味着mlockall请求失败了。我们还将在日志中看到包含更多信息的其中包含Unable to lock JVM Memory的一行。
在Linux/Unix系统上,最可能的原因是运行ELasticsearch的用户没有锁定内存的权限。可以授予如下:
-
.zip和.tar.gz:在启动ELasticsearch之前使用root权限设置ulimit -l unlimited,或者在/etc/security/limits.conf文件中设置
memlock:unlimited
。 -
RPM和Debian:在系统配置文件(deb:/etc/default/elasticsearch, rpm:/etc/sysconfig/elasticsearch)中设置
MAX_LOCKED_MEMORY=unlimited
-
使用systemd的系统:在系统配置中设置
LimitMEMLOCK=infinity
另一种mlockall失败的可能原因是JNA临时目录(通常是子目录 /tmp)是使用noexec选项挂载的。这可以通过使用ES_JAVA_OPTS环境变量为JNA指定新的临时目录来解决:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>"
或者在jvm.options配置文件中设置这个JVM参数。
3.2.3文件描述符
Elasticsearch使用大量文件描述符或文件句柄。用完文件描述符可能是灾难性的,最有可能导致数据丢失。确保将运行ELasticsearch的用户打开文件描述符数量限制增加到65536或者更高。
对于.zip和.tar.gz包, 在启动Elasticsearch之前以root用户身份设置ulimit -n 65536或者在/etc/security/limits.conf文件中设置nofile为65536。
RPM和Debian软件包已将文件描述符的最大数量默认设置为65536,无需进一步设置。
可以使用Node Stats API检查每个节点的max_file_descriptors配置项,在Kibana界面Dev Tools / Console下使用以下:
GET _nodes/stats/process?filter_path=**.max_file_descriptors
3.2.4虚拟内存
Elasticsearch 默认使用一个mmapfs
目录来存储它的索引。操作系统默认对mmap计数限制可能太低,这可能导致内存不足异常。
在Linux系统,你可以以root用户身份运行以下命令来增加限制:
sysctl -w vm.max_map_count=262144
要永久设置这个值,更新位于/etc/sysctl.conf文件中的vm.max_map_count设置的值。要在重新启动后进行验证,请运行:
sysctl vm.max_map_count
RPM和Debian软件包将自动配置此设置,无需进一步配置。
3.2.5线程数
ELasticsearch为不同类型的操作使用许多线程池。它随时可以创建新的线程当有需要时,这是很重要。确保ELasticsearch用户可以创建的线程数至少为4096。
这可以通过在ELasticsearch启动之前以root用户身份设置ulimit -u 4096或者通过设置在/etc/security/limits.conf文件中的nproc为4096。
在systemd下作为服务运行时,包分发版将自动配置Elasticsearch进程的线程数。不需要额外的配置。
3.2.6DNS缓存设置
Elasticsearch运行安全管理器。有了安全管理器,JVM默认无限期地缓存正主机名解析,默认缓存负主机名解析10秒。Elasticsearch使用默认值覆盖此行为,将正向查找缓存60秒,负查找缓存10秒。这些值应适用大多数环境,包括DNS分辨率随时间变化的环境。
3.2.7JNA临时目录不用noexec挂载(这只适用于Linux)
Elasticsearch使用Java本机访问(JNA)库来执行一些与平台相关的本机代码。在Linux上,支持这个库的本地代码在运行时从JNA存档中提取。默认情况下,此代码被提取到Elasticsearch临时目录,该目录默认为/tmp的子目录。或者这个路径可以用JVM标志-Djna.tmpdir=<path>来控制。由于本机库作为可执行文件映射到JVM虚拟地址空间,因此noexec不能挂载提取此代码的位置的底层挂载点,因为这会阻止JVM进程将此代码映射为可执行文件。在一些硬Linux安装中,这是/tmp的默认挂载选项。使用noexec挂载底层挂载的一个迹象是,在启动时JNA将无法加载,抛出java.lang.UnsatisfiedLinkerErro异常,带有一个错误消息类似 failed to map segment from shared object。注意,不同JVM版本之间的异常消息可能不同。此外,Elasticsearch依赖于通过JNA执行本机代码的组件将失败,消息表明这是because JNA is not available。如果您看到这样的错误消息,您必须重新挂载用于JNA的临时目录,以便不使用noexec挂载。
3.3Logstash配置
logstash有两种类型的配置文件:管道配置文件(用于定义logstash处理管道)和设置文件(用于指定控制Logstash启动和执行的选项)。
3.3.1管道配置文件
创建管道配置文件来定义Logstash处理管道的各个阶段。deb和rpm软件安装包将管道配置文件放在/etc/logstash/conf.d目录下。
在管道配置文件中,主要配置输入——过滤器——输出各个阶段的配置。
- 输入:配置为数据来源于filebeat,在端口5044上监听filebeat发送过来的数据。
- 过滤:对于nginx或Apache等日志使用grok和geoip插件分析和丰富日志数据,对于各个系统中的输出日志,保存原数据格式,暂未解析。
- 输出:配置存储日志数据的elasticsearch的地址(IP:PORT)。如果启用了安全性,配置了用户,还需要配置登录名和面码。
3.3.2设置文件
Logstash的设置文件包括以下文件:
- logstash.yml:包含logstash的配置项,可以在此文件中配置参数,而不是在命令行传递参数。在命令行传递的任何参数都会覆盖logstash.yml文件中的相应设置。
- piplines.yml:包含了在单个logstash实例中运行多个管道的框架和说明。
- jvm.options:包含JVM配置项。使用此文件设置总堆空间的初始值和最大值。
- log4j2.properties:包含log4j2库的默认设置。
- startup.options(Linux):包含在/usr/share/logstash/bin目录下的system-install脚本使用的选项,为系统建立相应的启动脚本。安装Logstash软件包时,system-install脚本将在安装过程结束时执行,并使用指定的设置startup.options来设置用户,组,服务名称和服务描述等选项。
3.4kibana配置
Kibana的配置项位于kibana.yml文件中。主要配置好要连接到的ELasticsearch的地址(IP和PORT)。
4破解es升级许可证
es是开源的,但是在一些高级功能上是收费的。新版的es安装后默认安装了X-pack高级插件,但是,默认安装后的es带有的是基础许可证,很多功能是不可使用的。在条件许可下,推荐使用正版,但本次我们是学习为主,下面介绍一下破解方案,以及升级许可证。
4.1X-pack破解
1、获取x-pack-core-6.6.0.jar压缩包(安装的版本不同,对应的后面的版本号不同),位于elasticsearch主安装目录下的/modules/x-pack-core/目录下。
2、使用luyten反编译x-pack-core-6.6.0.jar:
- 下载luyten
- 下载页面: https://github.com/deathmarine/Luyten/releases
软件下载下来,打开软件,把x-pack-core-6.6.0.jar丢进去,我们就能看到jar包的源代码了。
我们需要把2个文件提取出来进行修改:
- org.elasticsearch.license.LicenseVerifier
- org.elasticsearch.xpack.core.XPackBuild
3、修改LicenseVerifier
LicenseVerifier 中有两个静态方法,这就是验证授权文件是否有效的方法,我们把它修改为全部返回true。
package org.elasticsearch.license;
import java.nio.*;
import org.elasticsearch.common.bytes.*;
import java.util.*;
import java.security.*;
import org.elasticsearch.common.xcontent.*;
import org.apache.lucene.util.*;
import org.elasticsearch.core.internal.io.*;
import java.io.*;
public class LicenseVerifier
{
public static boolean verifyLicense(final License license, final byte[] encryptedPublicKeyData) {
return true;
}
public static boolean verifyLicense(final License license) {
return true;
}
}
4、修改XPackBuild
XPackBuild 中最后一个静态代码块中 try的部分全部删除,这部分会验证jar包是否被修改。
package org.elasticsearch.xpack.core;
import org.elasticsearch.common.io.*;
import java.net.*;
import org.elasticsearch.common.*;
import java.nio.file.*;
import java.io.*;
import java.util.jar.*;
public class XPackBuild
{
public static final XPackBuild CURRENT;
private String shortHash;
private String date;
@SuppressForbidden(reason = "looks up path of xpack.jar directly")
static Path getElasticsearchCodebase() {
final URL url = XPackBuild.class.getProtectionDomain().getCodeSource().getLocation();
try {
return PathUtils.get(url.toURI());
}
catch (URISyntaxException bogus) {
throw new RuntimeException(bogus);
}
}
XPackBuild(final String shortHash, final String date) {
this.shortHash = shortHash;
this.date = date;
}
public String shortHash() {
return this.shortHash;
}
public String date() {
return this.date;
}
static {
final Path path = getElasticsearchCodebase();
String shortHash = null;
String date = null;
Label_0157: {
shortHash = "Unknown";
date = "Unknown";
}
CURRENT = new XPackBuild(shortHash, date);
}
}
5、编译修改后的Java文件
javac -cp "/usr/share/elasticsearch/modules/x-pack-core/x-pack-core-6.6.0.jar:/usr/share/elasticsearch/lib/" LicenseVerifier.java
javac -cp "/usr/share/elasticsearch/modules/x-pack-core/x-pack-core-6.6.0.jar:/usr/share/elasticsearch/lib/" XPackBuild.java
需要注意的是,编译这两个文件的时候需要指定依赖包的位置, 如果你的位置和我的有区别,请注意修改。
6、将编译好的class文件重新压回x-pack-core-6.6.0.jar
解压x-pack-core-6.6.0.jar 会得到一个 x-pack-core-6.6.0目录,按照其位置将编译好的2个 class文件放到我们目录里面,替换老的。
将修改过的 x-pack-core-6.6.0目录重新压成jar包。
jar -cvf x-pack-core-6.6.0.jar -C x-pack-core-6.6.0 .
7、将重新压缩成的jar包替换掉老的。
4.2升级许可证
1、 先从官网申请basic授权文件
https://license.elastic.co/registration
2、 授权文件修改
{
"uid": "6fb96d6b-938c-45ff-9ce7-6b53b39cd7dd",
"type": "platinum", # 修改授权为白金版本
"issue_date_in_millis": 1530489600000,
"expiry_date_in_millis": 2855980923000, #修改到期时间为2060-07-02
"max_nodes": 100, # 修改最大节点数
"issued_to": "xxxx",
"issuer": "Web Form",
"signature":"AAAAAwAAAA3PP60wKNtAvRmuCGdSAAABmC9ZN0hjZDBGYnVyRXpCOW5Bb3FjZDAxOWpSbTVoMVZwUzRxVk1PSmkxaktJRVl5MUYvUWh3bHZVUTllbXNPbzBUemtnbWpBbmlWRmRZb25KNFlBR2x0TXc2K2p1Y1VtMG1UQU9TRGZVSGRwaEJGUjE3bXd3LzRqZ05iLzRteWFNekdxRGpIYlFwYkJiNUs0U1hTVlJKNVlXekMrSlVUdFIvV0FNeWdOYnlESDc3MWhlY3hSQmdKSjJ2ZTcvYlBFOHhPQlV3ZHdDQ0tHcG5uOElCaDJ4K1hob29xSG85N0kvTWV3THhlQk9NL01V",
"start_date_in_millis": 1530489600000
}
3、通过API接口上传
curl -XPUT ‘http://es-ip:port/_xpack/license’ -H “Content-Type: application/json” -d @<path>/license.json
破解教程参考的博客:https://www.xiaocaicai.com/2018/08/x-pack-6-4-0-%E7%A0%B4%E8%A7%A3/
5配置内置用户和启用es安全功能
X-Pack安全性提供内置用户凭据,以帮助您启动和运行。这些用户具有一组固定的权限,在设置密码之前无法进行身份验证。该elastic
用户可以用来设置所有内置的用户密码:
- elastic:内置的超级用户
- kibana:用户kibana用于连接Elasticsearch并与之通信
- logstash_system:logstash用户在ELasticsearch中存储监视信息时使用
- beats_system:Beats在Elasticsearch中存储监控信息时使用的用户。
- apm_system:APM服务器在Elasticsearch中存储监视信息时使用的用户。
- remote_monitoring_user:Metricbeat用户在Elasticsearch中收集和存储监控信息时使用。它具有remote_monitoring_agent和 remote_monitoring_collector内置的角色。
这些内置用户存储在.security由X-Pack安全性管理的特殊索引中。这意味着,如果更改了密码或禁用了用户,则该更改将自动反映在群集中的每个节点上。这也意味着如果.security索引被删除或从快照恢复,那么应用的任何更改都将丢失。
安装ELasticsearch时,如果elastic用户还没有密码,则使用默认的引导密码。引导密码是一个临时密码,使我们可以运行设置所有内置用户密码的工具。
5.1设置内置用户密码
必须为所有内置用户设置密码。
elasticsearch-setup-passwords工具是第一次设置内置用户密码的最简单方法。它使用elastic用户的引导密码来运行用户管理API请求。例如,在窗口模式运行以下命令,这提示你为elastic,kibana,logstash_system,beats_system,apm_system,和 remote_monitoring_user用户输入新密码:
bin / elasticsearch-setup-passwords interactive
注意:为elastic用户设置密码后,引导密码不再有效。不能再次运行elasticsearch-setup-passwords命令。
5.2配置验证
现在已经设置了内置用户,我们需要决定如何管理所有其他用户。
Elastic Stack对用户进行身份验证以确保它们有效。身份验证过程由域进行处理。您可以使用一个或多个内置领域,例如本机,文件,LDAP,PKI,Active Directory,SAML或Kerberos领域。或者,您可以创建自己的自定义领域。
通常,我们通过xpack.security.authc.realms 在elasticsearch.yml文件中添加设置来配置域。但是,如果未配置其他域,则默认情况下可以使用本机域。因此,无需在本教程中执行任何额外的配置步骤,可以直接跳转到创建用户!
5.3启用es的安全性能
使用使用许可证时,默认情况下会禁用elasticsearch的安全功能。要启用它们,将xpack.security.enable:true设置添加到elasticsearch.yml配置文件中。
启用Elasticsearch安全功能时,默认情况下会启用基本身份验证。要与群集通信,您必须指定用户名和密码。除非您启用匿名访问,否则所有不包含用户名和密码的请求都将被拒绝。
5.4将内置用户添加到kibana
启用Elasticsearch安全功能后,用户必须使用有效的用户ID和密码登录Kibana。
Kibana还执行一些需要使用内置kibana用户的任务。
1、配置Kibana以使用我们创建的kibana用户和密码:
- 如果不介意在配置文件中显示密码,请在kibana.yml配置文件中添加以下配置:
elasticsearch.username:kibana
elasticsearch.password:your_password
- 如果不想将用户ID和密码放在kibana.yml文件中,请将它们存储在密钥库中。运行以下命令来创建kibana密钥库并添加安全设置:
./bin/kibana-keystore create
./bin/kibana-keystore add elasticsearch.username
./bin/kibana-keystore add elasticsearch.password
出现提示时,请为这些设置指定内置用户kibana和它的密码。启动Kibana时会自动应用这些设置。
2、重启kibana
5.5将用户信息添加到Logstash
为了使Logstash成功将数据发送到Elasticsearch,必须在Logstash配置文件中配置其身份验证凭据。
1、使用logstash_internal用户和你创建的密码配置Logstash:
- 如果你不介意在配置文件中显示密码,请在logstash的目录下的管道配置文件中添加用户和密码,例如:
...
output {
elasticsearch {
hosts => "localhost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
user => "logstash_internal"
password => "your_password"
- 如果你不想将用户ID和密码放在配置文件中,可以将它们存储在密钥库中。运行以下命令来创建logstash密钥库并添加安全设置:
set +o history
export LOGSTASH_KEYSTORE_PASS=mypassword
set -o history
./bin/logstash-keystore create
./bin/logstash-keystore add ES_USER
./bin/logstash-keystore add ES_PWD
可以选择通过在名为LOGSTASH_KEYSTORE_PASS的环境变量中存储密码来保护对logstash密钥库的访问。
当出现提示时,请指定ES_USER
的值为logstash_internal并将ES_PWD
的值指定为对用的密码。
现在我们可以管道配置文件中使用ES_USER和ES_PWD。例如:
...
output {
elasticsearch {
hosts => "localhost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
user => "${ES_USER}"
password => "${ES_PWD}"
}
}
2、重启logstash
5.7创建用户和角色
当一切配置完成后,所有服务重启完成并且正常运行了,我们可以在kibana的界面的管理>用户页下创建用户分配角色了。
6、加入节点并加密通信
在6.0以及更高版本中,如果你拥有黄金或者更高级的许可证并且启用了ELasticsearch安全功能,则必须使用传输层安全性(TLS)来加密节点间通信。目前为止,我们都是单节点的集群,现在向集群中添加节点,然后给节点间通信加密。
在开始之前,必须确保:
1、使用单个es节点集群并安装和配置了Elasticsearch和kibana
2、安装使用许可证(默认的是基础许可证,我们破解后的是铂金许可证)
3、启用Elasticsearch的安全功能
4、为内置用户创建密码
5、将内置用户添加到kibana
6、停止kibana
7、停止Elasticsearch
6.1添加节点
我们向集群中添加两个节点。
1、首先我们在两台服务器上安装es,参照之前第一个节点配置系统设置,
2、然后同样的破解这两个节点的x-pack。
完成以上两个步骤后,确保每个节点都能正常启动了。
3、更新每个es节点的配置文件elasticsearch.yml
- 启用安全特性:xpack.security.enable:true
- 确保节点共享相同的集群名称:cluster.name
- 为每个节点提供唯一的节点名称:node.name
- 指定可用于构成集群的符合主节点的最小节点数:discovery.zen.minimum_master_nodes
例如,将以下设置添加到第一个节点的elasticsearch.yml文件中:
xpack.security.enabled:true
cluster.name:test-cluster
node.name:node-1
network.host:0.0.0.0
discovery.zen.minimum_master_nodes:2
transport.tcp.port:9300
discovery.zen.ping.unicast.hosts:[second_node_ip:port, third_node_ip:port]
将以下设置添加到第二个节点的elasticsearch.yml文件中:
xpack.security.enabled:true
cluster.name:test-cluster
node.name:node-2
network.host:0.0.0.0
discovery.zen.minimum_master_nodes:2
transport.tcp.port:9300
discovery.zen.ping.unicast.hosts:[first_node_ip:port, third_node_ip:port]
将以下设置添加到第三个节点的elasticsearch.yml文件中:
xpack.security.enabled:true
cluster.name:test-cluster
node.name:node-3
network.host:0.0.0.0
discovery.zen.minimum_master_nodes:2
transport.tcp.port:9300
discovery.zen.ping.unicast.hosts:[second_node_ip:port, first_node_ip:port]
4、启动每个es节点
5、重新启动kibana
6、验证集群现在包含三个节点:
curl -X GET "localhost:9200/_cluster/health"
7、使用cat nodes api验证主节点:
curl -X GET "localhost:9200/_cat/nodes?v"
master列中带星号(*)的节点是选定的主节点。
6.2加密通信
在安全集群中,Elasticsearch节点在与其他节点通信时使用证书来标识自己。
要启用加密,需要在群集中的每个节点上执行以下步骤:
1、验证xpack.security.enabled是否设置为true。
2、生成私钥和X.509证书。
3、将每个节点配置为:
- 必须:在传输层上启用TLS
- 推荐:在HTTP层启用TLS
6.2.1生成节点证书
TLS需要X.509证书才能对正在与之通信的应用程序执行加密和身份验证。为了使节点之间的通信真正安全,必须验证证书。在Elasticsearch集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。通过这样做,当节点添加到您的群集时,他们只需要使用由同一CA签名的证书,并自动允许该节点加入群集。
1、为Elasticsearch集群创建证书颁发机构
使用elasticsearch-certutil ca命令:
bin/elasticsearch-certutil ca
将群集的所有节点配置为信任具有此CA已签名的证书。该命令输出单个文件,默认名称为elastic-stack-ca.p12。此文件是PKCS#12密钥库,其中包含CA的公用证书以及用于为每个节点签署证书的私钥。将此文件复制到其他节点上。
该elasticsearch-certutil命令还会提示您输入密码以保护文件和密钥。如果您计划将来向群集添加更多节点,请保留该文件的副本并记住其密码。
2、为集群中的每个节点生成证书和私钥
使用elasticsearch-certutil cert命令:
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
输出是单个PKCS#12密钥库,包括节点证书,节点密钥和CA证书。
系统还会提示输入密码。可以输入证书和密钥的密码,也可以按Enter键将密码留空。
默认情况下,elasticsearch-certutil生成其中没有主机名信息的证书,这意味着可以将证书用于群集中的每个节点。
如果你想用你的集群中的主机名的验证,每个节点运行 elasticsearch-certutil cert命令一次并提供的--name,--dns和--ip选项。
3、将节点证书复制到适当的位置。
例如,将适用的.p12文件复制到每个节点上Elasticsearch配置目录中的目录中(/etc/elasticsearch/config/certs)。无需将CA文件复制到此目录。
6.2.2集群节点间加密通信配置
1、启用TLS并指定访问节点证书所需的信息。
- 请将以下信息添加到elasticsearch.yml每个节点上的 文件中:
xpack.security.transport.ssl.enabled:true
xpack.security.transport.ssl.verification_mode:certificate
xpack.security.transport.ssl.keystore.path: <path>/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: <path>/elastic-certificates.p12
如果在命令中使用了 --dns或--ip选项,要启用严格主机名检查,请将验证模式设置为xpack.security.transport.ssl.verification_mode:full。
2、如果使用密码保护节点的证书,请将密码添加到Elasticsearch密钥库:
- 如果签名证书采用PKCS#12格式,请使用以下命令:
bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
3、重新启动Elasticsearch,配置为使用TLS的节点无法与使用未加密网络的节点通信。启用TLS后,必须重新启动所有节点才能保持群集之间的通信。
6.2.3加密HTTP客户端通信
强烈建议在HTTP层上启用TLS,但这不是必需的。
1、启用TLS并指定访问节点证书所需的信息,请将以下信息添加到每个节点的elasticsearch.yml文件中:
xpack.security.http.ssl.enabled:true
xpack.security.http.ssl.keystore.path:<path>/elastic-certificates.p12
xpack.security.http.ssl.truststore.path:<path>/elastic-certificates.p12
2、如果使用密码保护节点的证书,请将密码添加到elasticsearch密钥库:
如果签名证书采用PKCS#12格式,请使用以下命令:
bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
3、重新启动Elasticsearch.
网友评论