ElasticSearch 使用生命管理周期策略治理大分片

307 阅读3分钟

环境

  • windows
  • 单节点es集群

分析大分片索引的处理方式

  1. 直接删除
    • 对应的业务系统已经下线
    • 索引数据已经过期或者不重要
  2. 删除索引数据
    • 索引存在无意义的数据,可以进行条件删除,并创建定期删除计划
  3. 拆分索引
    • 索引数据不更新,可以将索引拆分成多个索引,利用别名查询
    • 索引数据每天都在新增,如时间序列数据,可以使用索引生命周期策略管理索引

具体实现

删除索引

删除单个索引

DELETE /index-name

删除前缀为index-prefix的索引

DELETE index-prefix*

删除索引数据

POST /index-name/_delete_by_query
{
  "query": {
    "range": {
                  "message_time": {
                    "gte": "2022-07-01T00:00:00" ,
                    "lte": "2022-07-20T23:59:59" 
           }
         }
  }
  
}

出现响应502时可以使用以下方法删除

POST /index-name/_delete_by_query?conflicts=proceed&wait_for_completion=false
{
  "query": {
    "range": {
                  "message_time": {
                    "gte": "2022-07-01T00:00:00" ,
                    "lte": "2022-07-20T23:59:59" 
           }
         }
  }
  
}

#查看任务
GET  /_tasks/task:id
#取消任务
POST _tasks/task:id/_cancel

执行上面的操作只是将文档标记为已删除,需要使用强制合并segment将已标记的删除文档从屋里上删除

#查找存在删除文档的索引
GET _cat/indices?v&s=docs.deleted:desc

# 强制合并
POST /ops/_forcemerge?only_expunge_deletes=true&max_num_segments=1


# 查看segment情况
GET /_cat/segments/index-name/?v&s=prirep,shard

GET /_cat/segments/ops?v&s=docs.deleted:desc,segment

拆分索引

拆分索引,利用别名查询

暂无实践

使用生命周期管理策略重建索引

对于不断增长时序类数据,如日志、监控信息等,会随着时间的积累数据量越来越大,且查询、写入都是近期的数据,历史数据意义不大,可以使用ILM定期将数据滚动至新的索引,防止因数据量大影响查询效率和成本。

  1. 创建临时索引temp,mappings数据结构与待重建索引my-index一致
PUT /temp
{
    "mappings":{}
}
  1. 将my-index数据同步至temp
POST /_reindex?wait_for_completion=false
{
 "source": {
  "index": "my-index",
  "size":5000
 },
 "dest": {
  "index": "temp",
  "op_type": "create"
 },
 "conflicts": "proceed"
}

GET  /_tasks/task:id
- source.size: 批次大小设置,默认为1000

3. 定义数据的冷热策略

PUT /_ilm/policy/policy_my_index
{
  "policy": {
    "phases": {
        "hot": {
            "actions": {
                "rollover": {
                     "max_age": "7d" ,
                     "max_size": "50G"  
                },
                "set_priority": {
               "priority": 100
             }
            }
        },
        "warm": {
            "actions": {
                "forcemerge" : {
                  "max_num_segments": 1
               },
               "allocate": {
                  "number_of_replicas": 0
                },
                "shrink": {
                "number_of_shards":1
                 },
                "readonly": {},
                "set_priority": {
                  "priority": 50
               }
            }
        },
        "delete": {
            "min_age": "30d",
            "actions": {
                "delete": {}
            }
        }
    }
  }
}

参数说明
hot索引滚动跟新(rollover)触发条件:使用超过7天(max_age)、数据写入达到50G(max_size)。此时系统将创建一个新索引,该索引将重新启动策略,而旧索引将在滚动更新后进入warm阶段。
warm索引进入warm阶段后,ILM会将索引收缩到1个分片,将索引强制合并为1个段。完成该操作后,索引将在30天(从滚动更新时算起)后进入delete阶段。
cold
delete索引进入delete阶段
  1. 删除my-index
DELETE /my-index
  1. 创建索引模板
PUT _template/template_my-index
{
  "index_patterns": ["my-index-*"],                 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "policy_my-index",      
    "index.lifecycle.rollover_alias": "my-index" 
  },
  "mappings" : {}
}

#指定索引新建时所分配的节点(此项不指定会默认分配到所有节点)多节点有效 "routing.allocation.require.box_type": "hot"

  1. 创建用于ILM的初始索引
PUT my-index-000001
{
  "aliases": {
    "my-index": {
      "is_write_index": true
    }
  }
}

aliases 与 上面模板设置的一致

  1. 将temp数据同步至my-index
  • 与步骤2类似

参考