点击▲关注 “中生代技术”   给公众号标星置顶

更多精彩技术内容 第一时间直达

最近,在对公司容器云的日志方案进行设计的时候,发现主流的ELK或者EFK比较重,再加上现阶段对于ES复杂的搜索功能很多都用不上最终选择了Grafana开源的Loki日志系统,下面介绍下Loki的背景。

背景和动机

当我们的容器云运行的应用或者某个节点出现问题了,解决思路应该如下:

我们的监控使用的是基于prometheus体系进行改造的,prometheus中比较重要的是metric和alert,metric是来说明当前或者历史达到了某个值,alert设置metric达到某个特定的基数触发了告警,但是这些信息明显是不够的。我们都知道,k8s的基本单位是pod,pod把日志输出到stdout和stderr,平时有什么问题我们通常在界面或者通过命令查看相关的日志,举个例子:当我们的某个pod的内存变得很大,触发了我们的alert,这个时候管理员,去页面查询确认是哪个pod有问题,然后要确认pod内存变大的原因,我们还需要去查询pod的日志,如果没有日志系统,那么我们就需要到页面或者使用命令进行查询了:

如果,这个时候应用突然挂了,这个时候我们就无法查到相关的日志了,所以需要引入日志系统,统一收集日志,而使用ELK的话,就需要在Kibana和Grafana之间切换,影响用户体验。所以 ,Loki的第一目的就是最小化度量和日志的切换成本,有助于减少异常事件的响应时间和提高用户的体验。

ELK存在的问题

现有的很多日志采集的方案都是采用全文检索对日志进行索引(如ELK方案),优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,操作苦难。很多功能往往用不上,大多数查询只关注一定时间范围和一些简单的参数(如host、service等),使用这些解决方案就有点杀鸡用牛刀的感觉了。

因此,Loki的第二个目的是,在查询语言的易操作性和复杂性之间可以达到一个权衡。

成本

