干货 | Elasticsearch 冷热集群架构实战

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Elasticsearch实战数据量级少的时候,单节点就能玩的很6,但是随着数据量的增长,多节点分布式横向扩展集群是大势所趋。之前分享过基于时间创建索引及Curator实现索引生命周期管理。当集群硬件资源有限,尤其SSD磁盘更紧俏的业务场景下,最大化集群的性能,如何让用户最关心的“热”数据分布到SSD磁盘对应的节点上,

image.png

链接

让用户关注程度弱的“冷”数据分散到普通磁盘对应节点上?也就是说“冷热”数据分离是本文讨论的内容。

提到冷热集群架构,通常我们关注的问题如下:


什么是冷热集群架构,Elasticsearch支持吗?

Elasticsearch集群如何设置冷热节点?

Elasticsearch集群如何根据数据冷热度写入到不同的节点?

当数据不“热”时,如何将数据迁移到“冷”节点?

本文在Elasticsearch7.3版本上一 一给出解答。

1、什么是冷热架构?

官方叫法:热暖架构——“Hot-Warm” Architecture。

通俗解读:热节点存放用户最关心的热数据;温节点或者冷节点存放用户不太关心或者关心优先级低的冷数据或者暖数据。

image.png

图片来源cnblog 毛台的博客


1.1 官方解读冷热架构

冷热架构是一项十分强大的功能,能够让您将 Elasticsearch 部署划分为“热”数据节点和“冷”数据节点。


热数据节点处理所有新输入的数据,并且存储速度也较快,以便确保快速地采集和检索数据。

冷节点的存储密度则较大,如需在较长保留期限内保留日志数据,不失为一种具有成本效益的方法。

将这两种类型的数据节点结合到一起后,您便能够有效地处理输入数据,并将其用于查询,同时还能在节省成本的前提下在较长时间内保留数据。


此架构对日志用例来说尤其大有帮助,因为在日志用例中,人们的大部分精力都会专注于近期的日志(例如最近两周),而较早的日志(由于合规性或者其他原因仍需要保留)则可以接受较慢的查询时间。


1.2 典型应用场景

一句话:在成本有限的前提下,让客户关注的实时数据和历史数据硬件隔离,最大化解决客户反应的响应时间慢的问题。


业务场景描述:

每日增量6TB日志数据,高峰时段写入及查询频率都较高,集群压力较大,查询ES时,常出现查询缓慢问题。


ES集群的索引写入及查询速度主要依赖于磁盘的IO速度,冷热数据分离的关键为使用SSD磁盘存储热数据,提升查询效率。

若全部使用SSD,成本过高,且存放冷数据较为浪费,因而使用普通SATA磁盘与SSD磁盘混搭,可做到资源充分利用,性能大幅提升的目标。

2、最最核心的实现原理

借助:Elasticsearch的分片分配策略,确切的说是:


第一:集群节点层面支持规划节点类型,这是划分热暖节点的前提。

第二:索引层面支持将数据路由到给定节点,这为数据写入冷、热节点做了保障。

Shard allocation awareness

https://www.elastic.co/guide/en/elasticsearch/reference/current/allocation-awareness.html


Index-level shard allocation filtering

https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html#


3、7.X版本ES实践一把

第一:搭建一个两个节点的集群,划分热、热节点用。

节点层面设置节点类型。

热节点指定:


node.attr.hotwarm_type: hot

1

暖节点或冷节点指定:


node.attr.hotwarm_type: warm

1

第二:写入操作

方案一:索引层面指定路由。


PUT /logs_2019-10-01

{

 "settings": {

   "index.routing.allocation.require.hotwarm_type": "hot",

   "number_of_replicas": 0

 }

}



PUT /logs_2019-08-01

