K8s日志组件-Loki是如何存储数据的?

news2024/11/28 8:45:35

文章目录

    • 为什么需要loki
    • 为什么不是EFK?
    • Loki是如何存储数据的?
    • 底层的LSM tree
    • B+ tree 和LSM tree的区别?
    • Ref
    • 参考链接

为什么需要loki

日志记录本质上是一个事件。大多数语言、应用程序框架或库都支持日志,表现形式可以是字符串这样原始的非结构化数据,也可以是JSON等半结构化数据。开发者可以通过日志来分析应用的执行状况,报错信息,分析性能…… 正因为日志极其灵活,生成非常容易,没有一个统一的结构,所以它的体量也是最大的。

对于单体应用,查看日志我们可以直接登上服务器,用head、tail、less、more等命令进行查看,也可以结合awk、sed、grep等文本处理工具进行简单的分析。但是分布式应用,面对部署在数十数百台机器的应用,亟需一个日志收集、处理、存储、查询的系统
分布式系统观测性的三大基石

为什么不是EFK?

开源社区最早流行的是Elastic体系的ELK。Logstash负责收集,ElasticSearch负责索引与存储,Kibana负责查询与展示。ElasticSearch支持全文索引可以进行全文搜索,而且支持DocValue可以用于结构化数据的聚合分析。再加上MetricBeats提供了监控指标的收集,APM提供的链路收集,Elastic俨然已是一个集Logging、Metrics、Trace的大一统技术体系。这主要是因为早期的

Elastic野心很大,但是这也导致ElasticSearch并不专注在其中的一个领域。

1、使用全文索引受限于分词器,对于日志查询非常鸡肋(两个单词能搜索到,三个单词就搜索不到的现象也不少)。

2、而且索引阶段特别耗时,很多用户都无法忍受ElasticSearch索引不过来时抛出的EsReject。

3、另外,ElasticSearch除了用于全文搜索的倒排索引,还有store按行存储,在_source字段中存储JSON文档,docValue列式存储,对于不熟悉ElasticSearch的开发者来说,意味着存储体量翻了好几倍,ElasticSearch的高性能查询严重依赖于索引缓存,官方建议机器的内存得预留一半给操作系统进行文件缓存,这套吃内存的东西对普通的日志查询简直就是小题大做。

4、还有ElasticSearch在生产环境至少得部署三个节点,否则由于网络波动容易出现脑裂。

5、基于JVM的Logstash极其笨重,经常因为GC无响应导致日志延时,作为采集日志的agent有点喧宾夺主,为此Elastic专门用Go语言开发了轻量级的FileBeat日志采集工具。由FileBeat负责采集,Logstash负责解析处理。

目前K8s生态下以Fluentd和C语言编写的fluent-bit为主作为日志收集工具,Grafana开发的Loki负责存储。Loki去掉了全文索引,使用最原始的块存储,对时间和特定标签做索引,这和Metrics领域的Prometheus类似

Loki是如何存储数据的?

Loki是一个分布式日志聚合系统,它使用类似于Prometheus的标签查询语言来查询和过滤日志数据。Loki的数据存储方式与传统的日志存储方式不同,它使用了一种称为“无索引”的方式来存储数据。
在Loki中,日志数据被存储在称为“块”的文件中。每个块包含一定数量的日志条目,通常是几千到几万条。的大小可以配置,通常在几百MB到几GB之间。
Loki使用了一种称为“切片”的方式来组织块。每个切片包含一定数量的块,通常是几百到几千个。切片的大小也可以配置,通常在几GB到几十GB之间。
Loki使用一种称为“标签索引”的方式来查询和过滤日志数据。标签索引是一种基于标签的元数据存储方式它允许Loki快速地定位包含特定标签值的日志数据。
当Loki接收到新的日志数据时,它会数据写入一个新的块中。如果块已经达到了配置的大小限制,Loki会将块写入一个新的切片中。如果切片已经达到了配置的大小限制,Loki会将切片写入磁盘,并创建一个新的切片。
由于Loki使用了无索引的方式来存储数据,因此它可以快速地写入和查询大量的日志数据。同时,由于Loki使用了标签索引的方式来查询和过滤数据,因此它可以快速地定位包含特定标签值的日志数据。

