在Elasticsearch中,在针对一些大索引拆分成若干小索引,或者使用reindex迁移原有索引至扩展主分片后的索引时,我们想对目标索引进行rollover滚动切分时,可以使用以下两种方式。
场景:
从logs-2025索引迁移数据到一个支持 rollover的写入别名:
必须先手动创建第一个实际索引(如 logs-000001),并配置write alias(写入别名)和rollover规则。
PUT logs-000001
{
"aliases": {
"logs-write": {
"is_write_index": true
}
}
}
POST _reindex
{
"source": {
"index": "logs-2025"
},
"dest": {
"index": "logs-write"
}
}
注意事项:这里目标索引写的是 "logs-write",实际上Elasticsearch实际会将数据写入它所指向的 is_write_index: true
的实际索引(如 logs-000001)。
手动执行以下rollover触发条件:
POST /logs-write/_rollover
{
"conditions": {
"max_docs": 1000000,
"max_age": "7d"
}
}
这将自动生成 logs-000002 并更新别名指向它。
这里我们使用ILM生命周期策略对索引进行自动托管:
步骤1:创建生命周期策略
PUT _ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "7d",
"max_size": "30gb"
}
}
}
}
}
}
步骤2:创建索引模板绑定策略
PUT _index_template/logs_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"index.lifecycle.name": "logs_policy",
"index.lifecycle.rollover_alias": "logs-write"
}
}
}
ILM 要求第一个索引 必须你手动创建并设置写别名 is_write_index: true:
PUT logs-000001
{
"aliases": {
"logs-write": {
"is_write_index": true
}
}
}
第一个索引我们需要手动初始化,否则 ILM 无法接管。
POST _reindex
{
"source": {
"index": "logs-2025"
},
"dest": {
"index": "logs-write"
}
}
Elasticsearch 会将数据写入 logs-write 指向的 logs-000001。
只要logs-write的目标索引达到设置的:
ILM就会自动rollover,创建logs-000002,并把logs-write指向新索引。
可以通过以下语句检查生命周期进度:
GET logs-000001/_ilm/explain
注意事项
_rollover
。is_write_index
的别名,reindex会失败。在 Elasticsearch 中,使用 reindex 将数据迁移到一个新索引,并希望目标索引启用 ILM(Index Lifecycle Management)策略并自动rollover,需要正确配置索引、别名、ILM 策略和模板,让ILM能识别并控制滚动行为。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。