elasticsearch date_Elasticsearch在日志分析领域应用和运维实践

363695ffb30b3f075675d6a4be909f11.png

主要讲述了:

  • 基于ELK + Kafka 的日志分析系统
  • Elasticsearch 优化经验
  • Elasticsearch 运维实践

ElasticSearch介绍

分布式实时分析搜索引擎,优点包括:

  • 查询近实时
  • 内存消耗小,搜索速度快
  • 可扩展性强
  • 高可用

数据结构

  • FST(Finite State Transducer)

a5728f12b46b2298b5f32578b61d0707.png

这种数据结构适用于文本查询。通过对词典中单词前缀和后缀的重复利用,压缩存储空间,压缩比率一般在 3~20 倍之间。O( len ( str )) 的查询时间复杂度。范围搜索,前缀搜索比传统的 hashmap 有明显优势。

  • BDK Tree

适用于数值型,地理信息( geo )等多维度数据类型。当K=1, 二叉搜索树,查询复杂度 log(N)

f88ff1df24fd2df596ae4ad7b955bb19.png

K=2, 确定切分维度,切分点选这个维度的中间点

c0b46d79112d6fb4c2ae0244ffbea210.png

扩展性

通过索引分片机制,实现集群的横向扩展

6d6187440889b5fe836ab39dac86a55f.png

高可用

通过shard冗余备份,跨可用区部署,数据快照 (snapshot) 。应对集群节点故障,数据损坏。

3e6141b0901f67d43b8aa7c586d00f0b.png

ElasticSearch全家桶

Kibana : 数据可视化,与 elasticsearch 交互。Elasticsearch: 存储,索引,搜索。Logstash: 数据收集,过滤,转换。Beats: 比 logstash 更轻巧 , 更多样化 : Filebeat, Metricbeat, Packetbeat, Winlogbeat …

7ddc4a083f6e518656a2f8bf410a2b45.png

基于ELK和Kafka的日志分析系统

1e5c5f27c1e9d8cf7759a143d283927f.png

Logstash优点

提供了大量的用于数据过滤,转换的插件 drop: 丢掉不需要的数据 grok : 正则匹配抓取数据 date : 从数据中解析date属性,用作 Elasticsearch document 的 timestamp metrics: 获取 logstash 的 metrics codec.multiline :多行数据合成一条记录 fingerprint : 防止插入重复的数据

Logstash 缺点:收集 log 效率低,耗资源。Filebeat: 弥补的缺点,但自身插件较少。

使用Kafka进行日志传输

Kafka 有数据缓存能力。Kafka 数据可重复消费。Kafka 本身高可用,防止数据丢失。Kafka 的 throughput 更好。Kafka 使用广泛。

实践经验:不同的 service ,创建不同的 topic 。根据 service 的日志量,设定 topic partition 个数。按照 kafka partition 的个数和消费该 topic 的 logstash 的个数,配置 consumer_threads。尽量明确 logstash 和对应消费的 topic ( s) ,配置消费的 topic 少用通配符。

集群规划的基本问题:

1. 总数据量大小:每天流入多少数据,保存多少天数据。

每日增加的数据量:每日新增的 log 量 * 备份个数 。

如果 enable 了 _ all 字段,则在上面的基础上再翻一倍。比如每天新增 1T 的 log ,每个 shard 有 1 个备份, enable_all ,则 Elasticsearch 集群的实际数据增加量约等于 4T 。

如果每天需要存 4T 数据,假如保存 30 天的数据,需要的最低存储是 120T ,一般还会加 20% 的 buffer 。

至少 需要准备 144T 的存储空间。根据日志场景的特点,可做 hot-node, warm - node 划分。

hot-node 通常用 SSD 磁盘, warm-node 采用普通机械盘。

2. 单节点配置:每个节点多少索引,多少 shard ,每个 shard 大小控制在多少。

根据总数据量和单节点配置,得出集群总体规模。

单节点,根据经验通常 CPU :Memory的配比是1:4。

Memory : Disk的配比为 1 : 24 。

Elasticsearch heap 的 xmx 设置通常不大于 32g 。

Memory 和 shard 的配比在 1 : 20 ~ 1:25 之间。

每个shard的大小不超过50g 。

实践案例分析

产线上出现服务 failover , backup 集群日志量会忽然增大, kafka 里的数据量也突然增多,单位时间内 logstash 消费 kafka注入Elasticsearch的数据量也会增大,如果某些正在插入数据的 primary shard 集中在一个node上,该node会因为需要索引的数据量过大、同时响应多个logstash bulk 请求等因素,导致该 node 的 Elasticsearch 服务过于繁忙 。

