日志与可视化方案:从ELK到EFK,再到ClickHouse

news2024/12/23 1:35:54

EFK方案

从ELK谈起

ELK是三个开源软件的缩写,分别表示:Elasticsearch,Logstash,Kibana。新增了一个FlieBeat,它是一个轻量级的日志收集处理工具,FlieBeat占用资源少,适用于在各个服务器上搜集日之后,传输给Logstash。
Elasticsearch:开源分布式搜索引擎,提供搜集,分析,缓存数据三大功能,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负 载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构, client 端安装在需要收集日志的主机上, server 端负责将收到的各节点日志进行过
滤、修改等操作在一并发往 elasticsearch 上去。
Kibana 也是一个开源和免费的工具, Kibana 可以为 Logstash 和 ElasticSearch 提供的日志分析友
好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

从ELK挑战到EFK日志方案

ELK挑战

日志流量的增长导致了平台部署规模巨大,用户需求也发生了显著变化。两者都给基于 ELK 的平台带来了许多挑战,而这些挑战在较小的规模下是看不到的:

  1. 日志模式:我们的日志是半结构化的。ES(Elasticsearch)会自动推导模式,在整个集群中保持一致,并在后续日志中强制执行。如果字段类型不兼容,将导致 ES 出现类型冲突错误,从而丢弃违规日志。尽管对具有明确定义结构的业务事件实施一致的模式是合理的,但是对日志记录而言,这将导致开发人员的生产力大大下降,因为日志模式会随着时间的推移有机地演化。举例来说,一个大型的 API 平台可能会有数百名工程师进行更新,在 ES 索引映射中累积了数千个字段,而且不同的工程师很可能使用相同的字段名,但是不同的字段值是不同的类型,从而导致 ES 的类型冲突。这会迫使工程师学习已有的模式,并保持它们的一致性,仅仅打印一些服务日志,效率很低。理想情况下,平台应该将模式更改作为一个规范,并且能够为用户处理多种类型的字段。
  2. 运营成本:如果一个集群受到大量查询或映射爆炸的不利影响,我们必须在每个区域运行 20 多个 ES 集群,以限制爆炸半径。Logstash 管道的数量更多,每个区域有 50 多个,以适应特殊用例和自定义配置。昂贵的查询和映射爆炸都会严重影响 ES 集群的性能,有时甚至会“冻结”集群,这时我们不得不重新启动集群使其恢复。随着集群数量的增加,这种中断越来越频繁。虽然我们竭尽全力实现流程自动化,例如检测并禁用会引起映射爆炸和类型冲突的字段,重新平衡 ES 集群之间的流量等等,但是人工干预解决类型冲突等仍是不可避免的。我们想要一个能够支持我们组织中大量新用例的平台,而不必承担大量的运营开销。
  3. 硬件成本:在 ES 中,索引字段的成本相当高,因为它需要建立和维护复杂的倒排索引和正排索引结构,并将其写入事务日志,周期性地将内存缓冲区刷新到磁盘上,并定期进行后台合并,以保持刷新索引段的数量不至于无限制地增长,这些都需要大量的处理能力,并且会增加日志成为可查询的延迟。因此,我们的 ES 集群没有对日志中的所有字段进行索引,而是配置为索引多达三个级别的字段。但是摄取所有生成的日志仍然会消耗大量的硬件资源,并且扩展成本太高。
  4. 聚合查询:在我们的生产环境中发现,80% 以上的查询都是聚合查询,比如术语、直方图和百分数聚合。虽然 ES 在优化前向索引结构方面有所改进,但其设计仍然不能支持跨大型数据集的快速聚合。低效的性能会导致不愉快的用户体验。举例来说,在查询最后 1 小时的日志(大约 1.3 TB)时,一个日志数量巨大的服务的关键仪表盘加载速度非常缓慢,而且在查询最后 6 小时的日志时常常出现超时,从而导致无法诊断产品问题。
    我们只能在一个基于 ELK 的平台上摄取 Uber 内部生成的部分日志。在 ELK 平台基础上的大规模部署和许多固有的低效,使扩展以摄取所有日志并提供完整的、高分辨率的产品环境概述的成本高得令人望而却步。