底层的LSM tree

在这里插入图片描述
在这里插入图片描述

B+ tree 和LSM tree的区别?

B+ tree作为关系型数据库的存储引擎的首选数据结构是为何呢?
LSM 又是在什么情况下出现的呢?
存储和网络的发展

B+树和LSM树都是常用的数据结构,用于在磁盘上存储和管理大量的数据。它们的主要区别在于它的设计目标和适用场景。
B+树是一种平衡树,它的设计目标是在磁盘上高效地存储和查询数据。B+树的节点通常比较大,可以存储多个键值对,而且它的叶子节点形成了一个有序链表,可以支持范围查询。B+树的查询和插入操作的时间复杂度都是O(log n),其中n是数据的大小。

LSM树(Log-Structured Merge Tree)是一种基于日志的数据结构,它的设计目标是在磁盘上高效地存储和更新数据。LSM树将数据分为内存和磁盘两部分,内存部分使用一个类似于B+树的数据结构来存储数据,而磁盘部分则使用一系列有序的日志文件来存储数据。当内存部分满了之后,LSM树会将数据写入磁盘中的一个新的日志文件中。当磁盘中的日志文件数量达到一定阈值时,LSM树会将它们合并成一个新的文件。LSM树的查询和插入操作的时间复杂度都是O(log n),其中n是数据的大小。
B+树和LSM树的主要区别在于们的写入性能和空间利用率。

  • B+树的写入性能比较好,因为它可以直接在磁盘上进行原更新。
  • LSM树的写入性能比较差,因为它需要将数据写入内存和磁盘中的日志文件中。
  • LSM树的空间利用率比较好,因为它可以将多个小的日志文件合并成一个大的文件,从而减少磁盘空间的浪费。
  • B树的空间利用率比较差,因为它的节点通常比较大,而且它的叶子节点形成了一个有序链表会占用额外的空间。

因此,B+树适用于需要高效查询和范围查询的场景,而LSM树适用于需要高效写入和空间利用率的场景。 这也是为何loki存储占用空间少.

Ref

在这里插入图片描述

参考链接

https://www.bilibili.com/video/BV1oP4y1d7Jg/?spm_id_from=333.999.0.0
https://blog.hufeifei.cn/2021/09/Distribution/grafana/index.html

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

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

相关文章

安卓动画壁纸实战:制作一个星空动态壁纸(带随机流星动画)

前言 在我之前的文章 羡慕大劳星空顶?不如跟我一起使用 Jetpack compose 绘制一个星空背景(带流星动画) 中,我们使用 Compose 实现了星空背景效果。 并且调用非常方便,只需要一行代码就可以给任意 Compose 组件添加上…

30多家投递石沉大海,总算上岸了

大家好,我是帅地。 今年的行情,无论是暑假实习还是春招校招,都比往年要难一些,很多人在三月份要嘛简历石沉大海,要嘛面试一轮游,但也有部分人最后都拿到了不错的 Offer,包括我 训练营 里&#…

企业级信息系统开发——初探Spring-采用Spring配置文件管理Bean

初探Spring 一、Spring框架(一)Spring框架优点(二)Spring 框架因何而来(三)Spring框架核心概念 二、采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Sp…

在C++中,怎么把string转换成char*?

2023年5月21日,周日中午: 今天在写项目的时候遇到了这个问题,也解决了,所以记录一下 通过string类的copy成员函数就可以解决这个问题 copy函数的函数原型: string& copy(char* s, size_t n, size_t pos 0); 其…

【框架源码】SpringBoot核心源码解读之启动类源码分析

首先我们要先带着我们的疑问,spring boot是如何启动应用程序?去分析SpringBoot的启动源码。 我们在新建SpringBoot项目时,核心方法就是主类的run方法。 SpringApplication.run(ArchWebApplication.class, args) 我们点击run方法进入到源码中…

A survey of Large Lanuage models

