背景
当前订单的es索引为一个大索引order_doc,大小在1.5T左右,相对来说占用空间比较大,目前存在两个问题:1.无法对老数据进行归档,一直占用空间;2.索引迁移时间较长(可以通过增量迁移方式来规避)。
期望老索引能按月切分到新索引,新文档写入到切分后的新索引,如果新索引不存在则自动创建,方便对于老文档进行归档,比如将切分后比较老的索引归档到oss。
整体方案设计
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.通过别名进行搜索,会从老索引和新索引一起搜索文档。
执行步骤
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…
以上,希望对你有所帮助,如果有不同看法或疑问欢迎随时和我讨论。