EFK方案

由于 logstash 内存占用较大,灵活性相对没那么好, ELK 正在被 EFK 逐步替代 . 其中本文所讲的 EFK 是 Elasticsearch+Fluentd+Kfka。
Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch 、 Fluentd 和 Kibana ( EFK) 技术栈,也是官方现在比较推荐的一种方案。
Fluentd 是一个收集日志文件的开源软件,目前提供数百个插件可用于存储大数据用于日志搜索,数据分析和存储。
Fluentd适用于以下场景。
收集多台服务器的访问日志进行可视化
在AWS 等云端使用 AutoScaling 时把日志文件收集至 S3( 需要安装插件 )
收集客户端的信息并输出至Message Queue ,供其他应用处理
在这里插入图片描述
第一层,数据采集层:数据采集层位于最左边的业务服务器集群上,在每个业务服务器上面安装了 Filebeat 做日志收集,然后把采集到的原始日志发送到 Kafka+ZooKeeper 集群上。
第二层,消息队列层:原始日志发送到 Kafka+ZooKeeper 集群上后,会进行集中存储,此时,Filbeat 是消息的生产者,存储的消息可以随时被消费。
第三层,数据分析层:Logstash 作为消费者,会去 Kafka+ZooKeeper 集群节点实时拉取原始日志,然后将获取到的原始日志根据规则进行分析、清洗、过滤,最后将清洗好的日志转发至 Elasticsearch 集群中。
第四层,数据持久化存储:Elasticsearch 集群在接收到 Logstash 发送过来的数据后,执行写磁盘、建索引库等操作,最后将结构化的数据存储到 Elasticsearch 集群上。
第五层,数据查询、展示层:Kibana 是一个可视化的数据展示平台,当有数据检索请求时,它从 Elasticsearch 集群上读取数据,然后进行可视化出图和多维度分析。

在这里插入图片描述

ClickHouse方案

ClickHouse 是一款常用于大数据分析的 DBMS,因为其压缩存储,高性能,丰富的函数等特性,近期有很多尝试 ClickHouse 做日志系统的案例。本文将分享如何用 ClickHouse 做出通用日志系统。
可以解决的问题:
大数据量。对开发者来说日志最方便的观测手段,而且很多情况下会直接打印 HTTP、RPC 的请求响应日志,这基本上就是把网络流量复制了一份。
非固定检索模式。用户有可能使用日志中的任意关键字任意字段来查询。
成本要低。日志系统不宜在 IT 成本中占比过高。
即席查询。日志对时效性要求普遍较高。
数据量大,检索模式不固定,既要快,还得便宜。所以日志是一道难解的题,它的需求几乎违反了计算机的基本原则,不过幸好它还留了一扇窗,就是对并发要求不高。大部分查询是人为即兴的,即使做一些定时查询,所检索的范围也一定有限。

在这里插入图片描述
在这里插入图片描述
Fluent bit:目前社区日志采集和处理的组件不少,之前elk方案中的logstash,cncf社区中的fluentd,efk方案中的filebeat,以及大数据用到比较多的flume。而Fluent Bit是一款用c语言编写的高性能的日志收集组件,整个架构源于fluentd。官方比较数据如下:
日志系统主要分为四个部分:日志采集、日志传输、日志存储、日志管理。
● 日志采集:LogCollector 采用 Daemonset 方式部署,将宿主机日志目录挂载到 LogCollector 的容器内,LogCollector 通过挂载的目录能够采集到应用日志、系统日志、K8S 审计日志等
● 日志传输:通过不同 Logstore 映射到 Kafka 中不同的 Topic,将不同数据结构的日志做了分离
● 日志存储:使用 Clickhouse 中的两种引擎数据表和物化视图
● 日志管理:开源的 ClickVisual 系统,能够查询日志,设置日志索引,设置 LogCollector 配置,设置 Clickhouse 表,设置报警等

B站架构

