文章目录

  • 背景介绍
  • 操作和优化方法
  • 步骤一、新建空索引,按照业务规划设计进行创建
  • 步骤二、重建索引准备,禁用刷新和副本复制
  • 步骤三、重建索引,并通过参数设置加快索引重建效率
  • 步骤四、恢复新索引副本数和刷新间隔
  • 步骤五、检查索引重建情况
  • elasticsearch _reindex api详细介绍
  • request parameter 请求参数详解
  • request body 请求主体参数详解
  • response Body


背景介绍

在实际的业务生产中,经常由于主分片的调整,或者数据的迁移,索引名称规则的改变,都可以通过索引重建的方式来进行处理。但当生产环境数据量较大时,使用重建索引必定要注意很多细节,才能顺利完成索引重建工作,这里就讲解如何总性能优化。

操作和优化方法

步骤一、新建空索引,按照业务规划设计进行创建

新建空索引,用于放置重建后的数据

# 设置索引分片方式
PUT /tags-release
{
  "settings": {
    "number_of_shards":3,
    "number_of_replicas":2
  }
}

# 新建别名
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "tags-release",
        "alias": "tags-public"
      }
    }
  ]
}

# 删除原有别名
POST /_aliases
{
  "actions":{
    "remove":{
      "index":"tags",
      "alias":"tags-public"
    }
  }
}

步骤二、重建索引准备,禁用刷新和副本复制

# 新索引的临时禁用刷新和副本复制
PUT /tags-release/_settings
{ 
  "refresh_interval": -1,
  "number_of_replicas": 0
}

步骤三、重建索引,并通过参数设置加快索引重建效率

POST /_reindex?slices=3&refresh&timeout=1000000s
{
  "source": {
    "index": "tags",
    "size": 10000
  },
  "dest": {
    "index": "tags-release"
  }
}

请求参数解释:

  • slices
    参数用于指定主分片数量;
  • refush
    用于指定是否刷新;
  • timeout
    为超时时长
    请求主体参数解释:
  • source:
    源索引信息
    – index
    源索引名称
    – size
    batch_size大小;这里需要注意,size最大可设置为10000;
  • desc
    目标索引信息
    – index
    目标索引名
    这里的size为batch_size,可根据实际数据量情况进行调大或调小,通常的原则是设置在10万以内;

步骤四、恢复新索引副本数和刷新间隔

# 恢复副本复制和刷新间隔
PUT /tags-release/_settings
{ 
  "refresh_interval": "1s",
  "number_of_replicas": 2
}

步骤五、检查索引重建情况

检查思路如下:

  • 检查重建索引后的mapping是否一致,若不一致,则检查第一步put的setting和mapping
  • 重建索引后的记录数是否一致
  • 重建索引后的文档数是否一致
  • 重建后的索引主分片书和分片副本数是否符合规划

elasticsearch _reindex api详细介绍

请求格式:

POST _reindex?请求参数
{
    "请求主体"...
}

响应格式:

{
  "took" : *****,
  "timed_out" : false,
  "total" : *****,,
  "updated" : 0,
  "created" : *****,,
  "deleted" : 0,
  "batches" : *****,,
  "version_conflicts" : 0,
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "slices" : [
    {
      "slice_id" : 0,
      "total" : *****,,
      "updated" : 0,
      "created" : *****,,
      "deleted" : 0,
      "batches" : *****,,
      "version_conflicts" : 0,
      "noops" : 0,
      "retries" : {
        "bulk" : 0,
        "search" : 0
      },
      "throttled_millis" : 0,
      "requests_per_second" : -1.0,
      "throttled_until_millis" : 0
    },
    ...
  ],
  "failures" : [ ]
}

request parameter 请求参数详解

  • refresh
    (可选,枚举)如果为true,Elasticsearch刷新受影响的分片以使该操作可见以进行搜索,如果是,wait_for则等待刷新以使该操作可见以进行搜索,如果false不进行任何刷新。有效值:true,false,wait_for。默认值:false。
  • master_timeout
    (可选,时间单位)指定等待连接到主节点的时间段。如果在超时到期之前未收到任何响应,则请求将失败并返回错误。默认为30s。
  • timeout
    (可选,时间单位)指定等待响应的时间段。如果在超时到期之前未收到任何响应,则请求将失败并返回错误。默认为30s。
  • wait_for_active_shards
    (可选,字符串)在继续操作之前必须处于活动状态的分片副本数。设置为all或最大为索引(number_of_replicas+1)中分片总数的任何正整数。默认值:1,主分片。
    请参阅活动分片。
  • wait_for_completion
    (可选,布尔值)如果为true,则请求将阻塞,直到操作完成为止。默认为true。
  • requests_per_second
    (可选,整数)此请求的限制,以每秒子请求为单位。-1表示没有节气门。预设为0。
  • scroll
    (可选,时间单位)指定对于滚动搜索应保持索引的一致视图多长时间。
  • slices
    (可选,整数)此任务应划分的片数。默认为1,表示该任务未分割为子任务。
  • max_docs
    (可选,整数)要处理的最大文档数。默认为所有文档。

