ELK-初识Elasticsearch
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELK-初识Elasticsearch相关的知识,希望对你有一定的参考价值。
第一篇:初识Elasticsearch
Elasticsearch 要求 java8+的环境,推荐使用 Oracle 1.8.0_131版本的JDK。Java JDK的安装此处不做介绍。这里我们使用的5.4.2版本的Elasticsearch。
从elastic网站www.elastic.co/downloads下载,网站上有对于任何一个版本你都可以选择.zip或.tar的压缩文件,DEB或RPM格式的安装包。简单办法是使用tar文件。将tar文件解压到指定文件夹,在文件夹下执行下面命令启动Elasticsearch:
cd elasticsearch-5.4.2/bin
./elasticsearch
如果看到以下格式的信息说明启动成功了:
我们可以在命令行启动Elasticsearch时修改集群和节点的名称:
./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name
默认情况下Elasticsearch使用9200端口对外提供REST API服务,必要情况下爱可以修改该端口号。
现在我们已经启动一个Elasticsearch节点(集群),下一步就是理解怎么和它通讯。Elasticsearch提供一个非常全面而且强大的REST API,你可以使用API和你的集群交互。通过API可以完成以下工作:
- 检查集群、节点和索引健康状态、统计信息。
- 管理你的集群、节点和索引数据及元数据。
- 对索引执行CRUD(创建、读取、更新和删除)和搜索操作。
- 执行高级搜索操作(例如分页、排序、过滤、脚本处理、聚合等等)。
如果我们想对集群进行一个基础的健康检查,查看集群正在干什么,我们可以curl查看(你可以使用任何一个可以发起HTTP/REST请求的工具)。假定我们一直在相同的节点上穹顶Elasticsearch,并且打开了另一个命令行窗口。
检查集群健康状态,我们使用_cat API。你可以在Kibana的console页面运行以下命令:
GET /_cat/health?v
响应结果如图右侧:
我们可以看到名为elasticsearch的集群已经启动并且但是状态为yellow(正常状态为green,这里因为本地只搭建了单节点环境,数据没有副本)。
我们请求集群健康信息时,会获取green、yellow、或red三者中的一种状态。Green表示一切正常(集群功能完全正常),Yellow表示所有的数据都是可用的但是一些副本没有分配(集群功能完全正常),Red表示一些数据因为某种原因无法正常使用。注意,即使集群的状态为Red,它的部分功能还是可以使用的(i.e. 它会从可得到的资源中继续提供搜索请求),但是你应该在数据损失之前你尽快修复问题。
从上面的响应结果中,我们还可以看到集群中一共只有1个节点,具有1个碎片。这是因为我们还没有存放数据。,注意,我们使用的是默认的系群名称(elasticsearch),并且Elasticsearch使用的是单播网络,所以如果在一台机器上启动多个节点是可以被发现的,这样的话你就可以在上面的响应信息中看到更多的节点。
我们还可以使用下面的请求获取节点列表:
GET /_cat/nodes?v
这里我们可以看到我们一个节点名为“J7JVnD6”,这是我们集群中唯一的一个节点。
现在我们来看一眼我们的索引:
执行 GET /_cat/indices?v 响应如下:
从响应结果可以看到我们有一个名为.kiban的索引,大小为3.1kb,这是因为我们这里使用的kibana,自动创建了一个索引。
现在我们创建一个名为“customer”的索引,然后再次列出所有索引:
PUT /customer?pretty GET /_cat/indices?v
可以看到执行创建索引请求时,响应返回了一个json格式的数据。
再次列出所有索引时多了一个名为“customer”的索引,并且其有5个碎片和1个副本(默认),包含0个文件。
你可能也看到“customer”索引的状态也是Yellow状态,回想一下之前的讨论,黄色意味着一些副本还没有分配。这个索引发生的原因是由于Elasticsearch默认创建了这个索引的一个副本。因为我们现在只有一个节点在运行,因此无法分配一个副本(用于高可用性),直到另一个节点连接到集群的时候。一旦该副本被分配到第二个节点上,该索引的健康状态将变为绿色。
我们现在put一些数据到customer索引中,请记住,为了索引文档,必须告诉Elasticsearch数据在该索引中的类型:
我们来索引一个简单类型为"external",ID为1的customer文件到customer索引中去;格式如下:
PUT /customer/external/1?pretty { "name": "John Doe" }
从上面的响应结果可以看到一个新的customer文件被成功的创建到customer索引中,并且类型为external。这个文件还有一个创建时指定的内部ID为1。
Elasticsearch不要求在索引文件之前显示的创建一个索引,在上面的例子中如果customer索引不存在的话Elasticsearch会自动创建customer索引。下面我们来检索一下刚才索引的文件:
GET /customer/external/1?pretty
从上面的响应结果可以看到一个found字段,该字段为true表示我们找到了找到了索引为customer,类型为external,ID为1的文件。_source字段则返回了完整的我们之前索引的JSON文件。如果我们检索一个不存在的文件,例如检索一个ID为2的文件:
GET /customer/external/2?pretty
会得到如下的响应
现在我们删除刚才我们创建的索引,然后再列出所有索引:
DELETE /customer?pretty GET /_cat/indices?v
可以看到customer索引已经被成功删除了。
Elasticsearch提供准实时的数据处理和搜索功能。默认情况下,你可以在你的对你的数据执行索引、更新、删除操作之后的一个两个延迟(刷新间隔)之后查到预期的搜索结果。这是跟其他平台最大的不同之处,想SQL查询之类的系统在一个事务完成之后立刻就得得到想要的结果。
我们前面看到了如何索引一个简单的文档,现在来回顾一下这段命令;
PUT /customer/external/1?pretty { "name": "John Doe" }
同样的上面脚本会将文档索引到customer索引中取,类型为external,ID为1,如果我们再用一个不同的文档执行上面的脚本,Elasticsearch会用着个新文档替换已存在ID为1的文档:
PUT /customer/external/1?pretty { "name": "Jane Doe" }
上面将ID为1的文档从“John Doe” 改为“Jane Doe”.如果我们用一个不同的ID,将会索引一个新文档,并且已经在索引中保存的现有文档保持不变。
PUT /customer/external/2?pretty { "name": "Jane Doe" }
上面索引了一个ID为2的新文档。
索引时,ID部分是可选的,如果不指定,Elasticsearch会生成一个随机的ID来索引该文档。这个Elasticsearch生成的实际ID(或前边例子中我们指定的ID)会作为索引API回调的一部分返回。
下面的例子中展示如何不指明ID来索引文件:
POST /customer/external?pretty { "name": "Jane Doe" }
注意:这个例子中,我们使用的是POST动作还不是PUT,因为我们没有指定一个ID。
除了能索引和替换文档之外,我们还能更新文档,注意,实际上Elasticsearch并没有引擎下做就地更新。当我们做一个更新操作时,Elasticsearch删除就文档然后一个快照中索引新文档。
下面的例子展示如何更新我们之前的文档(ID为1),将name字段改为“Jane Doe”;
POST /customer/external/1/_update?pretty { "doc": { "name": "Jane Doe" } }
下面的例子展示如何更新我们之前的文档(ID为1),将name字段修改为"Jane Doe",同时添加age字段:
POST /customer/external/1/_update?pretty { "doc": { "name": "Jane Doe", "age": 20 } }
还可以使用简单的脚本来执行更新,下面的例子使用一个脚本吧Age增加5:
POST /customer/external/1/_update?pretty { "script" : "ctx._source.age += 5" }
上面的例子中,ctx._source引用即将更新的源文档。
注意,在撰写本文时,Elasticsearch只支持同时更新一个文档。在将来,Elasticsearch可能会实现通过一个查询条件实现多文档更新功能(就像SQL中UPDATE-WHERE语句一样)。
删除一个文档相对来说很简单,下面的例子展示如何删除之前customer索引中ID为2的文档:
DELETE /customer/external/2?pretty
通过查看API中的Delete一节,已删除匹配特定查询的所有文档,值得注意的是,直接删除整个索引比删除索引下的所有文档更简单有效。
除了索引、更新和删除删除单个文档之外,Elasticsearch还提供了使用_bulk API 批量执行上述操作的功能。这个功能非常重要,因为它提供了一种非常高效的机制来尽可能快地执行多个操作,尽可能少地进行网络传输。
作为一个简单的例子,下面的脚本可以在一个批量操作中索引两个文档(ID 1 - John Doe and ID 2 - Jane Doe):
POST /customer/external/_bulk?pretty {"index":{"_id":"1"}} {"name": "John Doe" } {"index":{"_id":"2"}} {"name": "Jane Doe" }
下面的例子在一个批量操作中更新了第一个文档然后删除了第二个文档:
POST /customer/external/_bulk?pretty {"update":{"_id":"1"}} {"doc": { "name": "John Doe becomes Jane Doe" } } {"delete":{"_id":"2"}}
注意:上面的删除动作中,因为删除动作没有相应的源文档,只需要提供将删除文档的ID即可。
Bulk API 不会因为其中一个操作的失败而失败,不管任何原因导致一个操作失败,都将继续执行后面的操作。当Bulk API返回时,它会提供每一个动作的状态(以同样的顺序送回来),这时你可以检查每个动作是否失败。
以上是关于ELK-初识Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch 分布式搜索引擎 -- 初识elasticsearch(了解ES倒排索引es的一些概念安装eskibana)