在这里插入图片描述
如图所示为日志实时上报和使用的全链路。使用ClickHouse作为存储,实现了自研的日志可视化分析平台,并使用OpenTelemetry作为统一日志上报协议。日志从产生到消费会经过采集→摄入 →存储 →分析四个步骤,分别对应我们在链路上的各个组件,先做个简单的介绍:
● OTEL Logging SDK完整实现OTEL Logging日志模型规范和协议的结构化日志高性能SDK,提供了Golang和Java两个主要语言实现。
● Log-Agent
日志采集器,以Agent部署方式部署在物理机上,通过Domain Socket接收OTEL协议日志,同时进行低延迟文件日志采集,包括容器环境下的采集。支持多种Format和一定的加工能力,如解析和切分等。
● Log-Ingester
负责从日志 kafka 订阅日志数据, 然后将日志数据按时间维度和元数据维度(如AppID) 拆分,并进行多队列聚合, 分别攒批写入ClickHouse中.
● ClickHouse
我们使用的日志存储方案,在ClickHouse高压缩率列式存储的基础上,配合隐式列实现了动态Schema以获得更强大的查询性能,在结构化日志场景如猛虎添翼。
● Log-Query
日志查询模块,负责对日志查询进行路由、负载均衡、缓存和限流,以及提供查询语法简化。
● BLS-Discovery
新一代日志的可视化分析平台,提供一站式的日志检索、查询和分析,追求日志场景的高易用性,让每个研发0学习成本无障碍使用。

结合湖仓一体

在湖仓一体日益成熟的背景下,日志入湖会带来以下收益:
● 部分日志有着三年以上的存储时间要求,比如合规要求的审计日志,关键业务日志等,数据湖的低成本存储特性是这个场景的不二之选。
● 现在日志除了用来进行研发排障外,也有大量的业务价值蕴含其中。日志入湖后可以结合湖上的生态体系,快速结合如机器学习、BI分析、报表等功能,将日志的价值发挥到最大。
此外,我们长远期探索减少日志上报的中间环节,如从agent直接到ClickHouse,去掉中间的Kafka,以及更深度的结合ClickHouse和湖仓一体,打通ClickHouse和iceberg。

Kubesphere方案

在 KubeSphere 中,选择 Elasticsearch 作为日志后端服务,使用 Fluent Bit 作为日志采集器,KubeSphere 日志控制台通过 FluentBit Operator 控制 FluentBit CRD 中的 Fluent Bit 配置。(用户也可以通过 kubectl edit fluentbit fluent-bit 以 kubernetes 原生的方式来更改 FluentBit 的配置)
通过 FluentBit Operator,KubeSphere 实现了通过控制台灵活的添加/删除/暂停/配置日志接收者。
在这里插入图片描述

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

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

相关文章

JS语法(扫盲)

文章目录一、初识JavaScript二、第一个JS程序JS代码的引入JS程序的输出三、语法变量使用动态类型内置类型运算符强类型语言&弱类型语言条件语句循环语句数组创建数组获取数组元素新增数组元素删除数组元素函数语法格式形参实参个数的问题匿名函数&函数表达式作用域作用…

PHP 的运行方式有哪些?

PHP本质上的运行方式可以分为两种: 基于命令行的基于PHP-FPM的 但实际上,PHP能做的事很多,很多场景下,不同的运行方式能让开发更方便,减轻各种工作。 测试开发 PHP内置了一个HTTP 的server。这意味着,很…

stm32外设-GPIO

0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚, STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的…

java Date 和 Calendar类 万字详解(通俗易懂)

Date类介绍及使用关于SimpleDateFormat类Calendar类介绍及使用LocalDateTime类介绍及使用关于DateTimeFormatter类一、前言本节内容是我们《API-常用类》专题的第五小节了。本节内容主要讲Date 类 和 Calendar 类,内容包括但不限于Date类简介,Date类使用…

【微信小程序】-- 自定义组件 - 数据监听器 (三十四)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

传奇开服流程—传奇单机架设教程

现在传奇私服还是那么的火爆,上次有报道发布站一年盈利几个亿,还是有很大的机会,很多玩家因为GM开服关服给折腾,刚充的钱服务器就关了,很是恼火,于是都想自己整个服开开,但又不知道从何下手&…

三菱FX5U之数据处理类指令的使用

