基于docker 的elasticsearch冷热分离及生命周期管理

news2024/11/26 0:46:23

文章目录

  • 冷热集群架构的应用场景
  • 冷热集群架构的优势
    • 冷热集群架构实战
      • 搭建集群
  • 索引生命周期管理
    • 认识索引生命周期
    • 索引生命周期管理的历史演变
    • 索引生命周期管理的基础知识
      • Rollover:滚动索引

冷热集群架构的应用场景

某客户的线上业务场景如下:系统每天增加6TB日志数据,高峰时段的写入和查询频率都很高,导致Elasticsearch集群压力大,经常出现查询缓慢的问题。

目前采用冷热集群架构,其中热节点使用SSD,并具有良好的索引和搜索性能,将数据保存4天后推送到温节点中,并使用HDD进行存储。改善架构后,集群性能有极大提升。

总之,在成本有限的情况下,让客户专注于实时数据和历史数据之间的硬件隔离可以最大化解决客户反映的检索响应慢的问题。

冷热集群架构的优势

Elasticsearch集群采用冷热集群架构会具有以下优势。

1)有效降低存储成本:将不常用的数据存储在冷节点上,可以减小热节点上索引大小并降低存储成本。这可有效降低硬件成本并提高索引查询效率。

2)更好地管理数据:将不同类型的数据分配到不同类型的节点上,可以更好地管理数据。这为索引生命周期管理提供了保障。

3)提高查询性能:将热节点用于处理最常访问的数据,而将冷节点用于存储不常用的数据,可以缩短查询响应时间并提高查询性能。

4)优化集群性能:将不同类型的任务分配给不同类型的节点,可以避免资源争夺现象,从而提高整个集群系统性能。

5)更好的可扩展性:使用冷热集群架构,在需要适应数据量增长或其他需求变化时,运维人员可以更容易地扩展集群、添加或删除节点。综上所述,Elasticsearch的冷热集群架构可以提高查询性能、降低存储成本、优化集群性能、更好地管理数据和提高可扩展性。这些优势使其成为处理PB级时序大数据的理想选择。

冷热集群架构实战

搭建集群

首先搭建一个具有3个节点的集群,划分冷、温、热节点角色。在节点层面设置节点类型,分别如下所示。

version: '2.2'
services:
  cerebro:
    image: lmenezes/cerebro:0.8.3
    container_name: hwc_cerebro
    ports:
      - "9000:9000"
    command:
      - -Dhosts.0.host=http://elasticsearch:9200
    networks:
      - hwc_es7net
  kibana:
    image: docker.elastic.co/kibana/kibana:7.1.0
    container_name: hwc_kibana7
    environment:
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"
    ports:
      - "5601:5601"
    networks:
      - hwc_es7net
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0
    container_name: es7_hot
    environment:
      - cluster.name=geektime-hwc
      - node.name=es7_hot
      - node.attr.box_type=hot
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_hot,es7_warm,es7_cold
      - cluster.initial_master_nodes=es7_hot,es7_warm,es7_cold
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - hwc_es7data_hot:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - hwc_es7net
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0
    container_name: es7_warm
    environment:
      - cluster.name=geektime-hwc
      - node.name=es7_warm
      - node.attr.box_type=warm
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_hot,es7_warm,es7_cold
      - cluster.initial_master_nodes=es7_hot,es7_warm,es7_cold
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - hwc_es7data_warm:/usr/share/elasticsearch/data
    networks:
      - hwc_es7net
  elasticsearch3:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0
    container_name: es7_cold
    environment:
      - cluster.name=geektime-hwc
      - node.name=es7_cold
      - node.attr.box_type=cold
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_hot,es7_warm,es7_cold
      - cluster.initial_master_nodes=es7_hot,es7_warm,es7_cold
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - hwc_es7data_cold:/usr/share/elasticsearch/data
    networks:
      - hwc_es7net


volumes:
  hwc_es7data_hot:
    driver: local
  hwc_es7data_warm:
    driver: local
  hwc_es7data_cold:
    driver: local

networks:
  hwc_es7net:
    driver: bridge

三个节点冷热集群架构启动后,使用如下命令查看节点。

GET /_cat/nodes?v

在这里插入图片描述

查询节点属性使用如下命令

GET _cat/nodeattrs
es7_warm 172.21.0.6 172.21.0.6 ml.machine_memory 9698672640
es7_warm 172.21.0.6 172.21.0.6 ml.max_open_jobs  20
es7_warm 172.21.0.6 172.21.0.6 box_type          warm
es7_warm 172.21.0.6 172.21.0.6 xpack.installed   true
es7_cold 172.21.0.2 172.21.0.2 ml.machine_memory 9698672640
es7_cold 172.21.0.2 172.21.0.2 ml.max_open_jobs  20
es7_cold 172.21.0.2 172.21.0.2 box_type          cold
es7_cold 172.21.0.2 172.21.0.2 xpack.installed   true
es7_hot  172.21.0.4 172.21.0.4 ml.machine_memory 9698672640
es7_hot  172.21.0.4 172.21.0.4 box_type          hot
es7_hot  172.21.0.4 172.21.0.4 xpack.installed   true
es7_hot  172.21.0.4 172.21.0.4 ml.max_open_jobs  20