{

 "settings": {

   "index.routing.allocation.require.hotwarm_type": "warm",

   "number_of_replicas": 0

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

方案二:通过模板指定索引的冷热存储。


PUT _template/logs_2019-08-template

{

 "index_patterns": "logs_2019-08-*",

 "settings": {

   "index.number_of_replicas": "0",

   "index.routing.allocation.require.hotwarm_type": "warm"

 }

}

PUT _template/logs_2019-10-template

{

 "index_patterns": "logs_2019-10-*",

 "settings": {

   "index.number_of_replicas": "0",

   "index.routing.allocation.require.hotwarm_type": "hot"

 }

}

第三:效果图详见附件图。

image.png

第四:借助curator定期迁移数据

随着时间发展,当前数据会成为历史数据。

历史数据要自动切换到普通磁盘的节点存储,可以借助curator实现。

cuator的安装不再追溯,详细请参考官方文档。

https://www.elastic.co/guide/en/elasticsearch/client/curator/5.8/command-line.html

步骤1:定义cuator.yml,填写Elasticsearch集群配置信息。

步骤2:定义action.yml。


actions:

 1:

   action: allocation

   description: >-

     Apply shard allocation routing to 'require' 'tag=cold' for hot/cold node

     setup for logstash- indices older than 3 days, based on index_creation

     date

   options:

     key: hotwarm_type

     value: warm

     allocation_type: require

     disable_action: false

   filters:

   - filtertype: pattern

     kind: prefix

     value: logs_

   - filtertype: age

     source: name

     direction: older

     timestring: "%Y-%m-%d"

     unit: days

     unit_count: 3

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

步骤3:执行迁移。


C:\Program Files\elasticsearch-curator>curator.exe --config .\conf\curator.yml .\conf\action.yml

2019-10-13 22:28:31,662 INFO      Preparing Action ID: 1, "allocation"

2019-10-13 22:28:31,662 INFO      Creating client object and testing connection

2019-10-13 22:28:31,668 INFO      Instantiating client object

2019-10-13 22:28:31,668 INFO      Testing client connectivity

2019-10-13 22:28:31,675 INFO      Successfully created Elasticsearch client object with provided settings

2019-10-13 22:28:31,677 INFO      Trying Action ID: 1, "allocation": Apply shard allocation routing to 'require' 'tag=cold' f....

2019-10-13 22:28:31,706 INFO      Updating 2 selected indices: ['logs_2019-08-01', 'logs_2019-10-01']

2019-10-13 22:28:31,706 INFO      Updating index setting {'index.routing.allocation.require.hotwarm_type': 'warm'}

2019-10-13 22:28:32,559 INFO      Action ID: 1, "allocation" completed.

2019-10-13 22:28:32,560 INFO      Job completed.

image.png

4、坑:

node.attr.hotwarm_type:

1

单纯搜索官网你是找不到的。

因为:node.attr.*,你可以指定type类型、各种结合业务场景你的需要指定的值。

包括:官方的:按照磁盘大小设定。和咱们的冷热节点。

白话文:就是标定节点划分分类的一个属性类型值。


这个坑网友也有疑惑:node属性(tag)如何设置,查资料看到了好几种方法很混乱 - Elastic 中文社区,官方文档说的不是特别清楚。


5、线上使用场景

来自星友的线上实战反馈如下:

我们现有的架构也是冷热分离。


热节点使用的是ssd,indexing和search性能都不错,其中保存4天的数据,4天之后数据推到warm节点。

warm节点使用的是hdd。

在运维过程中,能体会到这种架构的特点是:


冷节点或者热节点的离群不会影响另外一个种类型节点的功能;

但是如果整个集群中有节点产生stw(Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些现象多半是由于gc引起。),整个集群的性能都会被影响;

这种架构能在相对节约成本的前提下极大的提升性能,但是不能完全做到一种类型节点的故障对其他类型节点是无感的。


6、小结

Elasticsearch6.6版本后已推出索引生命周期管理ilm功能。涵盖了冷热集群的部署和自动化实现。

最新实现参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/index-lifecycle-management.html


官方最早2015年的博客就提到了冷热集群架构的实现,但“再显而易见的道理,也有80%的人可能不知道”并考虑到大家使用场景的参差不齐,才梳理出本篇文章。


你的集群使用冷热架构了吗? 欢迎交流。


7、Good 参考深入学习

1)最新冷热架构官方文档:

https://www.elastic.co/cn/blog/deploying-a-hot-warm-logging-cluster-on-the-elasticsearch-service


2)最多参考冷热架构文档:

https://www.elastic.co/cn/blog/hot-warm-architecture-in-elasticsearch-5-x


3)国内最佳实践:elasticsearch冷热数据读写分离

https://elasticsearch.cn/article/6127

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
5天前
|
Android开发 开发者 Kotlin
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
24 8
|
11天前
|
JavaScript 前端开发 Java
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
Jeesite5 是一个基于 Spring Boot 3.3 和 Vue3 的企业级快速开发平台,集成了众多优秀开源项目,如 MyBatis Plus、Bootstrap、JQuery 等。它提供了模块化设计、权限管理、多数据库支持、代码生成器和国际化等功能,极大地提高了企业级项目的开发效率。Jeesite5 广泛应用于企业管理系统、电商平台、客户关系管理和知识管理等领域。通过其强大的功能和灵活性,Jeesite5 成为了企业级开发的首选框架之一。访问 [Gitee 页面](https://gitee.com/thinkgem/jeesite5) 获取更多信息。
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
|
2月前
|
Java 网络安全 开发工具
Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
通过本文,读者可以深入了解Git的核心概念和实际操作技巧,提升版本管理能力。
|
3月前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
82 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
3月前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
|
3月前
|
搜索推荐 API 定位技术
一文看懂Elasticsearch的技术架构:高效、精准的搜索神器
Elasticsearch 是一个基于 Lucene 的开源搜索引擎,以其强大的全文本搜索功能和快速的倒排索引技术著称。它不仅支持数字、文本、地理位置等多类型数据,还提供了可调相关度分数、高级查询 DSL 等功能。Elasticsearch 的核心技术流程包括数据导入、解析、索引化、查询处理、得分计算及结果返回,确保高效处理大规模数据并提供准确的搜索结果。通过 RESTful API、Logstash 和 Filebeat 等工具,Elasticsearch 可以从多种数据源中导入和解析数据,支持复杂的查询需求。
218 0
|
3月前
|
存储 负载均衡 监控
揭秘 Elasticsearch 集群架构,解锁大数据处理神器
Elasticsearch 是一个强大的分布式搜索和分析引擎,广泛应用于大数据处理、实时搜索和分析。本文深入探讨了 Elasticsearch 集群的架构和特性,包括高可用性和负载均衡,以及主节点、数据节点、协调节点和 Ingest 节点的角色和功能。
90 0
|
4月前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
116 5
|
5月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
443 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
6月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo

热门文章

最新文章