Elasticsearch:Data streams(三)

2022年12月1日   |   by mebius

这是一个系列文章的第三篇文章。之前的两篇文章如下:

在今天的文章中,我将详述如何修改 data strram 的 mappings 以及它的设置。

每个数据流都有一个匹配的索引模板。 此模板中的映射和索引设置应用于为流创建的新后备索引。 这包括流的第一个后备索引,它是在创建流时自动生成的。

在创建数据流之前,我们建议你仔细考虑要在此模板中包含哪些映射(mappings)和设置(settings)。如果你以后需要更改数据流的映射或设置,你有几个选择:

  • 向数据流添加新的字段映射
  • 更改数据流中的现有字段映射
  • 更改数据流的动态索引设置
  • 更改数据流的静态索引设置

提示:如果你的更改包括对现有字段映射或静态索引设置的修改,则通常需要重建索引以将更改应用到数据流的后备索引。 如果你已经在执行重新索引(reindex),则可以使用相同的过程来添加新的字段映射和更改动态索引设置。 请参阅使用重建索引更改映射或设置

添加一个新的字段映射到数据流

要将新字段的映射添加到数据流,请执行以下步骤:

1)更新数据流使用的索引模板。 这确保新的字段映射被添加到为流创建的未来支持索引中。

例如,my-index-template 是 my-data-stream 使用的现有索引模板。

以下创建或更新索引模板请求将新字段消息的映射添加到模板。

PUT /_index_template/my-index-template
{
  "index_patterns": [ "my-data-stream*" ],
  "data_stream": { },
  "priority": 500,
  "template": {
    "mappings": {
      "properties": {
        "message": {                              
          "type": "text"
        }
      }
    }
  }
}

在上面,我添加了一个新的 message 字段到 mappings。

2)使用更新映射 API 将新的字段映射添加到数据流中。 默认情况下,这会将映射添加到流的现有后备索引(backing indices),包括写入索引(write index)。

以下更新映射 API 请求将新消息字段映射添加到 my-data-stream。

PUT /my-data-stream/_mapping
{
  "properties": {
    "message": {
      "type": "text"
    }
  }
}

要仅将映射添加到流的写入索引,请将更新映射 API 的 write_index_only 查询参数设置为 true。

以下更新映射请求仅将新消息字段映射添加到 my-data-stream 的写入索引。 新字段映射不会添加到流的其他支持索引中。

PUT /my-data-stream/_mapping?write_index_only=true
{
  "properties": {
    "message": {
      "type": "text"
    }
  }
}

更改数据流中的现有字段映射

每个映射参数的文档指示你是否可以使用更新映射 API 为现有字段更新它。 要更新现有字段的这些参数,请执行以下步骤:

更新数据流使用的索引模板。 这确保将更新的字段映射添加到为流创建的未来后备索引中。

例如,my-index-template 是 my-data-stream 使用的现有索引模板。

以下创建或更新索引模板请求将 host.ip 字段的tgcode ignore_malformed 映射参数的参数更改为 true。

PUT /_index_template/my-index-template
{
  "index_patterns": [ "my-data-stream*" ],
  "data_stream": { },
  "priority": 500,
  "template": {
    "mappings": {
      "properties": {
        "host": {
          "properties": {
            "ip": {
              "type": "ip",
              "ignore_malformed": true            
            }
          }
        }
      }
    }
  }
}

要仅将映射更改应用于流的写入索引,请将放置映射 API 的 write_index_only 查询参数设置为 true。

以下更新映射请求仅为 my-data-stream 的写入索引更改 host.ip 字段的映射。 该更改不适用于流的其他后备索引。

PUTtgcode /my-data-stream/_mapping?write_index_only=true
{
  "properties": {
    "host": {
      "properties": {
        "ip": {
          "type": "ip",
         tgcode "ignore_malformed": true
        }
      }
    }
  }
}

除了支持的映射参数外,我们不建议你更改现有字段的映射或字段数据类型,即使在数据流的匹配索引模板或其支持索引中也是如此。 更改现有字段的映射可能会使任何已编制索引的数据无效。

如果你需要更改现有字段的映射,请创建一个新的数据流并将你的数据重新索引到其中。请参阅下面的重建索引更改映射或设置。

更改数据流的动态索引设置

要更改数据流的动态索引设置,请执行以下步骤:

1)更新数据流使用的索引模板。 这确保该设置应用于为流创建的未来后备索引。

例如,my-index-template 是 my-data-stream 使用的现有索引模板。

以下创建或更新索引模板请求将模板的 index.refresh_interval 索引设置更改为 30s(30 秒)。

