使用管道日期索引名称设置 ElasticSearch 索引生命周期策略的问题

Posted

技术标签:

【中文标题】使用管道日期索引名称设置 ElasticSearch 索引生命周期策略的问题【英文标题】:Issue setting up ElasticSearch Index Lifecycle policy with pipeline date index name 【发布时间】:2020-12-01 04:37:20 【问题描述】:

我不熟悉设置适当的生命周期政策,所以我希望有人可以帮我解决这个问题。因此,我每周都会创建一个现有索引。这是第三方集成(他们为我提供了传入日志的管道和索引模板)。每周以“name-YYYY-MM-DD”的模式创建日志。我正在尝试为这些索引设置生命周期策略,以便它们从 hot->warm->delete 转换。到目前为止,我做了以下工作:

更新了索引模板以添加策略并设置别名:


  "index": 
    "lifecycle": 
      "name": "Cloudflare",
      "rollover_alias": "cloudflare"
    ,
    "mapping": 
      "ignore_malformed": "true"
    ,
    "number_of_shards": "1",
    "number_of_replicas": "1"

在现有索引上,设置别名,哪个是“写”索引:

POST /_aliases

    "actions" : [
        
            "add" : 
                 "index" : "cloudflare-2020-07-13",
                 "alias" : "cloudflare",
                 "is_write_index" : true
            
        
    ]


POST /_aliases

    "actions" : [
        
            "add" : 
                 "index" : "cloudflare-2020-07-06",
                 "alias" : "cloudflare",
                 "is_write_index" : false
            
        
    ]

这样做后,我开始看到以下 2 个错误(每个索引上 1 个):

ILM error #1

ILM error #2

我不确定为什么旧索引上会出现“不是写入索引”错误。也许这是因为它仍然“热”并试图将其移动到另一个阶段而不是写入索引?

对于第二个错误,是不是因为索引的名字是错误的rollover?

我也不清楚这是否适合翻转。这些索引每周都会创建,我认为这没问题。我认为通常您会创建一个索引,并让策略根据您的标准(大小、年龄等)将旧的索引分开。我应该改变这个还是让这个政策适用于现有的每周文件?如果您需要,这里是我导入 ElasticSearch 的管道的一部分,我认为它负责索引命名:


        "date_index_name" : 
          "field" : "EdgeStartTimestamp",
          "index_name_prefix" : "cloudflare-",
          "date_rounding" : "w",
          "timezone" : "UTC",
          "date_formats" : [
            "uuuu-MM-dd'T'HH:mm:ssX",
            "uuuu-MM-dd'T'HH:mm:ss.SSSX",
            "yyyy-MM-dd'T'HH:mm:ssZ",
            "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
          ]
        
      ,

所以,目前对我来说更重要的错误是“number_format_exception”。我想这是由于我在索引中看到的这个设置(provided_name):


  "settings": 
    "index": 
      "lifecycle": 
        "name": "Cloudflare",
        "rollover_alias": "cloudflare"
      ,
      "mapping": 
        "ignore_malformed": "true"
      ,
      "number_of_shards": "1",
      "provided_name": "<cloudflare-2020-07-20||/wyyyy-MM-dd|UTC>",
      "creation_date": "1595203589799",
      "priority": "100",
      "number_of_replicas": "1",

我相信这个“​​provided_name”是从我在上面提供的管道的“date_index_name”中建立起来的。如果这是问题所在,有没有办法通过摄取管道创建一个固定的索引名称而不根据日期进行更改?我宁愿只创建一个固定索引,让生命周期策略处理拆分(即 0001、0002 等)。

我一直在寻找一种不使用“date_index_name”处理器来创建固定索引名称的方法,但我还没有找到一种方法来做到这一点。或者,如果我可以创建一个带日期的索引名称并添加一个后缀,以允许生命周期策略管理器 (ILM) 在末尾添加增量编号,那也可能会起作用。在这里的任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

主要问题是现有索引 do not end with a sequence number(即 0001、0002 等),因此 ILM 并不真正知道如何进行。

此索引的名称必须与模板的索引模式匹配并以数字结尾

最好让 ILM 管理索引创建和翻转,因为这正是它应该做的。您需要做的就是继续写入相同的cloudflare 别名,仅此而已。不需要date_index_name 摄取处理器。

所以你的index template 是正确的。

接下来你需要bootstrap the initial index

PUT cloudflare-2020-08-11-000001

  "aliases": 
    "cloudflare": 
      "is_write_index": true
    
  

然后,您可以将reindex your old indices 加入 ILM 管理的索引,或将apply lifecycle policies 加入您的旧索引。

【讨论】:

谢谢瓦尔。所以,如果我没听错的话,我只需要从管道中删除整个“date_index_name”处理器(这样它就不会使用包含日期在内的命名约定创建索引),使用名称 I 引导第一个索引希望以 -000001 结尾,然后当日志进入管道并被摄取时,管道会将日志转储到“cloudflare-2020-08-11-000001”索引中,ILM 将在那时管理所有内容? 这是一个安全问题,显然您的用户cf-logs 无法创建新索引 所以,我做了上面的,我得到了这个错误: index [cloudflare-*], type [_doc], id [null], message [ElasticsearchException[Elasticsearch exception [ type=security_exception, reason=action [indices:admin/create] 对用户 [cf-logs]]] 是未经授权的;嵌套:ElasticsearchException[Elasticsearch exception [type=illegal_state_exception, reason=没有已知的外部请求支持不支持替换其索引的通配符]];] 我基本上删除了管道,重新创建了它,然后然后引导初始索引。 cf-logs 是超级用户。知道有什么问题吗? 正如我之前的评论所说,您需要查看 cf-logs 的角色和权限 作为超级用户,这个用户不应该拥有所有权限吗?我正在使用 cf-logs 将日志推送到管道中。我最初也使用这个用户来创建管道(以及当我今天重新创建它时)。唯一的区别是我使用不同的超级用户来创建引导索引(我碰巧登录到 Kibana 的用户)。这可能是个问题吗?

以上是关于使用管道日期索引名称设置 ElasticSearch 索引生命周期策略的问题的主要内容,如果未能解决你的问题,请参考以下文章

Azure Devops - 将 YAML 脚本中的变量设置为日期时间

使用 Grouper 的 pandas 系列日期时间索引中的月份名称

GB/T 38942-2020 压力管道规范 公用管道

如何对日期时间索引数据框进行排序

Elasticsearch揭秘 Elasticsearch 分片分配

Azure 发布管道 - “触发”分支名称的变量