若无法响应 master 节点发来的请求(比如 cluster health heartbeat), master 节点会因为等待该节点的响应而被 block ,导致别的节点认为 master 节点丢失,从而触发一系列非常反应,比如重选master 。

若无法及时响应 logstash 请求, logstash connect elasticsearch 便会出现 timeout , logstash 会认得这个 Elasticsearch 为 dead ,同时不再消费 kafka 。Kafka 发现在同一个 consumer group 里面某个 consumer 消失了,便会触发整个 consumer group 做 rebalance ,从而影响别的 logstash 的消费,影响整个集群的吞吐量。

典型 羊群效应 ,需要消除头羊带 来的影响。可通过 elasticsearch API: GET/_cat/thread_pool / bulk?v&h =name , host,active,queue,rejected,completed 定位哪个节点比较忙:queue 比较大, rejected 不断增加。然后通过 GET /_cat/shards 找到该 node 上活跃的 shard 。最后再通过 POST /_cluster/reroute API 把 shard 移到 load 比较低的 node 上,缓解该 node 的压力。

ElasticSearch集群运维实践

我们主要关注:

  • 集群健康状态 2 . 集群索引和搜索性能
  • 节点 cpu , memory, disk 使用情况

集群green ,正常。

集群yellow,主要是有 replica shard 未分配。

集群 red ,是因为有 primary shard 未分配。

主要原因:集群 node disk 使用率超过 watermark ( 默认 85% )。可通过 api GET/_cat/ allocation 查看 node 的磁盘使用率。可通过 api GET/_cluster/ settings 查看 cluster.routing.allocation.enable 是否被禁止。可通过 api GET /_cluster/allocation/explain? pretty 查看 shard 未分配到 node 的具体原因。

