到底什么是冷热分离?简单来说,我们会把一些比较新的同时查询要求又比较频繁的数据放在Hot节点上、把一些比较旧的查询比较少的数据放在warm节点上。以达到企业生产环境既能降低成本又能兼顾性能的需求。总之,冷热属性是针对ES集群的数据节点进行配置的。
1,数据通常不会又update 操作,适用于time based索引数据,同时数据量比较大的场景,读写要求高;
2,引入warm节点,低配置大容量的机器存放老数据,降低企业成本;
3, 两类数据节点,不同的硬件配置:
A: Hot节点:索引不断有新文档的写入,Indexing对CPU 、IO都有很高的要求,需要使用高配置的机器,建议使用SSD存储性能高的磁盘。
B:Warm节点:索引不存在新数据的写入,同时也不存在大量的数据查询,通常使用HDD高性能磁盘。通常用它来保存旧的索引。
让一个集群成为冷热集群,只需在ES的配置文件 elasticsearch.yml文件中添加 “node.attr.key:value”即可,注意key:value的值是可以根据实际变化的。
这里以ES6.8.2为列,用一台CVM启动三个ES进程作为实际环境来搭建环境
发现是没有问题的,那么我们现在登录kibana,进入dev tools工具进行操作
默认情况下,集群配置了冷热属性,在没有进行特定的数据设置前,数据是不会优先写入热节点的,这就是为什么我们的用户明明购买了冷热集群,为何实际不生效的原因。我们确认一下:
创建一个索引,插入几条数据:
接下来,我们来看一下,默认情况下,该索引的实际分片分配,如下:
首先通过这条命令查看冷热节点分布详细信息、结果如下
其次,通过GET _cat/shards?v 查看集群分片的分配情况,发现即便是冷热集群,默认情况下,分片也是随机分配的。因为ES6默认情况下索引是5分片,1个副本。会发现这些分片被随机的路由到集群的每个节点上。如下图所示:
一般情况下,生产环境中,我们都会通过模板的方式将该冷热属性设置在有一定优先级的系统模板中,这样,集群在写入数据的时候,默认匹配模板的规则自动创建应用。这个方法我们后面详细来讲。第二种方法作为测试集群冷热属性使用,通过手动匹配索引的方式让特定的索引写入特定的属性节点。
我们先采取第二种方法验证一下,先创建一个索引,设置索引规则,让其默认写到热节点上。设置如下:
使用API GET _cat/shards/test_index?v&h=index,shard,prirep,node&s=node,查看该索引各分片的分布情况,如下:
那么这样,就表明往该索引里写入的数据都会写入热节点上。反之,如果你要将数据写入到warm节点上,就需要将节点属性hot改为warm即可,方法同上,不再赘述。
接下来,我们重点讲第二种方法:通过模板匹配的方式来进行全局设置。
生产集群中,我们肯定因为实际工作情况对ES索引进行设置而不需要手动去指定每一条索引设置进而满足企业实际需求。我们可以通过GET _cat/templates 查看集群中的所有模板
索引模板后面的数字越大,表明优先级越高,那么这里我们创建一个索引为1的索引,结合冷热属性,定义一个hezhentest的模板,可以通过 PUT _template/hezhentest 来创建。
再查看一下,是否成功?发现存在。
那么我们创建一个索引,会不会将分片默认路由到热节点上呢??我们再次创建索引确认,如下:
结果如下:索引默认一个分片,然后分配在热节点上
那么这样通过模板设置后,我们的ES集群的数据默认就写到热节点上了,大大提高了集群的写入速度、同时也减轻了许多手工操作。那么这就是模板的作用,当然你也可以根据不同的需求制定灵活的模板满足不同的需求。在腾讯云ES冷热集群中,这些都已经设置好了。用户只需要购买即可轻松使用云上ES冷热属性带来快捷高速的服务。
在ES中,索引中的日志等性能指标数据会随着时间的增加不断的增长,那么针对这种情况,我们建议以时间序列划分索引的方式去对索引进行命名,那么这种索引管理方式的好处、挑战如下:
1,按照时间进行索引划分,使得管理更加简单。例如:完整删除一个索引,性能比delete by query 好。
2,如何去实现自动化管理,减少人工操作进而实现,从Hot 移动到 Warm 或者定期的关闭或者删除索引呢?
接下来,我们看看下面这张索引生命周期管理的生命周期图:
HOT:索引还存在大量的读写操作
Warm:索引不存在写操作,但是还有被查询的需要
Cold:数据不存在写操作,读操作也不多
Delete:索引不再需要,可以被安全删除或者被关闭
基于Elasticsearch 6.6 X-PACK 推出的新功能,可以免费使用。那么我们将索引索引生命周期管理称为ILM。具体的操作步骤是:先创建一个或者多个策略(policy),然后每个策略根据实际需求去制定不同(phase)加Actions。最后将这个策略应用到索引上,实现自动化统一管理。
其实ILM生命周期管理,Kibana上提供了一个图形化界面供我们方便操作。通过点击”management“,选择”lifecycle policies“这个链接,去尝试创建一个索引生命周期策略:
1,创建2个索引模板,让写入ES的数据根据实际需要写到不同的冷热属性节点上。
2,在新索引数据到ES后,根据索引生命周期策略,1小时后,根据模板的策略移动到不同的属性节点上。
模板信息如下:
索引生命周期管理策略设置:
索引生命周期的管理策略还有很多其它的策略设置,比如:cold 设置、Delete设置 。可以根据实际需求去设置即可,这里主要讲生产环境的常用的操作、配置;
创建一个Nginx-website0430的索引,通过查看其settings,可以知道如下信息:
匹配到了索引周期策略'nginx0430-2',然后默认落到了warm节点上。那么根据这个策略内容,我们可以知道,1小时后,它会挪动到hot节点上,会不会生效呢?我们可以等1个小时看效果:
接着创建一个索引"test_index0430",其匹配的生命策略为:nginx-website0430,默认是在hot节点上,1小时后,会不会自动挪动到warm属性节点呢??也等待一个小时看看。
那么以上这个实际案例就是一个统一的自动生命周期管理的全过程,需要注意一点是:在实际的挪数据的过程中,我们会出现原来在热节点上分片没问题的情况到了冷节点上后,会出现副本分片状态没分片的情况,这是为什么呢?同样的道理,如果你的数据节点,或者是冷节点、或者是热节点,如果节点不够的话,也会导致分片分配不及时的情况,那么这样的话,就需要增加冷或者热节点,即可将未分片的副本进行正常分片。
我们知道,模板、索引生命周期策略只对新写入集群的数据进行生效。但是实际很多情况下,我们使用中的集群一开始并没有考虑到冷热设置,或者是开启了冷热属性但是并没有生效,随着集群数据的日益增多,一来数据越来越大,空间越来越小,如果不及时扩容,就面临集群挂掉的风险。二来,磁盘上的日志数据存储的时间比较长,新旧数据全部存在一起,SSD磁盘成本大。那么,如何将现有的数据挪动到冷节点上进而释放掉部分空间而不用去扩容磁盘,也是我们必须要去解决的问题。
1,手动设置ES集群中的存量索引到warm节点上,一旦设置、立马生效,API命令如下:
PUT /{索引正则}/_settings 如下:
如果在调整的过程中,发现集群的调整速度太慢,当然我们可以通过如下API,调整集群分片迁移的速度、每秒分片恢复的大小(不要调太大,建议最优如下)
2,将新建的索引生命策略应用到存量索引上。可以通过通配符的方式或者单索引设置方式应用,通过如下API设置:
PUT /{索引正则}/_settings
这里,我们用第二种方式将存量索引挪到冷节点上,那么效果是什么呢?我们看看前后对比:
设置策略后,立马生效。
因此,这么一处理,新旧索引完全按照IML的管理方式去自动管理集群上的数据,实现冷热集群的最佳使用。
这里,值得推荐一款ES的管理插件,celebro,它是一款现在非常实用的ES集群的图形化管理工具,对于实际生产运维非常有帮助,建议大家多使用。
在本章节中,我们讲解了ES 集群下非常实用的一款操作:冷热集群与索引生命周期管理。通过这些设置我们即可以自动维护集群上的冷热数据又能兼顾集群的读写性能,还能通过优化集群架构、降低企业生产成本。那么,我们再来总结其工作流程:
1,配置集群的冷热属性
2,根据需求设置索引模板
3,根据实际需求制定生命周期管理策略,并匹配索引模板
4,对存量索引进行冷热设定或者匹配生命周期策略
最后,腾讯云 ES 提供了快速配置构建冷热集群的能力,用户可以在腾讯云官网根据业务需要指定冷热节点规格,快速建立一个冷热分离架构的 ES 集群,当然您也可以将现有集群变配为冷热集群,并且可以根据实际业务变动实现ES冷热节点的弹性伸缩容。
------------------------------------------------------------------------------------
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。