本课程使用三菱PLC works3编程软件进行教学,并使用works3的仿真功能进行PLC仿真,学习的时候不需要有实物PLC。 补充说明:三菱 FX 5U系列PLC使用的是GX works3编程软件,FX 3U、Q系列PLC使用的是GX works3编程软件。 第一章 八个案…

YUV实践记录

文章目录YUV基础介绍:不同采样YUV格式的区别为什么要使用YUV格式呢?YUV的存储方式Android中的YUV_420_888附录:YUV基础介绍: YUV在做手机图像或者视频处理的时候会经常用到的一个格式,用此文来记录YUV相关介绍&#xf…

hibernate学习(五)

hibernate学习(五) hibernate的一对多关联映射: 一、数据库表与表之间关系 一对多建表原则: 多对多的建表原则: 一对一建表原则: (1)唯一外键对应: (…

时间复杂度和空间复杂度的计算

目录 算法的复杂度 时间复杂的的概念 时间复杂度计算方法 大O的渐进表示法 空间复杂的概念 空间复杂的的计算方法 时间和空间复杂度的应用 消失的数字 轮转数组 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存&…

modbus转profinet网关连接5台台达ME300变频器案例

通过兴达易控Modbus转Profinet(XD-MDPN100)网关改善网络场景,变频器有掉线或数据丢失报警,影响系统的正常运行,将5台 ME300变频器modbus转Profinet到1200PLC,通过网关还可以实现Profinet转modbus RTU协议转…

LabVIEW中以编程方式获取VI克隆名称

LabVIEW中以编程方式获取VI克隆名称演示如何以编程方式获取VI的名称或克隆名称。如果VI作为顶级VI运行,则将显示VI的名称。如果VI在主VI中用作子VI,它将返回克隆的名称。在项目开发过程中,有时需要获取VI的名称。在此示例中,实现了…

【数论】试除法判断质数,分解质因数,筛质数

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 现已更新完KMP算法、排序模板,之…

代码管理--svnadmin工具介绍

1、简介 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序。正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件,当仓库结构和人员权限上了规模后,手动管理就变的非常容易出错,本系统能够识别人员和权限…

【AWS入门】IAM基本应用-2023/3/4

目录IAM概述根用户和IAM用户参考IAM概述 IAM(Identity Access Management)是身份和访问管理服务,要访问AWS服务和资源,就要使用IAM进行身份验证和授权。当我们通过控制台,CLI,或API访问AWS服务时,都需要通…

p5.js map映射

theme: smartblue 本文正在参加「金石计划」 本文简介 带尬猴,我嗨德育处主任 p5.js 为开发者提供了很多有用的方法,这些方法实现起来可能不难,但却非常实用,能大大减少我们的开发时间。 本文将通过举例说明的方式来讲解 映射 map…

《计算机网络》期末复习笔记

文章目录一、一些英文名词的标签(方便记忆)二、OSI七层协议三、综合题3.0 知识点储备3.1 在Internet 网中,某计算机的IP 地址是11001010.01100000.00101100.01011000 ,请回答下列问题3.2 假定发送方要发送的数据为10000101。采用C…

【Spring 深入学习】AOP的前世今生之后续

AOP的前世今生之后续 1. 概述 上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的,所以我们今天会简单学习下AOP 2. 什么是AOP 是面向切面编程,一般可以帮助我们在不修改现有代码的情…

Java中字符流(FileReader(read、close)、FileWriter(write、close)、字符(输入、输出)流原理解析)

1.创建对象: 2.读取数据 3.释放资源(关流) 如何使用重载的read()方法呢? FileWriter: 在前面我们指导,字节输出流和字符输出流的本质区别是,字节输出流一次只能操作一个字节,如果让…

QEMU启动ARM32 Linux内核

目录前言前置知识ARM Versatile Express开发板简介ARM处理器家族简介安装qemu-system-arm安装交叉编译工具交叉编译ARM32 Linux内核交叉编译ARM32 Busybox使用busybox制作initramfs使用QEMU启动ARM32 Linux内核模拟vexpress-a9开发板模拟vexpress-a15开发板参考前言 本文介绍采…