PUT /_index_template/my-index-template
{
  "index_patterns": [ "my-data-stream*" ],
  "data_stream": { },
  "priority": 500,
  "template": {
    "settings": {
      "index.refresh_interval": "30s"             
    }
  }
}

在上面,将 index.refresh_interval 设置更改为 30s(30 秒)。

2)使用更新索引设置 API 更新数据流的索引设置。 默认情况下,这会将设置应用于流的现有后备索引,包括写入索引。

以下更新索引设置 API 请求更新 my-data-stream 的 index.refresh_interval 设置。

PUT /my-data-stream/_settings
{
  "index": {
    "refresh_interval": "30s"
  }
}

重要:要更改 index.lifecycle.name 设置,首先使用删除策略 API 删除现有的 ILM 策略。 请参阅 Switch 生命周期策略

更改数据流的静态索引设置

静态索引设置只能在创建后备索引时设置。 你不能使用更新索引设置 API更新静态索引设置。

要将新的静态设置应用于未来的后备索引,请更新数据流使用的索引模板。 该设置会自动应用于更新后创建的任何后备索引。

例如,my-index-template 是 my-data-stream 使用的现有索引模板。

以下创建或更新索引模板 API 请求将新的 sort.field 和 sort.order 索引设置添加到模板

PUT /_index_template/my-data-stream-template
{
  "index_patterns": [ "my-data-stream*" ],
  "data_stream": { },
  "priority": 500,
  "template": {
    "settings": {
      "sort.field": [ "@timestamp"],             
      "sort.order": [ "desc"]                    
    }
  }
}

在上面,我们做了如下的操作:

  • 添加 sort.field 索引设置。
  • 添加 sort.order 索引设置。

如果需要,你可以滚动数据流以立即将设置应用到数据流的写入索引。 这会影响翻转后添加到流中的任何新数据。 但是,它不会影响数据流的现有后备索引或现有数据。

要将静态设置更改应用于现有的后备索引,你必须创建一个新的数据流并将你的数据重新索引到其中。 这个在下面讲到。

使用 reindex 更改映射或设置

你可以使用重新索引(reindex)来更改数据流的映射或设置。这通常需要更改现有字段的数据类型或更新后备索引的静态索引设置。

要重新索引数据流,首先创建或更新索引模板,使其包含所需的映射或设置更改。然后,你可以将现有数据流重新索引到与模板匹配的新流中。这会将模板中的映射和设置更改应用于添加到新数据流的每个文档和后备索引。这些更改还会影响新流创建的任何未来后备索引。

按着这些次序:

1)为新数据流选择名称或索引模式。这个新数据流将包含来自现有流的数据。

2)你可以使用 resolve index API 来检查名称或模式是否与任何现有索引、别名或数据流匹配。如果是这样,你应该考虑使用其他名称或模式。

以下解析索引 API 请求检查以 new-data-stream 开头的任何现有索引、别名或数据流。如果不是,可以使用 new-data-stream* 索引模式来创建新的数据流。

GET /_resolve/index/new-data-stream*

API 返回以下响应,指示没有现有目标匹配此模式

{
  "indices": [ ],
  "aliases": [ ],
  "data_streams": [ ]
}

2)创建或更新索引模板。 此模板应包含你要应用于新数据流的后备索引的映射和设置。

该索引模板必须满足数据流模板的要求。 它还应包含你之前在 index_patterns 属性中选择的名称或索引模式。

提示:如果你只是添加或更改一些内容,我们建议你通过复制现有模板并根据需要进行修改来创建一个新模板。

例如,my-index-template 是 my-data-stream 使用的现有索引模板。

以下创建或更新索引模板 API 请求创建一个新的索引模板,new-data-stream-template。 new-data-stream-template 以 my-data-stream-template 为基础,有以下变化:

  • index_patterns 中的索引模式匹配任何以 new-data-stream 开头的索引或数据流。
  • @timestamp 字段映射使用 date_nanos 字段数据类型而不是日期数据类型。
  • 该模板包括 sort.field 和 sort.order 索引设置,这些设置不在原始 my-index-template 模板中。
PUT /_index_template/new-data-stream-template
{
  "index_patterns": [ "new-data-stream*" ],
  "data_stream": { },
  "priority": 500,
  "template": {
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date_nanos"                 
        }
      }
    },
    "settings": {
      "sort.field": [ "@timestamp"],          
      "sort.order": [ "desc"]                 
    }
  }
}

在上面,我们做了如下的操作:

  • 将 @timestamp 字段映射更改为 date_nanos 字段数据类型。
  • 添加 sort.field 索引设置。
  • 添加 sort.order 索引设置。

3)使用创建数据流 API 手动创建新数据流。 数据流的名称必须与新模板的 index_patterns 属性中定义的索引模式相匹配。

