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

简介: 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

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
7月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
10月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
1068 0
|
8月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
10月前
|
SQL 运维 数据挖掘
森马服饰从 Elasticsearch 到阿里云 SelectDB 的架构演进之路
森马引入阿里云 SelectDB 替换原 Elasticsearch + 业务库混合架构,统一分析 16+ 核心业务,打通 BI 组件,大幅简化数据同步链路和分析系统架构。实现复杂查询 QPS 提升 400%,响应时间缩短至秒级,亿级库存流水聚合查询缩短至 8 秒内的显著收益,有效驱动森马全渠道运营效率持续增长与业务创新。
299 0
森马服饰从 Elasticsearch 到阿里云 SelectDB 的架构演进之路
|
Java Linux
CentOS环境搭建Elasticsearch集群
至此,您已成功在CentOS环境下搭建了Elasticsearch集群。通过以上介绍和步骤,相信您对部署Elasticsearch集群有了充分的了解。最后祝您在使用Elasticsearch集群的过程中顺利开展工作!
616 22
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
人工智能 自然语言处理 运维
让搜索引擎“更懂你”:AI × Elasticsearch MCP Server 开源实战
本文介绍基于Model Context Protocol (MCP)标准的Elasticsearch MCP Server,它为AI助手(如Claude、Cursor等)提供与Elasticsearch数据源交互的能力。文章涵盖MCP概念、Elasticsearch MCP Server的功能特性及实际应用场景,例如数据探索、开发辅助。通过自然语言处理,用户无需掌握复杂查询语法即可操作Elasticsearch,显著降低使用门槛并提升效率。项目开源地址:<https://github.com/awesimon/elasticsearch-mcp>,欢迎体验与反馈。
3433 1