设置参数 `node.name` 可以自定义 Elasticsearch 节点的名字。 此条 Tips 由 medcl 贡献。

ik+pinyin 实现搜索建议时

Elasticsearchstevelevan 回复了问题 • 5 人关注 • 2 个回复 • 5208 次浏览 • 2022-06-16 10:26 • 来自相关话题

kibana图表能做自定义标注吗

Kibanamedcl 回复了问题 • 2 人关注 • 1 个回复 • 1935 次浏览 • 2019-02-15 12:28 • 来自相关话题

elasticsearch是否可以关闭查询缓存?

Elasticsearchrochy 回复了问题 • 2 人关注 • 1 个回复 • 6213 次浏览 • 2019-02-13 17:46 • 来自相关话题

请教logstash的http-poller input插件获取接口数据问题

回复

Logstashjacy 回复了问题 • 1 人关注 • 1 个回复 • 3211 次浏览 • 2019-02-14 15:14 • 来自相关话题

logstash启动报错

Logstashhenry0417 回复了问题 • 3 人关注 • 2 个回复 • 8761 次浏览 • 2019-02-15 11:13 • 来自相关话题

elasticsearch 交集求和去重计数改如何查询呢?

Elasticsearchrochy 回复了问题 • 4 人关注 • 1 个回复 • 3538 次浏览 • 2019-02-13 16:08 • 来自相关话题

filter查询不到数据,字段值一样,mapping也没有发现什么不一样。

Elasticsearchrochy 回复了问题 • 3 人关注 • 2 个回复 • 4036 次浏览 • 2019-02-13 15:57 • 来自相关话题

apm-server的javaagent的application_packages是什么意思?

默认分类rochy 回复了问题 • 3 人关注 • 1 个回复 • 4381 次浏览 • 2019-02-12 22:12 • 来自相关话题

【线下活动-分享主题征集-武汉】 2019年3月 Elastic&尚德机构技术沙龙

活动medcl 回复了问题 • 3 人关注 • 1 个回复 • 6970 次浏览 • 2019-02-22 15:42 • 来自相关话题

Elasticsearch Reference 文档中的功能是否都可以免费商用?

Elasticsearchzqc0512 回复了问题 • 3 人关注 • 2 个回复 • 3787 次浏览 • 2019-02-13 09:08 • 来自相关话题

elasticsearch如何用QueryBuilder自己拼接查询语句已json方式传入

Elasticsearchyxy 回复了问题 • 3 人关注 • 4 个回复 • 8333 次浏览 • 2019-12-12 17:09 • 来自相关话题

elasticsearch suggest

Elasticsearchrochy 回复了问题 • 3 人关注 • 1 个回复 • 1901 次浏览 • 2019-02-12 10:19 • 来自相关话题

【最新】Elasticsearch 6.6 Index Lifecycle Management 尝鲜

资讯动态rockybean 发表了文章 • 8 个评论 • 23513 次浏览 • 2019-02-06 11:32 • 来自相关话题

