管理现有索引

编辑

如果您一直在使用 Curator 或其他机制来管理周期性索引,那么在迁移到 ILM 时,您有以下几种选择

  • 设置您的索引模板以使用 ILM 策略来管理您的新索引。一旦 ILM 管理您的当前写入索引,您可以将适当的策略应用于您的旧索引。
  • 重新索引到 ILM 管理的索引中。

从 Curator 5.7 版本开始,Curator 将忽略 ILM 管理的索引。

将策略应用于现有的时间序列索引

编辑

使用 ILM 管理周期性索引的最简单方法是配置索引模板,以便将生命周期策略应用于新索引。一旦您正在写入的索引由 ILM 管理,您可以手动将策略应用于您的旧索引。

为您的旧索引定义一个单独的策略,该策略省略了滚动更新操作。滚动更新用于管理新数据的位置,因此不适用。

请记住,应用于现有索引的策略会将每个阶段的 min_age 与索引的原始创建日期进行比较,并可能立即执行多个阶段。如果您的策略执行资源密集型操作(如强制合并),您不希望在切换到 ILM 时同时有大量索引执行这些操作。

您可以在用于现有索引的策略中指定不同的 min_age 值,或者设置 index.lifecycle.origination_date 来控制索引年龄的计算方式。

一旦所有预 ILM 索引都已过时并被删除,您可以删除用于管理它们的策略。

如果您使用的是 Beats 或 Logstash,则在 7.0 及更高版本中启用 ILM 会自动设置 ILM 来管理新索引。如果您通过 Logstash 使用 Beats,您可能需要更改 Logstash 输出配置并调用 Beats 设置以将 ILM 用于新数据。

重新索引到托管索引

编辑

除了将策略应用于现有索引之外,另一种选择是将您的数据重新索引到 ILM 管理的索引中。如果使用少量数据创建周期性索引导致分片计数过多,或者如果不断索引到同一索引导致分片过大和性能问题,您可能需要这样做。

首先,您需要设置新的 ILM 管理的索引

  1. 更新您的索引模板以包含必要的 ILM 设置。
  2. 引导一个初始索引作为写入索引。
  3. 停止写入旧索引,并使用指向引导索引的别名索引新文档。

要重新索引到托管索引

  1. 如果您不想将新旧数据混合在 ILM 管理的索引中,请暂停索引新文档。在一个索引中混合旧数据和新数据是安全的,但是一个组合索引需要保留到您准备删除新数据时。
  2. 减少 ILM 轮询间隔,以确保索引在等待滚动更新检查时不会变得太大。默认情况下,ILM 每 10 分钟检查一次是否需要执行操作。

    resp = client.cluster.put_settings(
        persistent={
            "indices.lifecycle.poll_interval": "1m"
        },
    )
    print(resp)
    response = client.cluster.put_settings(
      body: {
        persistent: {
          'indices.lifecycle.poll_interval' => '1m'
        }
      }
    )
    puts response
    const response = await client.cluster.putSettings({
      persistent: {
        "indices.lifecycle.poll_interval": "1m",
      },
    });
    console.log(response);
    PUT _cluster/settings
    {
      "persistent": {
        "indices.lifecycle.poll_interval": "1m" 
      }
    }

    每分钟检查一次,以查看是否需要执行滚动更新等 ILM 操作。

  3. 使用 reindex API 重新索引您的数据。如果要按照原始索引的顺序对数据进行分区,您可以运行单独的重新索引请求。

    文档保留其原始 ID。如果您不使用自动生成的文档 ID,并且从多个源索引重新索引,您可能需要进行额外的处理以确保文档 ID 不会冲突。一种方法是在重新索引调用中使用脚本将原始索引名称附加到文档 ID。

    resp = client.reindex(
        source={
            "index": "mylogs-*"
        },
        dest={
            "index": "mylogs",
            "op_type": "create"
        },
    )
    print(resp)
    response = client.reindex(
      body: {
        source: {
          index: 'mylogs-*'
        },
        dest: {
          index: 'mylogs',
          op_type: 'create'
        }
      }
    )
    puts response
    const response = await client.reindex({
      source: {
        index: "mylogs-*",
      },
      dest: {
        index: "mylogs",
        op_type: "create",
      },
    });
    console.log(response);
    POST _reindex
    {
      "source": {
        "index": "mylogs-*" 
      },
      "dest": {
        "index": "mylogs", 
        "op_type": "create" 
      }
    }

    与您现有的索引匹配。使用新索引的前缀使使用此索引模式更容易。

    指向您引导索引的别名。

    如果多个文档具有相同的 ID,则停止重新索引。建议这样做是为了防止在不同源索引中的文档具有相同 ID 时意外覆盖文档。

  4. 重新索引完成后,将 ILM 轮询间隔设置回其默认值,以防止主节点上的不必要负载

    resp = client.cluster.put_settings(
        persistent={
            "indices.lifecycle.poll_interval": None
        },
    )
    print(resp)
    response = client.cluster.put_settings(
      body: {
        persistent: {
          'indices.lifecycle.poll_interval' => nil
        }
      }
    )
    puts response
    const response = await client.cluster.putSettings({
      persistent: {
        "indices.lifecycle.poll_interval": null,
      },
    });
    console.log(response);
    PUT _cluster/settings
    {
      "persistent": {
        "indices.lifecycle.poll_interval": null
      }
    }
  5. 使用相同的别名恢复索引新数据。

    使用此别名查询现在将搜索您的新数据和所有重新索引的数据。

  6. 一旦您验证了所有重新索引的数据都可以在新的托管索引中使用,您可以安全地删除旧索引。