方案一:在索引层面指定节点角色写入数据。

PUT mytest
{
  "settings":{
    "number_of_shards":1,
    "number_of_replicas":0,
    "index.routing.allocation.require.box_type":"cold"
  }
}
GET /_cat/shards/mytest?h=i,shard,p,node
mytest 0 p es7_cold

方案二:通过模板指定节点角色写入数据。

POST _template/my-template
{
    "index_patterns": "test-*",
    "settings": {
        "index.number_of_replicas": "0",
        "index.routing.allocation.require.box_type":"cold"
    }
}

GET _template/my-template


PUT /test-01


GET /_cat/shards/test-01?h=i,shard,p,node

索引生命周期管理

认识索引生命周期

在大规模系统中,特别是以日志、指标和实时时间序列为基础的系统中,集群索引的发展和变化遵循其固有规律。理论上来说,一旦创建了索引,它就可能永久存在。然而,在创建后,如果让索引无限制地扩张下去,则会演变成一个数据量庞大且过度膨胀的实体。这种情况可能导致一系列问题,例如,随着时间推移,时序数据和业务数据量逐步增加。

实际上,索引并非无限制存在的,举例如下。

❑集群单个分片的最大文档数上限约为20亿条(即232-1)。
❑根据官方的最佳实践建议,应将索引分片大小控制在30GB~50GB之间。
❑如果索引数据量过大,则可能出现健康问题,并导致整个集群核心业务停摆。
❑大型索引恢复所需时间远远超过小型索引。
❑大型索引检索单位速度较慢,并影响写入和更新操作。
❑在某些业务场景中用户更关注最近3天或7天的业务数据;而大型索引会将所有历史数据汇聚在一起,不利于查询特定需求的数据。

索引生命周期管理的历史演变

ILM(索引生命周期管理)是Elasticsearch 6.6(公测版)首次引入的功能,并于6.7版本正式推出。它是Elasticsearch的一部分,主要用于帮助用户管理索引。在没有ILM之前,索引生命周期的管理基于Rollover和Curator工具实现。Kibana 7.X版本提供了一个配置界面来进行索引生命周期管理,如图所示。
在这里插入图片描述

索引生命周期管理的基础知识

在3个节点的集群中,节点角色的设置分别如下。
❑节点node-1:主节点+数据节点+热节点。
❑节点node-2:主节点+数据节点+温节点。
❑节点node-3:主节点+数据节点+冷节点。

为了演示如何应用ILM,首先需要配置冷热架构,在上文中已经讲解了配置细节。如果磁盘数量不足,则待删除的冷数据在处理时具有最高优先级;如果硬件资源相对受限,则应将SSD作为热节点的首选配置。检索优先级最高的是热节点数据,因此检索热节点数据比检索全量数据的响应速度更快。

Rollover:滚动索引

自从Elasticsearch 5.X版本推出Rollover API以来,该API解决了使用日期作为索引名称的索引所具有的大小不均衡的问题。对于日志类数据而言,Rollover非常有用。通常情况下,我们按天对索引进行分割(如果数据量更大,则可以进一步拆分)。在没有Rollover之前,我们需要在程序中设置一个自动生成索引的模板。

以下讲解如何实践Rollover操作。

1)创建符合正则表达式规范(即中间是“-”字符并且后面是数字字符)的索引,并批量导入数据。否则会出现以下报错。

在这里插入图片描述

创建索引和导入数据操作如下。

###创建基于日期的索引
PUT my-index-20250709-0000001
{
    "aliases": {
        "my-alias": {
            "is_write_index": true
        }
    }
}
####批量导入数据
PUT my-alias/_bulk
{"index":{"_id":1}}
{"title":"testing 01"}
{"index":{"_id":2}}
{"title":"testing 02"}
{"index":{"_id":3}}
{"title":"testing 03"}
{"index":{"_id":4}}
{"title":"testing 04"}
{"index":{"_id":5}}
{"title":"testing 05"}

2)基于滚动的3个条件实现索引的滚动。

❑滚动条件1:数据写入时间超过7天。
❑滚动条件2:最大文档数超过5条。
❑滚动条件3:最大的主分片数大于50gb(这里的gb代表Gigabytes,可理解为GB)。

注意:

