修改数据流

edit

更改数据流的映射和设置

edit

每个数据流都有一个匹配的索引模板。该模板的映射和索引设置会应用于为该流创建的新支持索引。这包括在流创建时自动生成的流的首个支持索引。

在创建数据流之前,我们建议您仔细考虑在此模板中包含哪些映射和设置。

如果您稍后需要更改数据流的映射或设置,您有几个选项:

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

向数据流添加新字段映射

edit

要为数据流中的新字段添加映射,请按照以下步骤操作:

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

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

    以下创建或更新索引模板请求为模板添加了一个新字段message的映射。

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

    为新的 message 字段添加映射。

  2. 使用更新映射 API 将新字段映射添加到数据流中。默认情况下,这会将映射添加到流的现有支持索引中,包括写入索引。

    以下更新映射 API 请求将新的 message 字段映射添加到 my-data-stream

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

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

    以下更新映射请求仅将新的 message 字段映射添加到 my-data-stream 的写入索引。新的字段映射不会添加到流的其它后备索引中。

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

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

edit

每个映射参数的文档都指明了是否可以使用更新映射 API来更新现有字段的参数。要更新现有字段的这些参数,请按照以下步骤操作:

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

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

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

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

    host.ip 字段的 ignore_malformed 值更改为 true

  2. 使用更新映射 API将映射更改应用于数据流。默认情况下,这将更改应用于流的现有支持索引,包括写入索引。

    以下更新映射API请求针对my-data-stream。该请求将host.ip字段的ignore_malformed映射参数的参数更改为true

    PUT /my-data-stream/_mapping
    {
      "properties": {
        "host": {
          "properties": {
            "ip": {
              "type": "ip",
              "ignore_malformed": true
            }
          }
        }
      }
    }

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

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

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

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

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

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

edit

要更改数据流的动态索引设置,请按照以下步骤操作:

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

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

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

    PUT /_index_template/my-data-stream-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-streamindex.refresh_interval 设置。

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

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

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

edit

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

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

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

以下创建或更新索引模板API请求 向模板添加新的sort.fieldsort.order index设置。

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 更改映射或设置

edit

您可以使用重新索引来更改数据流的映射或设置。这通常是必需的,以更改现有字段的类型或更新支持索引的静态索引设置。

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

请按照以下步骤操作:

  1. 选择一个名称或索引模式以创建新的数据流。这个新的数据流将包含来自您现有流的数据。

    您可以使用 resolve index API 来检查名称或模式是否与任何现有索引、别名或数据流匹配。如果是,您应考虑使用另一个名称或模式。

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

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

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

    {
      "indices": [ ],
      "aliases": [ ],
      "data_streams": [ ]
    }
  2. 创建或更新索引模板。此模板应包含您希望应用于新数据流支持索引的映射和设置。

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

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

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

    以下创建或更新索引模板API请求 创建一个新的索引模板,new-data-stream-templatenew-data-stream-template使用my-data-stream-template作为其基础,并进行了以下更改:

    • index_patterns 中的索引模式匹配任何以 new-data-stream 开头的索引或数据流。
    • @timestamp 字段映射使用 date_nanos 字段数据类型,而不是 date 数据类型。
    • 模板包括 sort.fieldsort.order 索引设置,这些设置在原始的 my-data-stream-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 的索引模式匹配。 由于没有现有索引或数据流使用此名称,此请求将创建 new-data-stream 数据流。

    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_typecreate 将您的数据重新索引到新的数据流。

    如果您想按照数据最初索引的顺序对其进行分区,可以运行单独的重新索引请求。这些重新索引请求可以使用单独的备份索引作为源。您可以使用获取数据流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",
              "prefer_ilm": true,
              "managed_by": "Unmanaged"
            },
            {
              "index_name": ".ds-my-data-stream-2099.03.08-000002",
              "index_uuid": "_eEfRrFHS9OyhqWntkgHAQ",
              "prefer_ilm": true,
              "managed_by": "Unmanaged"
            }
          ],
          "generation": 2,
          "status": "GREEN",
          "next_generation_managed_by": "Unmanaged",
          "prefer_ilm": true,
          "template": "my-data-stream-template",
          "hidden": false,
          "system": false,
          "allow_custom_routing": false,
          "replicated": false,
          "rollover_on_write": false
        }
      ]
    }

    第一个在 indices 数组中的项目,对应于 my-data-stream。该项目包含关于数据流的最早支持索引的信息,即 .ds-my-data-stream-2099.03.07-000001

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

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

    您还可以使用查询来重新索引每次请求中的一部分文档。

    以下reindex API请求将文档从 my-data-stream复制到new-data-stream。该请求 使用range查询仅重新索引时间戳在过去一周内的文档。请注意,请求的op_typecreate

    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"
      }
    }

更新或添加数据流的别名

edit

使用别名 API来更新现有数据流的别名。更改现有数据流在其索引模式中的别名不会产生效果。

例如,logs 别名指向一个单一的数据流。以下请求将别名的流进行交换。在此交换过程中,logs 别名没有停机时间,并且永远不会同时指向两个流。

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "logs-nginx.access-prod",
        "alias": "logs"
      }
    },
    {
      "add": {
        "index": "logs-my_app-default",
        "alias": "logs"
      }
    }
  ]
}