全文检索的方案也带来成本问题,简单的说就是全文搜索(如ES)的倒排索引的切分和共享的成本较高。后来出现了其他不同的设计方案如:OKlog(
https://github.com/oklog/oklog),采用最终一致的、基于网格的分布策略。这两个设计决策提供了大量的成本降低和非常简单的操作,但是查询不够方便。因此,Loki的第三个目的是,提高一个更具成本效益的解决方案。

整体架构

Loki的架构如下:

不难看出,Loki的架构非常简单,使用了和prometheus一样的标签来作为索引,也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据,不但减少了两种查询之间的切换成本,也极大地降低了日志索引的存储。Loki将使用与prometheus相同的服务发现和标签重新标记库,编写了pormtail, 在k8s中promtail以daemonset方式运行在每个节点中,通过kubernetes api等到日志的正确元数据,并将它们发送到Loki。下面是日志的存储架构:

读写

日志数据的写主要依托的是Distributor和Ingester两个组件,整体的流程如下:

Distributor

一旦promtail收集日志并将其发送给loki,Distributor就是第一个接收日志的组件。由于日志的写入量可能很大,所以不能在它们传入时将它们写入数据库。这会毁掉数据库。我们需要批处理和压缩数据。

Loki通过构建压缩数据块来实现这一点,方法是在日志进入时对其进行gzip操作,组件ingester是一个有状态的组件,负责构建和刷新chunck,当chunk达到一定的数量或者时间后,刷新到存储中去。每个流的日志对应一个ingester,当日志到达Distributor后,根据元数据和hash算法计算出应该到哪个ingester上面。

此外,为了冗余和弹性,我们将其复制n(默认情况下为3)次。

Ingester

ingester接收到日志并开始构建chunk:

基本上就是将日志进行压缩并附加到chunk上面。一旦chunk“填满”(数据达到一定数量或者过了一定期限),ingester将其刷新到数据库。我们对块和索引使用单独的数据库,因为它们存储的数据类型不同。

刷新一个chunk之后,ingester然后创建一个新的空chunk并将新条目添加到该chunk中。

Querier

读取就非常简单了,由Querier负责给定一个时间范围和标签选择器,Querier查看索引以确定哪些块匹配,并通过greps将结果显示出来。它还从Ingester获取尚未刷新的最新数据。

对于每个查询,一个查询器将为您显示所有相关日志。实现了查询并行化,提供分布式grep,使即使是大型查询也是足够的。

可扩展性

Loki的索引存储可以是
cassandra/bigtable/dynamodb,而chuncks可以是各种对象存储,Querier和Distributor都是无状态的组件。对于ingester他虽然是有状态的但是,当新的节点加入或者减少,整节点间的chunk会重新分配,已适应新的散列环。而Loki底层存储的实现Cortex已经 在实际的生产中投入使用多年了。有了这句话,我可以放心的在环境中实验一把了。

来源:zhisheng的blog

链接:https://www.toutiao.com/i6838206278662095374/

往期热门回顾

实惨!连各大编程语言都摆起地摊了!

“我,程序员,33岁,距离退休,只剩2年了!”

美团配送A/B平台评估体系建设与实践

波波老师大解密:如何成为优秀的架构师?

彩蛋

中生代技术社区提供内推服务啦,对应BAT,网易,头条等大厂对接到用人部门

有需求请添加群直聘小姐姐Elsa的微信

申请备注(姓名+公司+技术方向)才能通过哦!

   END
#接力技术,链接价值#

好兄弟,来一个一键三连⤵️️

日志Loki基妹出,便胜却ELK无数相关推荐

  1. .NET下日志系统的搭建——log4net+kafka+elk

    .NET下日志系统的搭建--log4net+kafka+elk 前言 我们公司的程序日志之前都是采用log4net记录文件日志的方式(有关log4net的简单使用可以看我另一篇博客),但是随着后来我们 ...

  2. 线上日志集中化可视化管理:ELK

    本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...

  3. 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群

    笔记内容:搭建ELK日志分析平台(上)-- ELK介绍及搭建 Elasticsearch 分布式集群 笔记日期:2018-03-02 27.1 ELK介绍 27.2 ELK安装准备工作 27.3 安装 ...

  4. 使用Filebeat采集日志结合logstash过滤出特定格式的日志至Elasticsearch

    使用Filebeat采集日志结合logstash过滤出特定格式的日志 文章目录 使用Filebeat采集日志结合logstash过滤出特定格式的日志 ELK搭建 什么是Filebeat 什么是Logs ...

  5. 【Elastic Stack学习】ELK日志分析平台(一)ELK简介、ElasticSearch集群

    * ELK简介: ELK是Elasticsearch . Logstash.Kibana三个开源软件的缩写.ELK Stack 5.0版本之后新增Beats工具,因此,ELK Stack也改名为Ela ...

  6. 【运筹学】单纯形法总结 ( 单纯形法原理 | 单纯形法流程 | 单纯形表 | 计算检验数 | 最优解判定 | 入基变量 | 出基变量 | 方程组同解变换 ) ★★★

    文章目录 一.单纯形法原理 二.单纯形法流程 三.单纯形法案例一 1.线性规划示例 2.转化标准形式 3.查找初始基可行解 4.初始基可行解的最优解判定 5.第一次迭代 : 入基与出基变量选择 6.第 ...

  7. 【运筹学】线性规划 人工变量法 ( 人工变量法案例 | 初始单纯形表 | 检验数计算 | 入基变量 | 出基变量 )

    文章目录 一.生成初始单纯形表 二.计算非基变量检验数 三.最优解判定 四.选择入基变量 五.选择出基变量 六.更新单纯形表 上一篇博客 [运筹学]线性规划 人工变量法 ( 单纯形法总结 | 人工变量 ...

  8. 【运筹学】线性规划 单纯形法 案例二 ( 第一次迭代 | 矩阵变换 | 检验数计算 | 最优解判定 | 入基变量 | 出基变量 )

    文章目录 一.第一次迭代 : 进行行变换 二.第一次迭代 : 计算检验数 三.第一次迭代 : 最优解判定 四.第一次迭代 : 入基变量 五.第一次迭代 : 出基变量 [运筹学]线性规划 单纯形法 ( ...

  9. Nginx日志分析竟挖掘出来自全世界的攻击

    Nginx日志分析竟挖掘出来自全世界的攻击 引言 关于脚本 Nginx日志格式 攻击挖掘 1.针对NVMS-9000摄像头RCE漏洞的扫描 2.试图扫描rdp(远程桌面) 3.试图扫描路由器或摄像头物 ...

最新文章

  1. postman怎么传session_十几行代码实现分布式 Session
  2. 每日一皮:这就是成都马拉松???...
  3. linux开启kafka消费者命令,Linux kafka常用命令
  4. 获取远程服务器代码到本地文件,获取远程服务器代码到本地文件
  5. 传智播客全栈_播客:从家庭学生到自学成才的全栈开发人员
  6. android 系统(34)--关机充电图标修改
  7. make it a chorus笔记
  8. static_cast vs reinterpret_cast vs const_cast vs dynamic_cast
  9. Microsoft Store下载应用奇慢无比的解决方案
  10. Vue前端框架选型论证,字节跳动高级java开发面试
  11. 基于java(springboot框架)旅游景区景点购票系统 java毕业设计选题课题作品 毕业论文
  12. 几款入夏品牌包包可以看看
  13. Linux cpumask分析
  14. [源码和文档分享]基于8253、8255芯片汇编实现简易电子琴
  15. DataPipeline | 享物说产品负责人夏凯:数据驱动的用户增长实战
  16. python语言下划线怎么打_python下划线 | 学步园
  17. STM32 高级定时器周期、频率、占空比、对外输出电压详解
  18. 码分多路复用 CDM
  19. eclipse导入import git项目
  20. f**k命令(解压神器)

热门文章

  1. windowblinds 6_过年回家选车很重要!锐骐6强势对比纳瓦拉
  2. quartus管脚分配后需要保存吗_嵌入式必须会的一些硬件面试题,要试一试吗?你过来呀!...
  3. cesium three性能比较_Go学习_21_Golang代码性能检测Benchmark
  4. extundelete应用实战
  5. c++ winpcap开发(7)
  6. #pragma pack(1) 的意义是什么
  7. ORB(Oriented FAST and Rotated BRIEF)
  8. PL/SQL 训练12--动态sql和绑定变量
  9. Py与Py3的区别之输入input()函数
  10. PHP文件操作的经典案例