当3个条件是“或”的关系时,只要满足其中一个,索引就会滚动。在Elasticsearch 7.X版本中,可以设置的滚动条件如表12-1所示。

在这里插入图片描述
查看索引中所有主分片(pri.store.size)的总存储空间,命令如下。

GET _cat/indices?v&s=pri.store.size:desc

查看分片大小,且按照分片大小由大到小进行排序,命令行如下。其中p代表主分片,r代表副本分片。

GET /_cat/shards?v=true&s=store:desc

滚动索引操作如下。

# rollover滚动索引
POST my-alias/_rollover
{
    "conditions": {
        "max age": "7d",
        "max docs": 5,
        "max_primary_shard_size": "50gb"
    }
}

GET my-alias/ _count
#在满足滚动条件的前提下滚动索引
PUT my-alias/_bulk
{"index":{"_id":6}}
{"title":"testing 06"}
#检索数据,验证滚动是否生效
GET my-alias/_search

执行结果如下所示。我们可以清晰看到,插入第6条数据会触发max_docs:5的条件,原来的索引my-index-20250709-000001会继续保留,而新写入的第6条数据滚动到了新索引my-index-20250709-000002中。滚动索引操作的效果如图所示。

在这里插入图片描述

es 7.17.1

DELETE _template/test_template

GET _template/test_template

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
             "max_docs": 3 
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

PUT _template/test_template
{
    "order": 0,
    "index_patterns": [
        "test_*"
    ],
    "settings": {
        "index": {
            "number_of_shards": "6",
            "refresh_interval": "10s"
        },
        "lifecycle": {
          "name": "my_policy",
          "rollover_alias" : "test_rollover"
        }
    },
    "mappings": {
        "properties": {
            "createTime": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss"
            },
            "requestId": {
                "type": "keyword"
            },
            "title": {
                "type": "text",
                "analyzer": "standard",
                "fields": {
                    "keyword": {
                        "type": "keyword"
                    }
                }
            }
        }
    },
    "aliases": {}
}


PUT %3Ctest_%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
    "test_rollover": {
      "is_write_index": true
    }
  }
}

GET %3Ctest_%7Bnow%2Fd%7D-000001%3E


POST /test_rollover/_rollover
{
    "conditions": {
        "max_docs": 3 
    }
}

POST /test_rollover/_doc
{
  "businessInfo":"078"
}


GET /test_rollover/_doc/_search

## indices.lifecycle.poll_interval 索引生命周期策略默认是10分钟检查一次符合策略的索引

GET _cluster/settings?include_defaults&flat_settings

GET _cat/nodeattrs?v&h=host,attr,value


参考

https://juejin.cn/post/7217399337989488695#heading-3

https://help.aliyun.com/document_detail/178307.html

## 运行三个节点,分片 将box_type设置成 hot,warm和cold

PUT _cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval":"1s"
  }
}

PUT /_ilm/policy/log_ilm_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_docs": 5
          }
        }
      },
      "warm": {
        "min_age": "10s",
        "actions": {
          "allocate": {
            "include": {
              "box_type": "warm"
            }
          }
        }
      },
      "cold": {
        "min_age": "15s",
        "actions": {
          "allocate": {
            "include": {
              "box_type": "cold"
            }
          }
        }
      },
      "delete": {
        "min_age": "20s",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}



PUT /_template/log_ilm_template
{
  "index_patterns" : [
      "app_log-*"
    ],
    "settings" : {
      "index" : {
        "lifecycle" : {
          "name" : "log_ilm_policy",
          "rollover_alias" : "app_log"
        },
        "routing" : {
          "allocation" : {
            "include" : {
              "box_type" : "hot"
            }
          }
        },
        "number_of_shards" : "1",
        "number_of_replicas" : "0"
      }
    },
    "mappings" : { },
    "aliases" : {}
}

GET /_template/

DELETE /_template/log_ilm_template

PUT %3Capp_log-%7Bnow%2Fs%7Byyyy.MM.dd-HHmm%7D%7D-000001%3E
{
    "aliases":{
        "app_log":{
            "is_write_index":true
        }
    }
}



POST app_log/_doc
{
  "dfd":"qweqwe"
}

DELETE app_log-2024.01.06-0749-000001

GET app_log-2024.01.06-0800-000001/_settings



  • 安装 https://github.com/onebirdrocks/geektime-ELK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1669441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网安面经之SSRF漏洞

一、ssrf漏洞 1、ssrf原理?危害?修复(防御)? 原理:SSRF就是服务器端请求伪造漏洞、它是一种由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务&…

程序猿成长之路之数据挖掘篇——距离公式介绍

