Elasticsearch冷热分离技术验证

Elasticsearch冷热分离技术验证

1、背景信息

  • 趣街ES集群目前采用的是传统的角色混用模式进行部署的,若有node脱离集群或发生故障,对整体集群影响较大。且业务数据长年累积,数据没有生命周期性的管理策略,当数据达到一定量时,必然会造成服务的内存、CPU、IO等指标上涨,影响Elasticsearch的全文检索能力。生产上多次出现因大查询等其他因素所导致的集群抖动,从而影响生产正常业务的事件。

2、Elasticsearch-ilm概述

  • Elasticsearch 6.6.0及以上版本提供了索引生命周期管理ILM功能,将索引生命周期分为4个阶段:hotwarmcolddelete。其中hot阶段主要负责对索引进行滚动更新操作,warmcolddelete阶段主要负责进一步处理索引数据,详细功能如下:
    • 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应用场景-趣街

  • 架构图
    image_1gprqlohe1mid8otg4586f1h5h1h.png-277.4kB
    image_1gps4qtttvf316gd1ohn1bjg66a1u.png-114.8kB
    阶段 | 描述 |
    —|—|
    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
2
3
4
5
6
7
8
9
10
ip         ram.percent cpu load_1m load_5m load_15m node.role master name
10.0.0.202 66 6 0.50 0.16 0.10 m - node-2
10.0.0.203 68 7 0.82 0.26 0.13 m - node-3
10.0.0.204 60 10 0.65 0.28 0.14 hs - node-4
10.0.0.102 66 2 0.10 0.08 0.07 - - node-8
10.0.0.201 89 9 0.70 0.22 0.12 m * node-1
10.0.0.101 62 7 0.61 0.26 0.13 cs - node-7
10.0.0.100 68 10 0.74 0.32 0.15 cs - node-6
10.0.0.205 60 10 0.77 0.34 0.16 hs - node-5
10.0.0.103 65 1 0.12 0.10 0.07 - - node-9

3.3、为索引配置生命周期管理策略

阶段 描述
hot 通过索引模板控制新索引均分配至hot节点,设置当前热索引优先级为100,并在1分钟后进入warm阶段。
warm 索引进入warm阶段后,设置当前热索引优先级为50,索引路由规则box_type=hot。完成该操作后,索引将在2分钟(从滚动更新时算起)后进入cold阶段。
cold 索引进入cold阶段后,设置当前热索引优先级为0,索引路由规则box_type=cold
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#角色模式
PUT _ilm/policy/traderecordday_ILM
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "1m",
"actions": {
"set_priority": {
"priority": 50
}
}
},
"cold": {
"min_age": "2m",
"actions": {
"set_priority": {
"priority": 0
}
}
}
}
}
}

3.4、创建索引模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
curl -X PUT "http://127.0.0.1:19200/_index_template/template_traderecordday?pretty" -H 'Content-Type: application/json' -d'
{
"index_patterns" : ["traderecordday*"],
"template": {
"settings" : {
"number_of_shards" : 2,
"number_of_replicas" : 1,
"max_result_window" : 2147483647,
"index.lifecycle.name": "traderecordday_ILM",
"index.routing.allocation.include._tier_preference":"data_hot"
},
"aliases": {
"traderecordday_alias" : {}
},
"mappings": {
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields:": {
"raw": {
"type": "keyword",
"ignore_above": 2147483647
}
}
}
}
}
]
}
}
}'

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

image_1gpa0cpu5mll1uaq80e1nkt1p5k5n.png-38.2kB

3.5、写入数据

1
2
3
4
5
6
7
curl --location --request PUT 'http://192.168.2.67:19200/traderecordday_202201/_doc/1' \
--header 'Content-Type: application/json' \
-d '{
"content": "ligc",
"title": "yusys",
"id": "1"
}'

image_1gpa0dndpn261nmj1k3pbdpt6o64.png-33.2kB

3.6、根据生命周期阶段查看索引setting信息

  • hot阶段
    image_1gps6kr4hq8l9p2vvitpd1r7m35.png-11.7kB
    image_1gps6kbj9g0b1elo175d6h21cdm2o.png-65.2kB

  • warm阶段
    image_1gps6lf4i12qc1cmg8h016nh1iav3i.png-61.4kB

  • cold阶段
    image_1gps6mnub1f7q2si65qvor1j73v.png-63.9kB
    image_1gps6n0is18ct1kocqgc4po1bps4c.png-12.1kB

4、集群极端性测试

4.1、数据节点故障对集群的影响?

  • 当前shards分布如下:
    image_1gpa19l1t1t6o1h4717qtp3kl0u8v.png-12.1kB

  • 创建新索引,模拟当前生产hot索引
    image_1gpa1bj2rk985q014uk10rt1lj09c.png-33.5kB

  • 模拟cold节点全部宕机
    image_1gpa1cg9bhj71hcs1qmk5bltn09p.png-225.5kB
    image_1gpa1e01n1bcm1la7115g195q3mra6.png-29.9kB

  • 测试hot节点索引是否可读可写
    image_1gpa1ftuq18n41ai8jhemkt1snnb0.png-56.9kB
    image_1gpa1fmhd1luf1i9i18a9ulodrfaj.png-46kB

4.2、索引分片数据持续写入,会对分片迁移造成什么影响?

  • 当前shards分布如下:
    image_1gpa1thpgj81slr10s96je14rjbq.png-19.4kB

  • 向202201索引导入数据,观察ILM迁移是否受影响
    image_1gpa28oo91hhr1ams3rv14ck2erc7.png-192.2kB

  • 右边数据持续写入,202201的个别分片还处于RELOCATION的状态,但此时并不影响数据查询和迁移
    image_1gpa29ilc1r4rnlrnf01c2f1f1ick.png-206.8kB
    image_1gpa29sdsgfa13no15p01lokkkpd1.png-188.9kB
    image_1gpa2ap9t14dlo28vbj1eiks89de.png-47.5kB

5、问题讨论

5.1、现有架构如何迁移至冷热架构

  • 修改现有集群角色或给节点添加标签,不能热更新,需要修改配置,重启集群,且修改角色还需要执行一系列复杂的操作;
  • 迁移数据,使用logstash或elasticdump迁移数据,应用割切如何进行?
  • 目前生产的ES数据查询是通过别名进行的,如果使用了冷热分离的技术,冷节点的机器配置是低于热节点的,并且冷节点上存放的数据周期很长,各方面性能都低于热节点,
    • 阿里专家答复:如果用alias查全部索引会受到冷节点算力少的影响,不过在查询量不大的情况的影响较小。如果查询QPS比较高,最好在查询条件上做修改,查对应时间段的索引
-------------本文结束感谢您的阅读-------------
LiGuanCheng wechat
如有问题,请与我微信交流或通过右下角“daovoice”与我联系~。
请我喝一杯咖啡~