ES8.3.3配置冷热分离

业务背景

数据每天3亿条数据入库,需要同时满足三年以上数据的查询,服务器集群分为固态和机械两种,要求将近期数据查询尽可能提速,同时久远数据也可查

解决方案

利用ES新版本的Index Lifecycle Policies进行冷热数据配置
先在elasticsearch.yml中将各个节点设置冷热属性

node.attr.hotwarm_type:

在这里插入图片描述

方案1:适用于测试、索引较少的情况

  1. 建模板、设置分片数等信息
  2. 建索引
  3. HTTP接口设置别名
  4. 配置生命周期模板
  5. 绑定生命周期模板

建立一个索引名,如m12_insertzone-000001,将这个索引名设置一个别名,这样的话可以保证读的时候索引名一致,只需要访问别名,即可在所有索引中查询

Post http://172.16.10.130:9200/_aliases
{
	"actions": [{
		"add": {
			"index": "m12_insertzone-000001",
			"alias": "m12_insertzone",
			"is_write_index": true
		}
	}]
}

设置完别名后,还可设置当多个索引共用同一个别名时,选择哪个索引作为写入"is_write_index": true

注意es索引名要求以-结尾带数字,后续6位数字随机,命名规则参见此博客
https://rstyro.github.io/blog/2020/09/27/Elasticsearch7%E4%B9%8BRollover%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/

配置好后进入kibana
在这里插入图片描述
此处打开Enable rollover,可在满足条件时自动新建一个新的索引,后续数据将往此索引上写。
在这里插入图片描述
再配置Hot往warm上的迁移策略,满足条件后,数据分片将从hot节点移动到warm节点上。
保存配置后,将相应的生命周期添加到对应的索引上。
在这里插入图片描述
写入数据后进行测试
在这里插入图片描述
注意此时如果需要索引继续迭代到下一个索引,需要在自动创建的索引上继续绑定生命线策略

方案2:适用于真实环境、海量索引构建

1、通过kibana在页面配置生命周期
2、通过代码批量生成对应的模板构建json文件(order,index_patterns,settings(绑定生命周期模板、滚动更新别名,索引属性均设置为hot,warm状态由ILM控制),mapping均要设置,千万不能设置alias),通过脚本批量HTTP请求创建模板
3、通过代码批量生成对应的索引构建json文件(设置alias,is_write_index,其余设置会被模板覆盖),通过脚本批量HTTP请求创建索引
代码生成脚本参考以下博客https://blog.csdn.net/wenyichuan/article/details/137910749

示例模板

{
	"order": 0,
	"index_patterns": ["m22_sample_30-*"],
	"settings": {
		"index": {
			"lifecycle": {
				"rollover_alias": "m22_sample_30",
				"name": "iscas-ilm-policy"
			},
			"routing": {
				"allocation": {
					"require": {
						"hotwarm_type": "hot"
					}
				}
			},
			"number_of_shards": "6",
			"translog": {
				"durability": "async",
				"sync_interval": "30s",
				"flush_threshold_size": "1024mb"
			},
			"number_of_replicas": "1"
		}
	},
	"mappings": {
		"properties": {
			"satelliteTime": {
				"type": "date",
				"format": "yyyy-MM-dd HH:mm:ss.SSS"
			},
			"value": {
				"type": "double"
			}
		}
	}
}

示例索引

{
	"aliases": {
		"m22_sample_60": {
			"is_write_index": true
		}
	}
}

踩坑点

  1. 模板中不支持利用painless脚本语言动态截取索引字符串,例如ctx.index.name,如果多个索引用相同的配置,仅仅是别名不同,无法根据索引名去动态生成模板中的索引名
  2. 模板中的mapping,setting,alias是默认存在的,就算不设置,保存后ES也会设定一个空值,区别在于空值mapping,setting会覆盖索引,空值alias不会覆盖索引
  3. 设置的模板信息setting、mapping会比生命周期滚动读取继承的索引优先级高(alias不在此列),例如:配置一个模板,只设置部分setting信息,此时生命周期滚动产生的索引会继承模板的空mapping信息,以及settting信息,比如模板配置了"index.lifecycle.name",没配置"index.lifecycle.rollover_alias",索引中两个都配置了,在后期滚动产生的索引中只会保留模板中配置了的"index.lifecycle.name"而"index.lifecycle.rollover_alias"会丢失,"在ES8.3.3中,这个问题只有多次滚动后才会发生,应该是ES的bug,总结在使用生命周期时,有多少个需要滚动的原始索引就创建多少个模板,填好所有的mapping,setting,但是不要配置alias,alias需要在原始索引上配置,否则后续滚动产生的索引会出现别名冲突的问题,别名让ILM读取index.lifecycle.rollover_alias的信息
  4. 所有的索引、模板配置层面,索引信息均为hot,其余的阶段warm,cold,delete,均是生命周期的优先级会高于模板,无需用户配置
  5. hot往warm的迁移,只有当hot上存在两个及以上分片时可触发,如果hot阶段只有一个分片,是不会往warm阶段迁的,只有当hot存在多个分片,且只有一个分片在被写入时,其余不发生写入的分片才开始往下个阶段迁移,所以如果不配置hot阶段,会默认采用30天50G分裂的配置,此时如果集群数据量很少,在测试时会一直无法进入warm状态
  6. 如果集群中索引数量很大,要注意集群最大分片数,从ES7以后,单节点限制1000个分片,如1414个索引,设置6个分片,1个副本,此时系统会存在141462=16968个分片,节点数量不足会停止生命周期滚动,设置单节点最大分片数量方法参考,注意这个是单节点最大分片数,集群总分片数需要乘节点数,需要修改参考https://blog.csdn.net/wenyichuan/article/details/138339652
  7. ES会限制Search返回结果最大条数(默认10000),需要修改参考
    https://blog.csdn.net/wenyichuan/article/details/138339652
  8. 如果配置了
[PUT]  _all/_settings
{ 
  "index.max_result_window": 2147483647
}

在滚动生成新索引后,不会继承该值,仍会取默认值10000,原因是这个设置只针对当前集群内索引生效,新创建的索引不生效,这样会导致查询设置size过大时,无法进行返回和统计数据

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值