Elasticsearch冷热分离技术验证
1、背景信息
- 趣街ES集群目前采用的是传统的角色混用模式进行部署的,若有node脱离集群或发生故障,对整体集群影响较大。且业务数据长年累积,数据没有生命周期性的管理策略,当数据达到一定量时,必然会造成服务的内存、CPU、IO等指标上涨,影响Elasticsearch的全文检索能力。生产上多次出现因大查询等其他因素所导致的集群抖动,从而影响生产正常业务的事件。
2、Elasticsearch-ilm概述
- Elasticsearch 6.6.0及以上版本提供了索引生命周期管理ILM功能,将索引生命周期分为4个阶段:
hot
、warm
、cold
、delete
。其中hot
阶段主要负责对索引进行滚动更新操作,warm
、cold
、delete
阶段主要负责进一步处理索引数据,详细功能如下:Rollover
(滚动更新):在当前索引达到特定大小、文档计数或存在时间时,开始写入到新索引(my-index-000001)Shrink
(分片收缩): 减少索引中主分片的数量Force merge
(强制合并分片段数): 触发强制合并操作以减少索引分片中的段数。Freeze
(冻结索引): 冻结索引并使其只读Delete
(删除索引): 永久删除索引,包括其所有数据和元数据。
2.1、ilm应用场景-常规
阶段 | 描述 | |
---|---|---|
hot | 该策略设置索引只要满足其中任一条件:数据写入达到1 GB、使用超过1天、doc数超过1000,就会触发索引滚动更新。此时系统将创建一个新索引,该索引将重新启动策略,而旧索引将在滚动更新后等待30分钟进入warm阶段 | |
warm | 索引进入warm阶段后,ILM会将索引收缩到1个分片,强制合并为1个段。完成该操作后,索引将在1小时(从滚动更新时算起)后进入cold阶段。 | |
cold | 索引进入cold阶段后,ILM将索引从hot节点移动到cold节点。完成操作后,索引将在2小时后进入delete阶段。 | |
delete | 索引进入delete阶段后被删除。 |
2.2、ilm应用场景-趣街
- 架构图
阶段 | 描述 |
—|—|
hot | 通过索引模板控制新索引均分配至hot节点,设置当前热索引优先级为100,并在1分钟后进入warm阶段。 |
warm | 索引进入warm阶段后,设置当前热索引优先级为50,索引路由规则box_type=hot。完成该操作后,索引将在2分钟(从滚动更新时算起)后进入cold阶段。 |
cold | 索引进入cold阶段后,设置当前热索引优先级为0,索引路由规则box_type=cold|
说明:
1、考虑到对业务及开发最低的影响,在hot阶段不引入分片滚动机制,依然使用之前按月创建索引的模式进行,不过要使用索引模板对索引的分片数量、ILM策略、路由规则进行管理
2、不打算建立warm节点,在warm阶段呢,只调整索引优先级,当机器重建或重启时,优先恢复优先级最高的索引,来保障实时生产业务;
3、cold阶段,可以缩减副本数量、设置只读,后续根据生产需求可进行调整;
3、冷热分离技术验证部分
3.1、集群信息汇总
平台 | IP | 用途 | ES版本 | 功能角色 | |
---|---|---|---|---|---|
CentOS 7.8.2003 | 10.0.0.201 | ES | 7.17.3 | Master_node | |
CentOS 7.8.2003 | 10.0.0.202 | ES | 7.17.3 | Master_node | |
CentOS 7.8.2003 | 10.0.0.203 | ES | 7.17.3 | Master_node | |
CentOS 7.8.2003 | 10.0.0.204 | ES | 7.17.3 | Date_node_H | |
CentOS 7.8.2003 | 10.0.0.205 | ES | 7.17.3 | Date_node_H | |
CentOS 7.8.2003 | 10.0.0.100 | ES | 7.17.3 | Date_node_C | |
CentOS 7.8.2003 | 10.0.0.101 | ES | 7.17.3 | Date_node_C | |
CentOS 7.8.2003 | 10.0.0.102 | ES | 7.17.3 | Coordinat_node | |
CentOS 7.8.2003 | 10.0.0.103 | ES | 7.17.3 | Coordinat_node |
3.2、设置ES节点角色
主节点
1
node.roles: [ master ]
数据节点-热
1
node.roles: [ data_hot, data_content ]
数据节点-冷
1
node.roles: [ data_cold, data_content ]
协调节点
1
node.roles: [ ]
按照如上节点划分修改elasticsearch.yml配置文件,并重启ES服务,执行如下命令查看node角色
1 GET _cat/nodes?v
1 | ip ram.percent cpu load_1m load_5m load_15m node.role master name |
3.3、为索引配置生命周期管理策略
阶段 | 描述 | |
---|---|---|
hot | 通过索引模板控制新索引均分配至hot节点,设置当前热索引优先级为100,并在1分钟后进入warm阶段。 | |
warm | 索引进入warm阶段后,设置当前热索引优先级为50,索引路由规则box_type=hot。完成该操作后,索引将在2分钟(从滚动更新时算起)后进入cold阶段。 | |
cold | 索引进入cold阶段后,设置当前热索引优先级为0,索引路由规则box_type=cold |
1 | #角色模式 |
3.4、创建索引模板
1 | curl -X PUT "http://127.0.0.1:19200/_index_template/template_traderecordday?pretty" -H 'Content-Type: application/json' -d' |
3.5、创建测试索引
1 | curl -XPUT http://127.0.0.1:19200/traderecordday_202201 && curl -XPUT http://127.0.0.1:19200/traderecordday_202202 && curl -XPUT http://127.0.0.1:19200/traderecordday_202203 && curl -XPUT http://127.0.0.1:19200/traderecordday_202204 && curl -XPUT http://127.0.0.1:19200/traderecordday_202205 |
3.5、写入数据
1 | curl --location --request PUT 'http://192.168.2.67:19200/traderecordday_202201/_doc/1' \ |
3.6、根据生命周期阶段查看索引setting信息
hot阶段
warm阶段
cold阶段
4、集群极端性测试
4.1、数据节点故障对集群的影响?
当前shards分布如下:
创建新索引,模拟当前生产hot索引
模拟cold节点全部宕机
测试hot节点索引是否可读可写
4.2、索引分片数据持续写入,会对分片迁移造成什么影响?
当前shards分布如下:
向202201索引导入数据,观察ILM迁移是否受影响
右边数据持续写入,202201的个别分片还处于RELOCATION的状态,但此时并不影响数据查询和迁移
5、问题讨论
5.1、现有架构如何迁移至冷热架构
- 修改现有集群角色或给节点添加标签,不能热更新,需要修改配置,重启集群,且修改角色还需要执行一系列复杂的操作;
- 迁移数据,使用logstash或elasticdump迁移数据,应用割切如何进行?
- 目前生产的ES数据查询是通过别名进行的,如果使用了冷热分离的技术,冷节点的机器配置是低于热节点的,并且冷节点上存放的数据周期很长,各方面性能都低于热节点,
- 阿里专家答复:如果用alias查全部索引会受到冷节点算力少的影响,不过在查询量不大的情况的影响较小。如果查询QPS比较高,最好在查询条件上做修改,查对应时间段的索引