ES索引切分实战

2,072 阅读2分钟

背景

当前订单的es索引为一个大索引order_doc,大小在1.5T左右,相对来说占用空间比较大,目前存在两个问题:1.无法对老数据进行归档,一直占用空间;2.索引迁移时间较长(可以通过增量迁移方式来规避)。

期望老索引能按月切分到新索引,新文档写入到切分后的新索引,如果新索引不存在则自动创建,方便对于老文档进行归档,比如将切分后比较老的索引归档到oss。

整体方案设计

image.png

1.通过reindex将老索引order_doc切分到一个个order_doc.yyyy_MM格式的小索引,完成之后删除order_doc。

2.给老索引order_doc添加别名alias_order_doc。

3.order_doc.yyyy_MM索引根据索引模板创建,索引模板里设置别名alias_order_doc,保证新生成的每个索引有相同的别名,方便后续搜索。

4.新数据都写入到拆分后的新索引上,并且删除老索引里对应的数据。

5.通过别名进行搜索,会从老索引和新索引一起搜索文档。

执行步骤

image.png

template示例

1.index_patterns索引匹配模式,order_docs.*匹配所有order_docs.开头的文档。

2.aliases定义了索引的别名。

{
  "template_order_doc" : {
    "order" : 0,
    "index_patterns" : [
      "order_doc.*"
    ],
    "settings" : {
      },
    "mappings" : {
    },
    "aliases" : {
      "alias_order_doc" : { }
    }
  }
}

reindex示例

1.本示例将order_doc索引中orderTime范围为1630252800000到1630252800000之间的文档重建到order_doc.2021_08索引中。

2.slices=4通过将老索引查询出来的数据切分成4部分来并发重建,提升重建效率,官方建议slices小于等于索引分片数。

3."op_type": create,"conflicts":"proceed"这两个参数配合使用达到只重建新索引不存在的文档的目的,防止出现老文档覆盖新文档的问题,"op_type": create表示重建操作只会新增新索引中不存在的文档,"conflicts":"proceed"表示如果新索引中已存在id相同的文档,则跳过继续其他文档的重建,而不是终止重建操作,默认为abort终止重建。

POST _reindex?slices=4&refresh
{
  "conflicts":"proceed",
  "source": {
    "index": "order_doc",
    "type": "_doc",
      "query": {
      "bool": {
        "filter": {
          "range": {
            "orderTime": {
              "gte": "1630252800000",
              "lt": "1630252800000"
            }
          }
        }
      }
    }
  },
  "dest": {
    "index": "order_doc.2021_08"
    "op_type": create
  }
}

总结

1.应用通过别名搜索,方便后续索引重写、归档等操作,提升灵活性。

2.通过索引模板统一定义新索引。

3.reindex可以通过slices,op_type,conflicts等参数控制重建操作,以达到个性化重建和提升重建效率的目的。

附录

1.redinex官方文档:www.elastic.co/guide/en/el…

以上,希望对你有所帮助,如果有不同看法或疑问欢迎随时和我讨论。