上一篇介绍了朴素贝叶斯,那么这次讲讲距离公式 什么是距离公式 用自己的话来说距离公式就是判断两个属性(参数)相似度的度量公式,比如以两点间距离为例,A地经纬度为(110.9802,120.9932),B地经纬度为(110.9980,120.828…

c++04STL部分复习

1、deque list vector概括: /* deque :双端队列容器 底层数据结构:动态开辟的二维数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来的第二维的数组 从新的第一堆数组下表的oldsize/2开始存放&am…

XYCTF - web

目录 warm up ezMake ezhttp ezmd5 牢牢记住,逝者为大 ezPOP 我是一个复读机 ezSerialize 第一关 第二关 第三关 第一种方法: 第二种方法: ez?Make 方法一:利用反弹shell 方法二:通过进制编码绕过 ε…

EasyImage2.0 图床源码

EasyImage2.0 是一个简单图床的源码,它支持以下功能: 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …

《软件方法(下)》8.3.3 泛化的一些重点讨论(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.3 泛化的一些重点讨论 8.3.3.1 子集的不相交和完整 泛化是集合关系,在建模泛化关系时,我们对泛化关系中的子类&#xff0…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

极验4图标方向点选验证码

验证码如下如所示,提供了三个方向剪头。根据剪头顺序,点击大图中图标的方向完成验证。 经过我们的努力,正确率达到了90%左右。下面提供了验证码识别的代码。 import base64 import requests import datetime from io import BytesIO from PI…

Linux-软件安装--tomcat的安装

tomcat的安装 1、下载tomcat安装包2.移动到自己想要解压的目录3、解压文件夹4、启动tomcat5、查看tomcat进程6、查看日志7、通过浏览器访问成功8、停止tomecat服务8.1运行tomcat的bin目录中提供的停止服务的脚本文件shutdcwn.sh8.2结束tomcat进程1、下载tomcat安装包 本篇文章…

蓝海创业商机小吃配方项目,日入200+ ,小白可上手,图文创作转现快

小吃技术销售,一单价格从几元到几百元不等,行业竞争相对较小,是一个相对冷门的领域。只需一部手机,就可以发布图文并茂的内容,配上背景音乐(BGM),即使是对视频剪辑不熟悉的新手&…

【WEEK11】 【DAY6】Employee Management System Part 7【English Version】

2024.5.11 Saturday Continued from 【WEEK11】 【DAY5】Employee Management System Part 6【English Version】 Contents 10.8. Delete and 404 Handling10.8.1. Modify list.html10.8.2. Modify EmployeeController.java10.8.3. Restart10.8.4. 404 Page Handling10.8.4.1. …

如何取消格式化SD卡并恢复丢失的数据?

在相机中格式化SD卡后,您将丢失卡上的所有文件。如果有恢复形成操作的选项,您可以轻松取回文件。然而,相机或任何其他设备中没有这样的选项。它无法直接取消格式化相机SD卡,但您仍然可以从格式化的SD卡中恢复文件。 为什么格式化后…

excel常见图表大全

Excel图表是一种以图形形式呈现数据的工具,它将数字和统计信息转化为直观的视觉元素,如线图、柱状图、饼图等。这些图表可以帮助人们更容易地理解数据的趋势、关系和模式。 使用场景 Excel图表广泛应用于各个领域,包括: 商务分…

服装定制|基于SSM+vue的服装定制系统的设计与实现(源码+数据库+文档)

服装定制系统 目录 基于SSM+vue的服装定制系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

基于Springboot的村庄果园预售系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的村庄果园预售系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

2024情感聊天赛道,al工具制做,视频一分钟一条,日入500+

在这个领域,我们可以利用AI技术快速制作情感文章和闲聊内容。基本原理是结合热门创意文案,通过AI生成情感聊天短视频,然后在各大网站进行独家代理,这个领域的竞争相对较小,可以说是一片蓝海。 项 目 地 址 &#xff…

【目标检测论文解读复现NO.38】基于改进YOLOv8模型的轻量化板栗果实识别方法

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

【机器学习】LoFTR:革命性图像特征批评技术等领跑者

LoFTR:革命性图像特征匹配技术的领跑者 一、引言二、LoFTR技术的创新之处三、LoFTR技术的实现原理四、LoFTR技术的代码实例五、结语 一、引言 在3D计算机视觉领域,图像特征匹配技术一直是研究的热点和难点。随着技术的不断发展,传统的特征检…

电子学会C/C++编程等级考试2024年03月(八级)真题解析

C/C编程(1~8级)全部真题・点这里 第1题:道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示) Bob and Alice 过去住在城市 1.在…

ACE框架学习4

目录 ACE Proactor框架 异步I/O工厂类 ACE_Handler类 前摄式Acceptor-Connector类 ACE_Proactor类 ACE Streams框架 ACE_Model类 ACE_Streams类 ACE Proactor框架 ACE Proactor框架实现了proactor模式,也就是异步网络模式,允许事件驱动…