1月29日,Elastic Stack 迎来 6.6 版本的发布,该版本带来很多新功能,比如:

  • Index Lifecycle Management
  • Frozen Index
  • Geoshape based on Bkd Tree
  • SQL adds support for Date histograms
  • ......

    在这些众多功能中,Index Lifecycle Management(索引生命周期管理,后文简称 ILM) 是最受社区欢迎的。今天我们从以下几方面来快速了解下该功能:

    1. 为什么索引会有生命?什么是索引生命周期?
    2. ILM 是如何划分索引生命周期的?
    3. ILM 是如何管理索引生命周期的?
    4. 实战

      1. Index Lifecycle 索引生命周期


      先来看第一个问题:

      为什么索引有生命?

      索引(Index)是 Elasticsearch 中数据组织的一个逻辑概念,是具有相同或相似字段的文档组合。它由众多分片(Shard)组成,比如 bookpeople都可以用作索引名称,可以简单类比为关系型数据库的表(table)。

      所谓生命,即生与死;索引的便是创建删除了。

      在我们日常使用 Elasticsearch 的时候,索引的创建与删除似乎是很简单的事情,用的时候便创建,不用了删除即可,有什么好管理的呢?

      这就要从 Elasticsearch 的应用场景来看了。

      业务搜索场景,用户会将业务数据存储在 Elasticsearch 中,比如商品数据、订单数据、用户数据等,实现快速的全文检索功能。像这类数据基本都是累加的,不会删除。一般删除的话,要么是业务升级,要么是业务歇菜了。此种场景下,基本只有生,没有死,也就不存在管理一说。

      而在日志业务场景中,用户会将各种日志,如系统、防火墙、中间件、数据库、web 服务器、应用日志等全部实时地存入 Elasticsearch 中,进行即席日志查询与分析。这种类型的数据都会有时间维度,也就是时序性的数据。由于日志的数据量过大,用户一般不会存储全量的数据,一般会在 Elasticsearch 中存储热数据,比如最近7天、30天的数据等,而在7天或者30天之前的数据都会被删除。为了便于操作,用户一般会按照日期来建立索引,比如 nginx 的日志索引名可能为 nginx_log-2018.11.12nginx_log-2018.11.13等,当要查询或删除某一天的日志时,只需要针对对应日期的索引做操作就可以了。那么在该场景下,每天都会上演大量索引的生与死。

      一个索引由生到死的过程,即为一个生命周期。举例如下:

  • 生:在 2019年2月5日 创建 nginx_log-2019.02.05的索引,开始处理日志数据的读写请求
  • 生:在 2019年2月6日 nginx_log-2019.02.05 索引便不再处理写请求,只处理读请求
  • 死:在 2019年3月5日 删除 nginx_log-2018.02.05的索引

    其他的索引,如 nginx_log-2019.02.06 等也会经过相同的一个生命周期。

    2. ILM 是如何划分索引生命周期的?


    我们现在已经了解何为生命周期了,而最简单的生命周期只需要两个阶段即可。但在实际使用中生命周期是有多个阶段的,我们来看下 ILM 是如何划分生命周期的。

    ILM 一共将索引生命周期分为四个阶段(Phase):

    1. Hot 阶段
    2. Warm 阶段
    3. Cold 阶段
    4. Delete 阶段

      如果我们拿一个人的生命周期来做类比的话,大概如下图所示:

      ![Index Lifecycle](https://ws1.sinaimg.cn/large/6 ... 7y.jpg)

      Hot 阶段


      Hot 阶段可类比为人类婴儿到青年的阶段,在这个阶段,它会不断地进行知识的输入与输出(数据读写),不断地长高长大(数据量增加)成有用的青年。

      由于该阶段需要进行大量的数据读写,因此需要高配置的节点,一般建议将节点内存与磁盘比控制在 32 左右,比如 64GB 内存搭配 2TB 的 SSD 硬盘。

      Warm 阶段


      Warm 阶段可类比为人类青年到中年的阶段,在这个阶段,它基本不会再进行知识的输入(数据写入),主要进行知识输出(数据读取),为社会贡献价值。

      由于该阶段主要负责数据的读取,中等配置的节点即可满足需求,可以将节点内存与磁盘比提高到 64~96 之间,比如 64GB 内存搭配 4~6TB 的 HDD 磁盘。

      Cold 阶段


      Cold 阶段可类别比为人类中年到老年的阶段,在这个阶段,它退休了,在社会有需要的时候才出来输出下知识(数据读取),大部分情况都是静静地待着。

      由于该阶段只负责少量的数据读取工作,低等配置的节点即可满足要求,可以将节点内存与磁盘比进一步提高到 96 以上,比如128,即 64GB 内存搭配 8 TB 的 HDD 磁盘。

      Delete 阶段


      Delete 阶段可类比为人类寿终正寝的阶段,在发光发热之后,静静地逝去,Rest in Peace~

      ILM 对于索引的生命周期进行了非常详细的划分,但它并不强制要求必须有这个4个阶段,用户可以根据自己的需求组合成自己的生命周期。

      3. ILM 是如何管理索引生命周期的?


      所谓生命周期的管理就是控制 4 个生命阶段转换,何时由 Hot 转为 Warm,何时由 Warm 转为 Cold,何时 Delete 等。

      阶段的转换必然是需要时机的,而对于时序数据来说,时间必然是最好的维度,而 ILM 也是以时间为转换的衡量单位。比如下面这张转换的示意图,即默认是 Hot 阶段,在索引创建 3 天后转为 Warm 阶段,7 天后转为 Cold 阶段,30 天后删除。这个设置的相关字段为 min_age,后文会详细讲解。

      ![](https://ws1.sinaimg.cn/large/6 ... ux.jpg)

      ILM 将不同的生命周期管理策略称为 Policy,而所谓的 Policy 是由不同阶段(Phase)的不同动作(Action)组成的。

      Action是一系列操作索引的动作,比如 Rollover、Shrink、Force Merge等,不同阶段可用的 Action 不同,详情如下:

  • Hot Phase
    • Rollover 滚动索引操作,可用在索引大小或者文档数达到某设定值时,创建新的索引用于数据读写,从而控制单个索引的大小。这里要注意的一点是,如果启用了 Rollover,那么所有阶段的时间不再以索引创建时间为准,而是以该索引 Rollover 的时间为准。
  • Warm Phase
    • Allocate 设定副本数、修改分片分配规则(如将分片迁移到中等配置的节点上)等
    • Read-Onlly 设定当前索引为只读状态
    • Force Merge 合并 segment 操作
    • Shrink 缩小 shard 分片数
  • Cold Phase
    • Allocate 同上
  • Delete Phase
    • Delete 删除

      从上面看下来整体操作还是很简单的,Kibana 也提供了一套 UI 界面来设置这些策略,如下所示:

      ![kibana ilm](https://ws1.sinaimg.cn/large/6 ... ug.jpg)

      从上图看下来 ILM 的设置是不是一目了然呢?

      当然,ILM 是有自己的 api 的,比如上面图片对应的 api 请求如下:

      json<br /> PUT /_ilm/policy/test_ilm2<br /> {<br /> "policy": {<br /> "phases": {<br /> "hot": {<br /> "actions": {<br /> "rollover": {<br /> "max_age": "30d",<br /> "max_size": "50gb"<br /> }<br /> }<br /> },<br /> "warm": {<br /> "min_age": "3d",<br /> "actions": {<br /> "allocate": {<br /> "require": {<br /> "box_type": "warm"<br /> },<br /> "number_of_replicas": 0<br /> },<br /> "forcemerge": {<br /> "max_num_segments": 1<br /> },<br /> "shrink": {<br /> "number_of_shards": 1<br /> }<br /> }<br /> },<br /> "cold": {<br /> "min_age": "7d",<br /> "actions": {<br /> "allocate": {<br /> "require": {<br /> "box_type": "cold"<br /> }<br /> }<br /> }<br /> },<br /> "delete": {<br /> "min_age": "30d",<br /> "actions": {<br /> "delete": {}<br /> }<br /> }<br /> }<br /> }<br /> }<br />

      这里不展开讲了,感兴趣的同学可以自行查看官方手册。

      现在管理策略(Policy)已经有了,那么如何应用到索引(Index)上面呢?

      方法为设定如下的索引配置:

  • index.lifecycle.name 设定 Policy 名称,比如上面的 test_ilm2
  • index.lifecycle.rollover_alias 如果使用了 Rollover,那么还需要指定该别名

    修改索引配置可以直接修改(`PUT index_name/_settings)或者通过索引模板(Index Template)来实现。

    我们这里不展开讲了,大家参考下面的实战就明白了。

    4. 实战


    下面我们来实际演练一把!

    目标


    现在需要收集 nginx 日志,只需保留最近30天的日志,但要保证最近7天的日志有良好的查询性能,搜索响应时间在 100ms 以内。

    为了让大家可以快速看到效果,下面实际操作的时候会将 30天7天 替换为 40秒20秒

    ES 集群架构


    这里我们简单介绍下这次实战所用 ES 集群的构成。该 ES 集群一共有 3个节点组成,每个节点都有名为 box_type 的属性,如下所示:

    <br /> GET _cat/nodeattrs?s=attr<br /> es01_hot 172.24.0.5 172.24.0.5 box_type hot<br /> es02_warm 172.24.0.4 172.24.0.4 box_type warm<br /> es03_cold 172.24.0.3 172.24.0.3 box_type cold<br />

    由上可见我们有 1 个 hot 节点、1 个 warm 节点、1 个 cold 节点,分别用于对应 ILM 的阶段,即 Hot 阶段的索引都位于 hot 上,Warm 阶段的索引都位于 warm 上,Cold 阶段的索引都位于 cold 上。

    创建 ILM Policy


    根据要求,我们的 Policy 设定如下:

  • 索引名以 nginx_logs 为前缀,且以每10个文档做一次 Rollover
  • Rollover 后 5 秒转为 Warm 阶段
  • Rollover 后 20 秒转为 Cold 阶段
  • Rollover 后 40 秒删除

    API 请求如下:

    json<br /> PUT /_ilm/policy/nginx_ilm_policy<br /> {<br /> "policy": {<br /> "phases": {<br /> "hot": {<br /> "actions": {<br /> "rollover": {<br /> "max_docs": "10"<br /> }<br /> }<br /> },<br /> "warm": {<br /> "min_age": "5s",<br /> "actions": {<br /> "allocate": {<br /> "include": {<br /> "box_type": "warm"<br /> }<br /> }<br /> }<br /> },<br /> "cold": {<br /> "min_age": "20s",<br /> "actions": {<br /> "allocate": {<br /> "include": {<br /> "box_type": "cold"<br /> }<br /> }<br /> }<br /> },<br /> "delete": {<br /> "min_age": "40s",<br /> "actions": {<br /> "delete": {}<br /> }<br /> }<br /> }<br /> }<br /> }<br />

    创建 Index Template


    我们基于索引模板来创建所需的索引,如下所示:

    json<br /> PUT /_template/nginx_ilm_template<br /> {<br /> "index_patterns": ["nginx_logs-*"], <br /> "settings": {<br /> "number_of_shards": 1,<br /> "number_of_replicas": 0,<br /> "index.lifecycle.name": "nginx_ilm_policy", <br /> "index.lifecycle.rollover_alias": "nginx_logs",<br /> "index.routing.allocation.include.box_type": "hot"<br /> }<br /> }<br />

    上述配置解释如下:

  • index.lifecycle.name 指明该索引应用的 ILM Policy
  • index.lifecycle.rollover_alias 指明在 Rollover 的时候使用的 alias
  • index.routing.allocation.include.box_type 指明新建的索引都分配在 hot 节点上

    创建初始索引 Index


    ILM 的第一个索引需要我们手动来创建,另外启动 Rollover 必须以数值类型结尾,比如 nginx_logs-000001。索引创建的 api 如下:

    json<br /> PUT nginx_logs-000001<br /> {<br /> "aliases": {<br /> "nginx_logs": {<br /> "is_write_index":true<br /> }<br /> }<br /> }<br />

    此时索引分布如下所示:

    ![](https://ws1.sinaimg.cn/large/6 ... fr.jpg)

    修改 ILM Polling Interval


    ILM Service 会在后台轮询执行 Policy,默认间隔时间为 10 分钟,为了更快地看到效果,我们将其修改为 1 秒。

    json<br /> PUT _cluster/settings<br /> {<br /> "persistent": {<br /> "indices.lifecycle.poll_interval":"1s"<br /> }<br /> }<br />

    开始吧


    一切准备就绪,我们开始吧!

    首先执行下面的新建文档操作 10 次。

    json<br /> POST nginx_logs/_doc<br /> {<br /> "name":"abbc"<br /> }<br />

    之后 Rollover 执行,新的索引创建,如下所示:

    ![](https://ws1.sinaimg.cn/large/6 ... 5c.jpg)

    5 秒后,nginx_logs-000001 转到 Warm 阶段

    ![](https://ws1.sinaimg.cn/large/6 ... 78.jpg)

    15 秒后(20 秒是指距离 Rollover 的时间,因为上面已经过去5秒了,所以这里只需要15秒),nginx_logs-00001转到 Cold 阶段

    ![](https://ws1.sinaimg.cn/large/6 ... k1.jpg)

    25 秒后,nginx_logs-00001删除

    ![](https://ws1.sinaimg.cn/large/6 ... 98.jpg)



    至此,一个完整的 ILM Policy 执行的流程就结束了,而后续 nginx_logs-000002 也会按照这个设定进行流转。

    总结


    ILM 是 Elastic 团队将多年 Elasticsearch 在日志场景领域的最佳实践进行的一次总结归纳和落地实施,极大地降低了用好 Elasticsearch 的门槛。掌握了 ILM 的核心概念,也就意味着掌握了 Elasticsearch 的最佳实践。希望本文能对大家入门 ILM 有所帮助。

    在线研讨会


    一篇文章所能承载的信息量和演示效果终究是有限的,2月份我们会针对 ILM 做一次线上研讨会,感兴趣的同学可以点击下面的链接注册报名。



    [https://jinshuju.net/f/TjBbvx](https://jinshuju.net/f/TjBbvx)



    为了提高研讨会的质量,我们本次引入了审核机制,报名的同学请耐心等待,待我们审核通过后,您会收到我们的邮件邀请。



    参考资料:


    1. https://www.elastic.co/guide/e ... .html
    2. https://www.elastic.co/blog/ho ... h-5-x

申请了一个1年的许可证,update的时候出错

Kibanaalbin 回复了问题 • 4 人关注 • 3 个回复 • 5873 次浏览 • 2019-11-14 15:02 • 来自相关话题

ClusterBlockException SERVICE_UNAVAILABLE/1/state

Elasticsearchridethewind 发表了文章 • 7 个评论 • 14597 次浏览 • 2019-02-03 10:45 • 来自相关话题

截图.PNG


图中为_cluster/health 和_cat/pending_tasks的执行结果,现在ES节点全部故障了,请教下如何恢复?
 
gateway.expected_nodes配置的为节点个数的80% 
```
Caused by: org.elasticsearch.discovery.MasterNotDiscoveredException: ClusterBlockException[blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];]
at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction$4.onTimeout(TransportMasterNodeAction.java:213) ~[elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.cluster.ClusterStateObserver$ContextPreservingListener.onTimeout(ClusterStateObserver.java:317) [elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.cluster.ClusterStateObserver$ObserverClusterStateListener.onTimeout(ClusterStateObserver.java:244) [elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.cluster.service.ClusterApplierService$NotifyTimeout.run(ClusterApplierService.java:578) [elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:568) [elasticsearch-6.1.3.jar:6.1.3]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];
at org.elasticsearch.cluster.block.ClusterBlocks.indexBlockedException(ClusterBlocks.java:182) ~[elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.action.admin.indices.create.TransportCreateIndexAction.checkBlock(TransportCreateIndexAction.java:64) ~[elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.action.admin.indices.create.TransportCreateIndexAction.checkBlock(TransportCreateIndexAction.java:39) ~[elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.doStart(TransportMasterNodeAction.java:135) ~[elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.action.support.master.TransportMasterNodeAction$AsyncSingleAction.start(TransportMasterNodeAction.java:127) ~[elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:105) ~[elasticsearch-6.1.3.jar:6.1.3]
at org.elasticsearch.action.support.master.TransportMasterNodeAction.doExecute(TransportMasterNodeAction.java:55) ~[elasticsearch-6.1.3.jar:6.1.3]