一、背景
项目中一个大约33G的单个索引,出现搜索缓慢的问题,需要先切割,后优化搜索;本次先处理切割问题,使用ILM按模板生成滚动索引
二、基本步骤
1. 通过Java程序启动切割
1.1 按日期生成index
- 生成 date math 类型,index 名称,方便rollover 时 按index provider_name 向后滚动index 名称
- 格式如:下
- /<index-prefix-{now/d-1d{8yyyy-MM-dd}}-000001>:index-prefix-2021-12-02-000001
- /<index-prefix-{now/d-2d{8yyyy-MM-dd}}-1>:index-prefix-2021-12-01-000001
1.2 通过Reindex 迁移数据
POST _reindex
{
"source": {
"index": "source-index",
"type": "_doc",
"query": {
"bool": {
"filter":{"range":{"startTime":{"gte":日期开始时间,"lte":日期结束时间}}}
}
}
},
"dest": {
"index": "index-prefix-2021-12-02-000001"
}
}
2. 备份源索引(可选)
2.1 Reindex方式
- 创建新索引
- 使用Redinx API 将所有数据备份到新索引
3. 删除源索引
DELETE /source_index_name
4. 新索引设置别名
该步骤主要用于,使用原来的查询方式查询index ,不用修改相关逻辑
其中最新一个日期索引,需要设置is_write_index:true
POST _aliases
POST _aliases
{
"actions": [
{
"add": {
"index": "index-prefix-2012-11-23-000001",
"alias": "index-alias",
"is_write_index":false
}
},
{
"add": {
"index": "index-prefix-2012-11-24-000001",
"alias": "index-alias",
"is_write_index":false
}
},
{
"add": {
"index": "index-prefix-2012-11-25-000001",
"alias": "index-alias",
"is_write_index":false
}
},
{
"add": {
"index": "index-prefix-2012-11-26-000001",
"alias": "index-alias",
"is_write_index":true
}
}
]
}
5. 添加ILM策略
5.1 添加策略
该策略不是100%严格,ES6.8通过后台定时任务触发,数据上会有偏差,定时任务10分钟,未查到相关配置
PUT _ilm/policy/index_policy
{
"policy" : {
"phases" : {
"hot" : {
"actions" : {
"rollover" : {
"max_size" : "10gb", #单个索引超过10GB开始分片
"max_age" : "1d" #单个索引保留数据时间超过1天开始分片
"max_docs":100000 #单个索引条数超过100000开始分片
}
}
}
}
}
}
5.2. 最近日期索引应用policy
PUT index-prefix-2012-11-26-000001
{
"settings": {
"index.lifecycle.name": "index_policy",
"index.lifecycle.rollover_alias": "index-alias"
}
}
5.3 template添加lifecycle管理
- 如果有源模板,则获取源模板配置
GET _template/index_template
- 模板配置中增加ILM的相关设置,
lifecyle.name
,lifecycle.rollover_alias
PUT _template/bizseer-forest-forest_event
{
"index_patterns": [
"index_prefix*"
],
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "1",
"lifecycle.name": "index_policy",
"lifecycle.rollover_alias": "index-alias"
}
},
"mappings": {
"_doc": {
"dynamic": false,
"properties": {
"starTime": {
"type": "long"
},
......
}
}
}
6 policy执行情况
执行过程中可通过一下方式查看策略执行的情况
GET index-prefix-2021-*/_ilm/explain
可以重新执行失败的策略
POST index-prefix-2021-11-26-000001/_ilm/retry
7 策略定时周期修改
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval": "10s"
}
注意事项
模板不能设置policy中相同的Rollover alias,否则Rollover失败
切割后最新index,需要设置"is_write_index":true,否则滚动失败