监控工具推荐使用:cerebro( https://github.com/lmenezes/cerebro )

97610d8945161a5469e5a737ef24cae2.png

cc8bb3e2f80989402fbcdbc0678c19e8.png

ElasticSearch优化经验

索引优化

  • 提前创建索引
  • 避免索引稀疏,index 中 document 结构最好保持一致,如果 document 结构不一致,建议分 index ,用一个有少量 shard 的 index 存放 field 格式不同的 document 。3 . 在加载大量数据时可设置 refresh_interval =-1 , index.number_of_replicas =0 ,索引完成后再设回 来。4 . load 和 IO 压力不大的情况,用 bulk 比单条的 PUT/DELETE 操作索引效率更高 。5 . 调整 index buffer( indices.memory.index_buffer_size ) 。
  • 不需要 score 的 field ,禁用 norms;不需要 sort 或 aggregate 的 field ,禁用 doc_value 。

查询优化

  • 使用 routing 提升某一维度数据的查询速度。
  • 避免返回太大量的搜索结果集,用 limit 限制。
  • 如果 heap 压力不大,可适当增加 node query cache( indices.queries.cache.size ) 。
  • 增加 shard 备份可提高查询并发能力,但要注意 node 上的 shard 总量。
  • 定期合并 segment 。

阿里云ElasticSearch服务

阿里云提供的ElasticSearch服务包含了监控、报警、日志可视化、一键扩容等特点

90361313d40283a0f4540ec5606421b8.png

c46d79d8fea218c40e2ce65d046e1e8f.png

af2dc8a48740588715ee861cd5d9d4c2.png

9b51a161b7665cc8a3c3b95681ce1362.png

想要获取更多相关资料 后台私信我【资料】即可获得资料免费领取方式!

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

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

相关文章

【转】2:C#TPL探秘

理论: 1、 只要方法是 Task类型的返回值,都可以用 await 来等待调用获取返回值。 2、 如果一个返回 Task类型的方法被标记了 async,那么只要方法内部直接 return T 这个 类型的实例就可以。 3、 一个返回 Task类型的方法没有被标记了 asyn…

Qt添加翻译文件无效或部分无效

原因: QTranslator::load路径错误qApp->installTranslator调用时机应该在所有界面起来之前。命名空间宏导致的问题。如果一个类有命名空间宏,则宏不会转换为命名空间,导致ts文件内的上下文不包含命名空间。上下文对不上导致部分窗口翻译失…

linux shell脚本攻略第3版_「技术干货」师傅说不会写shell脚本的网安不是一个好黑客,实战...

shell脚本?在说什么是shell脚本之前,先说说什么是shell。shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令…

【转】3:C#异步WaitAll的使用

编写界面如图: private async void button1_Click(object sender, EventArgs e){#region 单个执行的异步,效率慢HttpClient wc new HttpClient();string s1 await wc.GetStringAsync(textBox1.Text);label1.Text s1.Length.ToString();string s2 awa…

Qt实现QTextEdit背景透明

QTextEdit为什么要拿出来单独说,因为它继承自QAbstractScrollArea,一般的设置无效。滚动区域ScrollArea内部有一个widget,需要同时设置ScrollArea和viewport两个窗口才能实现透明。代码如下: m_text_editor->setWindowFlags(Q…

python断点调试_「Python调试器」,快速定位各种疑难杂症!!!

在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要讲的重点。今天主要是想给大家介绍一下 「 Pyth…

【转】C# 温故而知新:Stream篇(—)

目录: 什么是Stream? 什么是字节序列? Stream的构造函数 Stream的重要属性及方法 Stream的示例 Stream异步读写 Stream 和其子类的类图 本章总结 什么是Stream? MSDN 中的解释太简洁了: 提供字节序列的一般视图 (我可不想这么理解…

python 画树 递归_数据结构 - python如何递归生成树?

问 题 class Tree: def __init__(self, label): self.root label self.child {} def set_child(self, label, relate): self.child[label] relate def get_root(self): return self.root def get_child(self): return self.child 这么一颗树结构,该如何写 def cr…

java integer valueof_一文读懂什么是Java中的自动拆装箱

本文主要介绍Java中的自动拆箱与自动装箱的有关知识。基本数据类型基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型。它们是我们编程中使用最频繁的类型。Java是一种强类型语言,第一次申明变量必须说明数据类型,第一…

【转】面试:一个单例模式,足以把你秒成渣

去面试(对,又去面试) 问:单例模式了解吧,来,拿纸和笔写一下单例模式。 我心想,这TM不是瞧不起人吗?我编程十年,能不知道单例模式。 答:(.net 平…

【转】SQL 语句执行顺序

From:http://www.jellythink.com/archives/924 Oracle-SQL语句执行原理和完整过程详解:https://wenku.baidu.com/view/398bc427964bcf84b8d57b00.html 详解一条 SQL 语句的执行过程:http://www.cnblogs.com/cdf-opensource-007/p/6502556.h…

堆和栈的概念和区别 python_堆和栈的概念和区别

在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域&#x…

【手算】哈夫曼编码—树形倒置快速画法

哈夫曼编码的原理 参考文章:哈夫曼编码详解——图解真能看了秒懂 简单总结其原理: 需求:对重复出现的元素进行二进制编码,最高效的编码方式是哈夫曼编码。 方法:按照元素出现的频率大小构造一棵树,出现次…

【转】Web API项目中使用Area对业务进行分类管理

在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加很快,难以管理,而且如果有不同业…

centos部署python flask_用Dockerfile部署你的Flask Web应用

背景故事话说去年年底给另外一个组的同事写了一个简单的工单查询系统,用flask写的,当时是部署在我们组的一台测试物理机上,操作系统是Redhat 7。后来我们组的这台测试物理机要做其它用途,领导给两天时间让把应用迁走,问…

centos7安装flink集群_《从0到1学习Flink》—— Flink 写入数据到 Kafka

前言之前文章 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch 写了如何将 Kafka 中的数据存储到 ElasticSearch 中,里面其实就已经用到了 Flink 自带的 Kafka source connector(FlinkKafkaConsumer)。存入到 ES 只是其中一种情况&a…

Qt中的私有信号

一、什么是Qt私有信号? 直接引用Qt文档中的描述: 二、私有信号的作用 私有信号只能被响应,不能被用户代码来发射(emit)。这是一种对某些信号的权限控制,也就是用户代码没有权力“发号施令”,只…

opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)

​某城市会展中心室内地图背景一名室内设计师的日常工作从设计一张会展地图开始。常常有这样的场景:划分除规范的展位后,进入销售阶段,频繁的需要修改这张地图,如展示拆分、合并、换位置、标记已交易。问题从上图中标记色块的是有…

【转】C#中ToString()格式详解

以下内容均摘自博客园,仅供资料查询。 ToString格式化 在很多对象显示为字符串的时候都会使用到ToString中的格式化,由于以前没怎么注意到这个问题,想总结一下各个基础结构对象的格式化,以便后备之用!!&am…

【编译原理】入门总结

教程资源 入门教程在:手把手教你做一个 C 语言编译器 学习过程 19年尝试学了一下,中途看不懂放弃了。20年底从头再看一遍,经过一年的知识积累,在仔细研读之下,终于算是学懂了。此文中记录了我在最初学习时遇到的问题…