request body 请求主体参数详解

  • conflicts
    (可选,枚举)设置为proceed即使发生冲突也继续重新编制索引。默认为abort。
  • source
    – index
    (必需,字符串)要从中复制索引的名称。还接受以逗号分隔的索引列表,以便从多个来源重新索引。
    – max_docs
    (可选,整数)要重新编制索引的最大文档数。
    – query
    (可选,查询对象)指定要使用查询DSL重新编制索引的文档。
    – remote
    — host
    (可选,字符串)要从中索引的Elasticsearch远程实例的URL 。从远程索引时是必需的。
    — username
    (可选,字符串)用于与远程主机进行身份验证的用户名。
    — password
    (可选,字符串)用于与远程主机进行身份验证的密码。
    — socket_timeout
    (可选,时间单位)远程套接字读取超时。默认为30秒。
    — connect_timeout
    (可选,时间单位)远程连接超时。默认为30秒。
    – size
    (可选,整数)每批要编制索引的文档数。从远程建立索引时使用,以确保批处理适合堆上缓冲区,默认大小为100 MB。
    – slice
    — id
    (可选,整数)用于手动切片的切片ID 。
    — max
    (可选,整数)切片总数。
    – sort
    (可选,列表):在索引之前要用逗号分隔的对列表。与结合使用max_docs以控制对哪些文档重新编制索引。
    在7.6中弃用。
    不建议在reindex中进行排序。绝对不能保证对reindex进行排序可以按顺序对文档建立索引,并阻止reindex的进一步发展,例如弹性和性能改进。如果与结合使用max_docs,请考虑改为使用查询过滤器。
    – _source
    (可选,字符串)如果重新true索引所有源字段。设置为列表以重新索引选择字段。默认为true。
  • dest
    – index
    (必需,字符串)要复制到的索引的名称。
    – version_type
    (可选,枚举)用于索引操作的版本控制。有效值:internal,external,external_gt,external_gte。有关更多信息,请参见版本类型。
    – op_type
    (可选,枚举)设置为仅创建不存在的索引文档(如果不存在,则放置)。有效值:index,create。默认为index。
    – type
    (可选,字符串) [ 6.0.0 ] 在6.0.0中弃用。类型已弃用,正在删除中。请参阅删除映射类型。重新索引文档的文档类型。默认为_doc。
    在未指定destination的情况下,也始终会忽略源索引中的类型type。如果显式指定了目标type,则指定的类型必须与目标索引中的类型匹配,或者为未指定或特殊值_doc。有关更多详细信息,请参见删除映射类型。
  • script
    – source
    (可选,字符串)在重新编制索引时运行以更新文档源或元数据的脚本。
    – lang
    (可选,枚举)脚本语言:painless,expression,mustache,java。有关更多信息,请参见脚本。

response Body

  • took
    (整数)整个操作花费的总毫秒数。
  • timed_out
    {boolean)true如果在重新索引期间执行的任何请求超时,则设置此标志。
  • total
    (整数)成功处理的文档数。
  • updated
    (整数)成功更新的文档数,即在重新索引更新之前已存在具有相同ID的文档。
  • created
    (整数)成功创建的文档数。
  • deleted
    (整数)成功删除的文档数。
  • batches
    (整数)由重新索引拉回的滚动响应数。
  • noops
    (整数)由于用于重新索引的脚本返回的noop值而被忽略的文档数ctx.op。
  • version_conflicts
    (整数)重新索引命中的版本冲突数。
  • retries
    (整数)重索引尝试的重试次数。bulk是重试的批量操作search数,也是重试的搜索操作数。
  • throttled_millis
    (整数)请求睡眠以符合的毫秒数requests_per_second。
  • requests_per_second
    (整数)在重新索引期间每秒有效执行的请求数。
  • throttled_until_millis
    (整数)此字段在_reindex响应中应始终等于零。它只有在使用Task API时才有意义,它表示下一次(自epoch以来的毫秒数),为了符合,将再次执行受限制的请求requests_per_second。
  • failures
    (数组)失败数组,如果在此过程中有任何不可恢复的错误。如果这是非空的,则请求由于这些失败而中止。重新索引是使用批处理实现的,任何失败都会导致整个过程中止,但是当前批处理中的所有失败都会收集到阵列中。您可以使用该conflicts选项来防止重新索引在版本冲突时中止。