ES索引规划方案

news2024/11/26 4:49:09

ES索引规划方案

1.引言

《ES索引规划方案》是研发部门针对审计系统需求,对海量日志数据进行实时存储和查询的解决方案,经过不断完善整理成册,以供后续相关开发人员学习使用

1.1.术语

序号用语说明
1时序索引以时间为轴,数据只有增加,没有变更,并且必须包含time stamp(日期时间,名称随意)字段。即按时间拆分的索引
2索引HOT存放于ES中HOT数据节点的索引,最佳采用SSD磁盘,有一定分片,主要处理时序数据的实时写入
3索引WARM存放于ES中WARM数据节点的索引,没有分片,常规大容量磁盘即可满足,可以用来查询,但是不再写入
4索引DELETE于ES中索引的删除,即数据将被删除

1.2.缩略语

序号原词缩写说明
1ElasticsearchESElasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎;基于Lucene开发;

2.规划目标

由于日志系统会产生大量的日志,特别是集群部署的情况下,更是会产生海量的日志,面对这样一个数据量级的需求,我们的数据如何存储和实现实时查询将面临一个严峻的挑战,经过对ES多方调研和超过几百亿条数据的插入和聚合查询的验证之后,总结出以下几种能够有效提升性能和解决这一问题的方案,包括从集群规划、存储策略、索引拆分、冷热分区等几个维度的优化方案,在本文中逐一介绍。

3.索引整体规划

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kELvG186-1673322267901)(RackMultipart20230110-1-yu4z31_html_5b1572b19b93523b.png)]

4.索引命名规则

4.1.命名规范

索引受文件系统的限制,仅可能为小写字母,不能以下划线开头,同时还遵守以下规则:

  • 不能包括 , /, *, ?, ", <, >, |, 空格, 逗号, #
  • 7.0版本之前可以使用冒号:,但不建议使用并在7.0版本之后不再支持
  • 不能以这些字符 -, _, + 开头
  • 不能包括 . 或 …
  • 长度不能超过 255 个字符

这些命名限制是因为当Elasticsearch使用索引名称作为磁盘上的目录名称,这些名称必须符合不同操作系统的约定。

4.2.命名规则

系统:csbit\_logs\_audit\_tradition\_20210104\_000001

索引以:csbit\_logs\_audit\_tradition\_ 开头 当天的年.月.日即:yyyymmdd\_000001 结尾

5.索引拆分规划

Index通过横向扩展shards实现分布式存储,这样可以解决index大数据存储的问题,但在一个index变的越来越大,单个shard也越来越大,查询和存储的速度也越来越慢,更重要的是一个index其实是有存储上限的(除非你设置足够多的shards和机器),如官方声明单个shard的文档数不能超过20亿(受限于Lucene index,每个shard是一个Lucene index),考虑到I、O,面对这样一个庞大的index,我们是采用更多的shards,还是更多的index我们如何选择,index的shards总量也不宜太多,更多的shards会带来更多的I、O开销,其实答案就已经很明确,除非你能接受长时间的查询等待。为避免超大索引,提高ES查询效率,我们需要进行索引拆分

5.1.规划

Index拆分的思路很简单,时序索引有一个好处就是只有增加,没有变更,按时间累积,天然对索引的拆分友好支持,可以按照时间和数据量做任意时间段的拆分,ES提供的Rollover Api + Index Template可以非常便捷和友好的实现index的拆分工作,把单个index docs数量控制在百亿内,也就是一个index默认5个shards左右即可,保证查询的即时响应,但是因为审计日志有滞后性,我们这里不采用Rollover实现,而是利用Index Template的特性,只要索引名称符合模板匹配规则,就会套用此模板创建新的时序索引。

5.2.模板

1) 添加 es_time 使每次写入 ES的时候会自动添加时间信息:

PUT _ingest/pipeline/add_es_time
{
  "description": "add field es_time to doc",
  "processors": [
    {
      "set": {
        "field": "_source.es_time",
        "value": "{{_ingest.timestamp}}"
      }
    }
  ]
}

2) 添加模板,添加模板前先确保步骤 1) 中 es_time 已经设置

PUT _template/csbit_logs_audit_tradition_template
{
  "order": 0,
  "index_patterns": [
    "csbit_logs_audit_tradition_*"
  ],
  "settings": {
    "index": {
      "default_pipeline": "add_es_time",
      "number_of_replicas": 0,
      "number_of_shards": 5,
      "queries": {
        "cache": {
          "enabled": false
        }
      },
      "requests": {
        "cache": {
          "enable": false
        }
      }
    }
  },
  "mappings": {
    "_source": {
      "enabled": true
    },
    "dynamic": "strict",
    "properties": {
      "action": {
        "type": "integer"
      },
      "desc": {
        "type": "keyword"
      },
      "es_time": {
        "type": "date"
      },
      "level": {
        "type": "integer"
      },
      "server": {
        "properties": {
          "ip": {
            "type": "ip"
          },
          "port": {
            "index": false,
            "type": "integer"
          }
        }
      },
      "tm": {
        "type": "date"
      },
      "web": {
        "properties": {
          "ip": {
            "type": "ip"
          },
          "param": {
            "type": "text"
          },
          "url": {
            "type": "keyword"
          },
          "user": {
            "type": "keyword"
          }
        }
      }
    }
  }
}
  • 根据实际需求,进行settings配置,可参考文档生命周期,部分配置,指定mapping和setting
  • 索引名称必须如同 csbit_logs_audit_tradition_yyyymmdd_000001

5.3.切分

  • 索引的切分按照索引名称规范即可,因为没有使用Rollover

5.4.使用

  • 因为按时间分了多个索引,查询的时候可以跨多个索引进行查询,打分、排序、分页和搜单个索引没什么区别。

6.索引生命周期

由于我们的索引是用来存储各项日志数据,日志存储是存在一定时效性(等保要求至少存储180天);因此我们将根据这一特点,自动删除日志数据,从而保证索引文件不会过多过大,同时提高日志数据查询时效性也能得到保证;

6.1.规划

索引的生命周期分为四各阶段:HOT>WARM>COLD>DELETE,除HOT为必须的阶段外,其他为非必须阶段,可任意选择配置。因为日志索引只需要满足自动删除功能,所以我们只需规划日志索引的HOT、Warm和DELETE三个阶段;

  • HOT阶段

    HOT阶段用来写入日志数据和查询日志数据,该阶段规划将不采用ES自带的策略规则实现。因为采用ES自带策略索引名称将自动进行Rollover动作,Rollover会将关联别名的其他索引标记为不可写入动作;但实际运用中由于数据延期,很有可能写入前一天数据到上一个切分索引中。

  • WARM阶段

    WARM阶段用来存储相对的历史日志数据和查询日志数据,可使用手动迁移,或者自动迁移的方式: shell脚本或者curator 定期进行hot转warm动作

  • DELETE阶段

    DELETE阶段是用来对日志数据的删除,日志数据满足DELETE阶段的删除条件(如:超过180天的索引数据),即可配置相关策略,手动或者脚本自动进行删除索引数据

6.2.实现

  • 操作ES 节点配置的YML文件,加入以下配置,即可指定node为冷暖阶段
    • node.attr.hotwarm_type: hot     # 标识为热数据节点Hot
    • node.attr.hotwarm_type: warm     # 标识为暖数据节点 Warm
    • 例:

热节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOBdBK8E-1673322267904)(RackMultipart20230110-1-yu4z31_html_9788f368a242bbd0.gif)]

暖节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfhQdSQc-1673322267906)(RackMultipart20230110-1-yu4z31_html_f318e249bfad7237.gif)]

6.3.数据写入

建立模板,或者索引时候,指定设置index.routing.allocation.require.hotwarm_type为hot类型即可实现,数据写入到热节点中

6.3.1.方案一:通过模板指定冷热数据节点(默认采用)

  • 注:以【order_】开头索引命名的,都将其数据放到hot节点上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M8W5g6kZ-1673322267906)(RackMultipart20230110-1-yu4z31_html_abd16e3b4380b882.gif)]

6.3.2.方案二:通过索引指定冷热数据节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDnvYwox-1673322267907)(RackMultipart20230110-1-yu4z31_html_18b78e07aa88c8.gif)]

6.4.数据迁移至冷节点

6.4.1.手动迁移

  • 在kibana里操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umvSZFya-1673322267908)(RackMultipart20230110-1-yu4z31_html_e1398925dee0cad2.gif)]

6.4.2.自动迁移

  • 亦可通过shell脚本或curator定期迁移,因本项目的写入数据的实时性偏低,可根据实际情况使用
  • 这里提供shell脚本方案:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XbDWLtIw-1673322267915)(RackMultipart20230110-1-yu4z31_html_a499f8647fb68d0e.gif)]

7.es配置分布分片规则

  • cluster.routing.allocation.awareness.attributes
    根据某个属性作为分片分布规则。

  • #设置节点属性rack_id及属性值rack_one

    node.rack_id: rack_one

  • #设置rack_id属性作为分片分布规则

    cluster.routing.allocation.awareness.attributes: rack_id

  • 可以为分片分布规则设置多个属性,例如:

    cluster.routing.allocation.awareness.attributes: rack_id,zone

  • 注意:当设置了分片分布属性时,如果集群中的节点没有设置其中任何一个属性,那么分片就不会分布到这个节点中。

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

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

相关文章

Blender里的三种绑定 (二)约束

文章目录Blender里的三种绑定.约束.变换约束.复制位置.复制旋转.复制缩放.限定距离.限定位置&#xff0c;限定旋转&#xff0c;限定缩放.维持体积.变换.追踪约束.钳制到.阻尼追踪.锁定追踪.拉伸到.标准跟随.关系约束.动作.骨架.子级.基面.跟随路径.轴心.缩裹.Blender里的三种绑…

ViT(Version Transformer)原始论文解读

An Image is Worth 16x16 Words Transformers for Image Recognition at Scale paper&#xff1a;2010.11929.pdf (arxiv.org) code&#xff1a;google-research/vision_transformer (github.com) 期刊/会议&#xff1a;ICLR 2020 摘要 虽然Transformer体系结构已经成为自然…

【保姆级】@PostConstruct @PreDestroy使用示例

简介PostConstruct & PreDestroy被PostConstruct注解修饰的方法会在服务器加载Servlet的时候运行&#xff0c;并且只会被服务器调用一次&#xff0c;类似于Servlet的init()方法&#xff0c;被PostConstruct注解修饰的方法会在构造函数之后&#xff0c;init()方法执行之前执…

群晖NAS搭建portainer

参考&#xff1a; 群晖、威联通、Linux最强docker管理工具portainer安装及汉化教程2022最新版本 Portainer官方文档 How to run Docker commands without sudo on a Synology NAS 因为群晖的NAS是基于linux但是限制很多的系统&#xff0c;有一些东西通过命令行操作可能会遇到权…

Git 常见错误 之 fatal: Authentication failed 简单解决方法

Git 常见错误 之 fatal: Authentication failed 简单解决方法 目录 Git 常见错误 之 fatal: Authentication failed 简单解决方法 一、简单介绍 二、问题现象 三、解决方法 1、修改全局配置用户名 和 邮箱 2、修改凭证(具体问题具体分析) 一、简单介绍 Git(读音为/gɪt…

系分 - 案例分析 - 需求分析

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分 - 案例分析 - 需求分析结构化分析SA数据流图DFD答题技巧典型例题题目描述参考答案面向对象的分析OOA用例图用例模型细化用例描述用例关系【包含、扩展、泛化】分析模型定义概念类确定类之间的关系类图…

拉伯证券|LPR利率三连降 全国首套房贷利率今年或“奔三”

2022年LPR接连下调。新年伊始&#xff0c;“房贷一族”迎来好消息&#xff0c;一年一度存量房贷利率重定价的日子到了。关于房贷利率挂钩借款商场报价利率(LPR)、重定价日为每年1月1日的住宅顾客&#xff0c;本年的房贷利率将迎来下降。不仅如此&#xff0c;存量公积金借款也于…

Flink实时计算引擎入门教程

Flink实时计算引擎入门教程 1.简介 Fink是一个开源的分布式,高性能,高可用,准确的实时数据计算框架&#xff0c;它主要优点如下: 流式计算: Fink可以连接处理流式(实时)数据。 容错: Fink提供了有状态的计算,会记录任务的中间状态,当执行失败时可以实现故障恢复。 可伸缩: F…

【软件测试】关于BUG的那些点点滴滴

关于BUG1. 如何合理的创建Bug1.1 创建Bug的要素2. Bug 的级别3. Bug 的生命周期3.1 Bug的状态3.2 Bug的生命周期4. 提出Bug后&#xff0c;跟开发产生争执怎么办1. 如何合理的创建Bug 1.1 创建Bug的要素 问题的版本&#xff0c;如浏览器的版本问题的环境&#xff0c;如windows…

融合注意力模块CBAM基于轻量级yolov5n开发共享单车目标检测系统

在很多的项目实战中验证分析注意力机制的加入对于模型最终性能的提升发挥着积极正向的作用&#xff0c;在我之前的一些文章里面也做过了一些尝试&#xff0c;这里主要是想基于轻量级的n系列模型来开发构建共享单车检测系统&#xff0c;在模型中加入CBAM模块&#xff0c;以期在轻…

web自动化测试---使用java+selenium+Junit

目录 1.什么是自动化以及为什么要进行自动化 2.为什么选择selenium作为web自动化工具 3.selenium环境部署 4.什么是驱动以及驱动的原理 5.selenium的基础语法和操作 5.1定位元素 5.2元素的操作 5.3等待 5.4信息打印 5.5窗口 5.6导航 5.7弹窗 5.8鼠标、键盘操作 5.…

Python + Appium 自动化操作微信入门

Appium 是一个开源的自动化测试工具&#xff0c;支持 Android、iOS 平台上的原生应用&#xff0c;支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium&#xff0c;能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令&#xff0c;…

虚拟化技术

虚拟化 虚拟化技术 目前虚拟化技术有软件模拟、全虚拟化&#xff08;使用二进制翻译&#xff09;、半虚拟化&#xff08;操作系统辅助&#xff09;、硬件辅助虚拟化和容器虚拟化这几种。 &#xff08;1&#xff09;软件虚拟化 软件模拟是通过软件完全模拟cpu、芯片组、磁盘、…

Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)

参考链接&#xff1a;https://blog.csdn.net/xiaobai_20190815/article/details/124045768 http://news.558idc.com/290335.html Java 安全-手把手教你SPEL表达式注入_4ct10n的博客-CSDN博客_spel注入 一、漏洞描述 Spring Cloud Gateway 是基于 Spring Framework 和 Spring…

组学新品|“4K”微生态之肠道菌群深度宏基因组

1.“4K”微生态定义 人体微生物群是人体内部与体表所有微生物有机体的总称[1]&#xff0c;其组成包括非细胞结构的病毒&#xff08;包括噬菌体&#xff09;、原核生物中的真细菌和古细菌&#xff0c;以及真核细胞微生物。与之对应&#xff0c;微生物群可以分为病毒群、细菌群、…

Redis未授权访问漏洞(二)Webshell提权篇

前言 在学习这篇文章之前&#xff0c;请先通过这篇文章Redis未授权访问漏洞(一)先导篇学习一下基础知识&#xff0c;再来学习这篇文章。 webshell提权 环境准备 攻击机&#xff1a; Centos7 IP:192.168.44.130 靶机&#xff1a;Centos7 IP:192.168.44.129 首先我们需要准备好…

QuartzNet的基本使用,Scheduler,Job,Trigger的应用

Quartz.Net的基本使用方法 Quartz.Net的基本使用是比较简单的&#xff0c;主要是对下面三个工具的创建和使用。 Scheduler调度器Job执行的动作Trigger触发器 Scheduler的创建和使用 scheduler的创建有几种不同的方式,但一般可以直接使用其提供的工厂类直接创建 通过工厂类…

分享92个NET源码,总有一款适合您

NET源码 分享92个NET源码&#xff0c;总有一款适合您 92个NET源码下载链接&#xff1a;https://pan.baidu.com/s/1Ya4GMXuHhNbqkLU5b7SPEw?pwd5vpx 提取码&#xff1a;5vpx 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&…

【指针面试题】-还在为学过指针的理论只是不会实践吗??赶紧来看看这里讲解了许多指针的面试题,带你更好掌握指针!!!

&#x1f387;作者&#xff1a;小树苗渴望变成参天大树 &#x1f9e8;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:link &#x1f389;指针笔试题详解&#x1f4a5;前言&#x1f4a6;一、指针和数组面试题解析&#x1f4a8;1.1一维数组&#x1f4a2;1.2字…

Episode 01 密码技术基础

一、加密和解密&&发送者、接收者和窃听者 发送者&#xff1a;发出消息的人 接收者&#xff1a;接收消息的人 窃听者&#xff1a;恶意获取消息的第三方 加密&#xff1a;发送者将明文转换为密文 解密&#xff1a;接收者将密文还原为明文 破译&#xff1a;接收者以外…