我们不建议索引新数据来创建此数据流。 稍后,你会将现有数据流中的旧数据重新索引到这个新流中。 这可能会导致一个或多个支持索引包含新旧数据的混合

重要在数据流中混合新旧数据
虽然混合新旧数据是安全的,但它可能会干扰数据保留。 如果删除旧索引,则可能会意外删除包含新旧数据的后备索引。 为了防止过早的数据丢失,你需要保留这样的后备索引,直到你准备好删除其最新数据。

以下创建数据流 API 请求以 new-data-stream 为目标,它与 new-data-stream-template 的索引模式相匹配。 因为没有现有索引或数据流使用此名称,所以此请求创建新数据流数据流。

PUT /_data_stream/new-data-stream

4)如果你不想在新数据流中混合新旧数据,请暂停新文档的索引。 虽然混合新旧数据是安全的,但它可能会干扰数据保留。

5)如果你使用 ILM 自动滚动,请减少 ILM 轮询间隔。 这确保当前写入索引在等待滚动检查时不会增长太大。 默认情况下,ILM 每 10 分钟检查一次翻转条件。

以下集群更新设置 API 请求将 indices.lifecycle.poll_interval 设置降低到 1m(一分钟)。

PUT /_cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval": "1m"
  }
}

6)使用 op_type create 将你的数据重新索引到新数据流。

如果要按照最初索引的顺序对数据进行分区,可以运行单独的重建索引请求。 这些重新索引请求可以使用单独的支持索引作为源。 你可以使用获取数据流 API 来检索后备索引列表。

例如,你计划将数据从 my-data-stream 重新索引到 new-data-stream。 但是,你想为 my-data-stream 中的每个后备索引提交一个单独的重建索引请求,从最旧的后备索引开始。 这保留了数据最初被索引的顺序。

以下获取数据流 API 请求检索有关 my-data-stream 的信息,包括其支持索引列表。

GET /_data_stream/my-data-stream

响应的 indices 属性包含流的当前后备索引的数组。 数组中的第一项包含有关流的最旧后备索引的信息。

{
  "data_streams": [
    {
      "name": "my-data-stream",
      "timestamp_field": {
        "name": "@timestamp"
      },
      "indices": [
        {
          "index_name": ".ds-my-data-stream-2099.03.07-000001", 
          "index_uuid": "Gpdiyq8sRuK9WuthvAdFbw"
        },
        {
          "index_name": ".ds-my-data-stream-2099.03.08-000002",
          "index_uuid": "_eEfRrFHS9OyhqWntkgHAQ"
        }
      ],
      "generation": 2,
      "status": "GREEN",
      "template": "my-data-stream-template",
      "hidden": false,
      "system": false,
      "allow_custom_routing": false,
      "replicated": false
    }
  ]

我的数据流的索引数组中的第一项。 此项包含有关流的最早支​​持索引 .ds-my-data-stream-2099.03.07-000001 的信息。

以下 reindex API 请求将文档从 .ds-my-data-stream-2099.03.07-000001 复制到 new-data-stream。 请求的 op_type 是创建的。

POST /_reindex
{
  "source": {
    "index": ".ds-my-data-stream-2099.03.07-000001"
  },
  "dest": {
    "index": "new-data-stream",
    "op_type": "create"
  }
}

你还可以使用查询为每个请求重新索引文档的子集。

以下重新索引 API 请求将文档从 my-data-stream 复制到 new-data-stream。 该请求使用范围查询仅重新索引时间戳在上周内的文档。 请注意请求的 op_type 是create。

POST /_reindex
{
  "source": {
    "index": "my-data-stream",
    "query": {
      "range": {
        "@timestamp": {
          "gte": "now-7d/d",
          "lte": "now/d"
        }
      }
    }
  },
  "dest": {
    "index": "new-data-stream",
    "op_type": "create"
  }
}

7)如果你之前更改了 ILM 轮询间隔,请在重建索引完成后将其更改回其原始值。 这可以防止主节点上不必要的负载。

以下集群更新设置 API 请求将 indices.lifecycle.poll_interval 设置重置为其默认值。

PUT /_cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval": null
  }
}

8)使用新的数据流恢复索引。新写入的数据将向这个新的流写入。对此流的搜索现在将查询你的新数据和重新索引的数据。

9)一旦你确认所有重新索引的数据在新数据流中可用,你就可以安全地删除旧数据流。

以下删除数据流 API请求删除 my-data-stream。 此请求还会删除流的支持索引及其包含的任何数据。

DELETE /_data_stream/my-data-stream

文章来源于互联网:Elasticsearch:Data streams(三)

Tags: