当前位置:   article > 正文

Elasticsearch生命周期策略ilm_policy、索引模板template管理(一)

ilm_policy

生命周期和模板都是为了优化ES性能的,假如ES是一个小学校,数据是一个个入学的小学生,那么生命周期就是一二三年级,用生命周期制定的规则来管理学生何时进入下一个年级,1年级新学生允许他们随意玩耍,支持数据写入、读取,而6年级的老学生要冷静一点,就只支持读取,以此优化整个ES服务的性能,好钢用到刀刃上。至于模板就是学生课桌,保证每次进来新同学,教室座位顺序不乱。

另:此篇单纯讲解生命周期和模板创建,如果要建立ES集群模式,同步参考下篇文章:Elasticsearch7.×集群搭建,生命周期策略ilm_policy、索引模板template管理

(以下命令行均以ES7.0版本及以上操作,7.0以下涉及到文档操作注意添加“_doc”才能正确执行,另外演示代码块中的中文注释部分删掉后才可以执行,别直接复制粘贴运行呀!

一、生命周期策略管理 

可以PUT命令创建,也可以在kibana中创建(推荐)

PUT创建方式

  1. //设定生命周期
  2. PUT /_ilm/policy/article_ilm_policy(自定义生命周期名称)
  3. {
  4. "policy":{
  5. "phases":{
  6. "hot":{
  7. "actions":{
  8. "rollover":{
  9. "max_docs":"50000000"(最大文章数上限)
  10. }
  11. }
  12. },
  13. "warm":{
  14. "min_age":"15d",
  15. "actions":{
  16. "allocate":{
  17. "include":{
  18. "box_type":"warm"
  19. },
  20. "number_of_replicas":0
  21. },
  22. "forcemerge":{
  23. "max_num_segments":1
  24. }
  25. }
  26. },
  27. "cold":{
  28. "min_age":"30d",
  29. "actions":{
  30. "allocate":{
  31. "include":{
  32. "box_type":"cold"
  33. }
  34. }
  35. }
  36. },
  37. "delete":{
  38. "min_age":"60d",
  39. "actions":{
  40. "delete":{
  41. }
  42. }
  43. }
  44. }
  45. }
  46. }

kibana编辑/创建 生命周期策略

二、索引模板管理

查看当前所有模板

GET _template

查看指定模板规则

GET _template/article_ilm_template

创建模板

  1. //设定索引模板
  2. PUT /_template/article_ilm_template
  3. {
  4. "index_patterns":[
  5. "article*"(索引匹配规则,满足article为前缀的索引以此模板创建,这个要写好,瞎写或者写复杂了容易导致索引找不到模板)
  6. ],
  7. "aliases": {
  8. "article-template": {}(设置要与索引关联的别名。此别名不同于索引别名)
  9. },
  10. "settings":{
  11. "number_of_shards":9,(主分片数)
  12. "number_of_replicas":1,(副本数)
  13. "index.lifecycle.name":"article_ilm_policy",(规定索引遵从哪个生命周期)
  14. "index.lifecycle.rollover_alias":"article",(规定rollover索引别名)
  15. "index.routing.allocation.include.box_type":"hot",(让所有符合命名规则索引的 Shard 都将被分配到 Hot Nodes 节点上,如果不需要指定分配,可以去掉)
  16. },
  17. "mappings":{
  18. "properties":{
  19. "id":{
  20. "type":"integer"
  21. },
  22. "appChannel":{
  23. "type":"long"
  24. },
  25. "channleId":{
  26. "type":"integer"
  27. },
  28. "content":{
  29. "type":"text",
  30. "index":false,
  31. "copy_to":[
  32. "fulltext"
  33. ]
  34. },
  35. "createTime":{
  36. "type":"date",
  37. "format":"yyyy-MM-dd'T'HH:mm:ss.SSSZZ||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  38. },
  39. "wordCount":{
  40. "type":"keyword",
  41. "index":false
  42. }
  43. }
  44. }
  45. }

当然模板中settings不仅下面这些属性配置,还可指定分词器analysis、过滤器等 

  1. "index.max_ngram_diff":5,
  2. "analysis" : {
  3. "analyzer" : {
  4. "ngram_analyzer" : {
  5. "tokenizer" : "ngram_tokenizer"
  6. }
  7. },
  8. "tokenizer" : {
  9. "ngram_tokenizer" : {
  10. "filter" : [
  11. "lowercase"
  12. ],
  13. "min_gram" : "1",
  14. "type" : "ngram",
  15. "max_gram" : "3"
  16. }
  17. }
  18. }

 

三、别名

说一下别名问题,我们代码程序查询、添加文档到索引时,需要指定索引名称,但是这种方式扩容的索引需要统一的别名,根据别名进行操作,查询别名就会查询别名下的所有索引,同样添加文档到别名,就会添加到此别名下最新索引,当然最新索引必须满足"is_write_index":true也就是支持写入,集群只能规定一个写入的索引,如果不是请注意修改调整。

  1. //写入和读取,都是根据共同的别名article进行的,他们别名一样
  2. //设置别名,如果别名不对的话,就无法查询到此article-test索引
  3. //设置允许写入写入"is_write_index":true ,否则无法写入数据,集群只能规定一个写入的索引
  4. //创建索引,指定别名
  5. PUT article-test(需要修改的索引)
  6. {
  7. "aliases":{
  8. "article(别名)":{
  9. "is_write_index":true
  10. }
  11. }
  12. }
  13. //另一种写法,修改别名,指定索引:
  14. POST /_aliases
  15. {
  16. "actions":[
  17. {
  18. "add":{
  19. "index":"article-test",(需要修改的索引)
  20. "alias":"article",(别名)
  21. "is_write_index":true
  22. }
  23. }
  24. ]
  25. }

四、Rollover 新建索引扩容

当时一个索引达到生命周期所规定的扩容条件后就可以进行Rollover 扩容,我上面创建的生命周期规定的是"rollover":{                "max_docs":"50000000"(最大文章数上限) },也可以去kibana中根据内存大小、文档数量、存活时间进行设置。

Rollover不是完全自动的,还是需要命令简单执行,如果达到完全自动的方式,可以通过程序编写定时任务或者服务器定时脚本执行命令。

  1. POST article(别名)/_rollover/
  2. {
  3. "conditions": {
  4. "max_docs": 2
  5. }
  6. }
  7. 或者
  8. POST article(别名)/_rollover/article-05(指定rollover后的索引名称)
  9. {
  10. "conditions": {
  11. "max_docs": 50000000
  12. }
  13. }
  14. 或者强行rollover
  15. POST article(别名)/_rollover/

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

扩展问题:

公司ES有个article索引,设定索引生命周期:5千万文档后Rollover新建下一个索引。初始索引名为article-01,后续新增的依次为article-02,article-03等,他们的别名都叫article,这样查询和写入索引都按照别名进行。

有一天公司突然发现从Kibana的discover查不到ES中article数据了,程序中也不能查到最新的数据,但根据id细查还是能查到,并且也有文档数据进来。

原因:

排查后发现是自动新增的索引article-04中的字段crawTime不是data类型,而是text,导致discover设置的根据crawTime为条件的查询失效,并且导致程序查询中无法根据crawTime过滤筛选查询,也就查不到最新article-04中的数据。

根本原因:

索引模板未生效,新索引没有匹配到模板,也就没有预先设定好所需要的字段类型。

解决办法:

首先解决现有问题让网站系统恢复了,再修改模板,避免再出现此问题。

 首先已经创建的索引字段是无法更改的,所以要新建索引article-test,并为其创建好正确的字段类型,将article-04数据转移到article-test。先设定新索引字段类型

  1. //设置当前索引的字段及字段类型
  2. PUT article-test/_mapping/_doc
  3. {
  4. "_doc":{
  5. "_source":{
  6. "enabled":true
  7. },
  8. "_routing":{
  9. "required":true
  10. },
  11. "properties":{
  12. "id":{
  13. "type":"integer"
  14. },
  15. "appChannel":{
  16. "type":"long"
  17. },
  18. "channleId":{
  19. "type":"integer"
  20. },
  21. "content":{
  22. "type":"text",
  23. "index":false,
  24. "copy_to":[
  25. "fulltext"
  26. ]
  27. },
  28. "createTime":{
  29. "type":"date",
  30. "format":"yyyy-MM-dd'T'HH:mm:ss.SSSZZ||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  31. },
  32. "wordCount":{
  33. "type":"keyword",
  34. "index":false
  35. }
  36. }
  37. }
  38. }

转移数据到新索引

  1. //转移数据,从article-04到article-test
  2. POST _reindex
  3. {
  4. "source": {
  5. "index": "article-04",
  6. },
  7. "dest": {
  8. "index": "article-test"
  9. }
  10. }

删除原出错的索引,如果有必要的话

DELETE article_04

由于别名的存在,所以article-test就已经可以代替article-04使用了,但我是强逼症,就想恢复到原样,所以重新创建了article-04再重复上述转移数据的步骤折腾回去。

数据和功能恢复了,下一步修复模板,避免article-05也出现这样的问题,首先想一想为什么模板没生效?再看下这个模板

感觉也没问题呀,该有的都有,是因为这个模板权重order太低了吗,有重名的模板?被其他模板取代了吗?那我重新编辑模板,添加权重"order":10000试试,发现也不行,那看来就是这个模板本身的问题了。

  1. {
  2. "order":10000,(添加权重)
  3. "index_patterns":[
  4. "article-*"
  5. ],
  6. "settings":{
  7. "number_of_shards":9,
  8. "number_of_replicas":1,
  9. "index.lifecycle.name":"article_ilm_policy",
  10. "index.lifecycle.rollover_alias":"article",
  11. "index.routing.allocation.include.box_type":"hot",
  12. "analysis":{
  13. "analyzer":{
  14. "ngram_analyzer":{
  15. "tokenizer":"ngram_tokenizer"
  16. }
  17. },
  18. "tokenizer":{
  19. "ngram_tokenizer":{
  20. "type":"ngram",
  21. "min_gram":1,
  22. "max_gram":3,
  23. "filter":[
  24. "lowercase"
  25. ]
  26. }
  27. }
  28. }
  29. },
  30. "properties":{
  31. "websiteId":{
  32. "type":"integer"
  33. },
  34. "weixinBiz":{
  35. "type":"keyword"
  36. },
  37. "wordCount":{
  38. "type":"keyword",
  39. "index":false
  40. }
  41. }
  42. }

那我匹配简单的名称行不行,名称匹配不搞那么复杂了,将 "article-*换成 "a*",然后去创建索引article-test01发现成功了!!!能够按照模板规则创建索引的属性等信息。

"index_patterns":[
        "a*"
    ]

结果就是证明索引根据名称没匹配到期望的模板。最后将匹配规则 "article-*"去掉横杠"-"变为"article*"也能匹配上,所以模板匹配名称不要写太复杂,能匹配上又不会冲突就够了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/497776
推荐阅读
相关标签
  

闽ICP备14008679号