一.引言 语言建模的四个阶段,统计语言模型(SLM):基于马尔科夫假设建立词预测模型,n-gram,神经语言模型(NLM):word2vec,预训练语言模型(PLM&#…

Godot引擎 4.0 文档 - 入门介绍 - 学习新功能

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Learning new features — Godot Engine (stable) documentation in English 学习新功能 Godot 是一个功能丰富的游戏引擎。有很多关于它的知识。本页介绍了如何使用…

English Learning - L3 作业打卡 Lesson2 Day11 2023.5.15 周一

English Learning - L3 作业打卡 Lesson2 Day11 2023.5.15 周一 引言🍉句1: Sometimes a person may be upset because he does not have something as nice as a friend has, like a fast new car.成分划分弱读连读爆破语调 🍉句2: That person may say…

【wifi-app 任意泄露】

一、fofa 搜索 title“Wi-Fi APP Login” # Date: 2022-06-12 # Exploit Author: Ahmed Alroky # Author Company : AIactive # Version: M30HG4.V5030.191116 # Vendor home page : wavlink.com # Authentication Required: No # CVE : CVE-2022-34047 # Tested on: Windows…

day2 I/O多路复用select函数

目录 思考一个问题: I/O多路复用select函数 代码实现 net.h server.c: socket.c 思考一个问题: 我们还是把视角放到应用B从TCP缓冲区中读取数据这个环节来。如果在并发的环境下,可能会N个人向应用B发送消息,这种情况下我们的…

java+springboot留学生新闻资讯网的设计与实现

Spring框架是Java平台的一个开放源代码的Full-stack(全栈)应用程序框架,和控制翻转容器的实现。Spring框架的一些核心功能理论,可以用于所有Java应用,Spring还为Java EE构建的Web应用提供大量的扩展支持。Spring框架没有实现任何的编程模型&a…

nodejs进阶(5)—接收请求参数

1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword地球。通过前面的进阶3教程《nodejs进阶(3)—路由处理》重介绍的url模块,我们知道接收方法如下这…

cpp11实现线程池(六)——线程池任务返回值类型Result实现

介绍 提交任务函数submitTask中返回的Result类型应该是用Result类包装当前的task,因为出函数之后task即如下形式:return Result(task); Result和Task都要互相持有对方的指针,Task要将任务执行结果通过Result::setVal(run()) 调用传给其对应…

RestCloud新一代(智能)全域数据集成平台发布

5月18日,RestCloud在其成立六周年的当天,发布了“新一代(智能)全域数据集成平台”。 5月18日,RestCloud在其成立六周年的当天,发布了“新一代(智能)全域数据集成平台”。 根据业内专…

【Linux环境基础开发工具】软件包管理器-yum

写在前面 今天我打算介绍如何在Linux环境下载软件, Linux作为一个操作系统,就像windows一样,当然是存在软件的。 目录 写在前面 怎么在Linux环境安装软件 源代码安装 rpm安装包安装 yum安装 如何理解Linux的生态 如何使用yum安装软…

【LLM大模型】模型和指令微调方法

note Hugging Face 的 PEFT是一个库(LoRA 是其支持的技术之一,除此之外还有Prefix Tuning、P-Tuning、Prompt Tuning),可以让你使用各种基于 Transformer 结构的语言模型进行高效微调。AIpaca羊驼:让 OpenAI 的 text-…

今年测试工程师正遭【革命】,“点点工”如何破局?

近几年来的特殊情况,综合过去的大形势变化,所有行业都会自下而上的进行一轮技术“大清洗”,技术停滞不前的“点工”或将被逐步取代。 软件测试现状 测试行业在十几年间发生了翻天覆地的变化,从早期站在风口上的快速发展&#xff…

fastapi基础篇

文章目录 简介环境搭建安装基础文件自动文档 基础使用POST请求传递参数返回定制信息jinja2返回html 简介 FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6 并基于标准的 Python 类型提示。 关键特性 快速&#…

【学习笔记】TCP/IP协议详解

1.A、B、C类网络号各有多少个? A类网络号:共有2^7 - 2个,即126个。这是因为A类网络号的第一个字节范围是1.0.0.0到126.0.0.0,其中0.0.0.0和127.0.0.0是特殊保留地址,不能用于网络划分。 B类网络号:共有2^…

Redis的主从复制,哨兵及群集

一、主从复制 1、主从复制-哨兵-集群 主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自…