听说,你的Loki还是单体?(上篇)

2024-03-17 00:38
文章标签 单体 听说 loki

本文主要是介绍听说,你的Loki还是单体?(上篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正文共:1923字
预计阅读时间:5分钟

很多时候我们把Loki部署成一个单体应用,这样能够让我们快速的将它在开发、测试环境中应用起来。不过最终大家都还是逃不过真香定律,这个时候大家就在琢磨运维的灵魂三问了,这东西怎么部署到生产环境?高可用稳定吗?分布式怎么样?今天小白起个引子, 在Loki分布式部署上面给大家带来思考。

Loki主要组件

在分布式部署之前,小白还是有必要简单介绍下Loki的几个核心组件。

  • Distributor

Distributor是Loki日志写入的最前端,当它收到日志时会验证其正确性,之后会将日志切成块(chunk)后,转给Ingester负责存储。

  • Ingester

Ingester主要负责将收到的日志数据写入到后端存储,如DynamoDB,S3,Cassandra等),同时它还会将日志信息发送给Querier组件。

  • Querier

Querier主要负责从Ingester和后端存储里面提取日志,并用LogQL查询语言处理后返回给客户端

  • Query Frontend

Query frontend主要提供查询API,它可以将一条大的查询请求拆分成多条让Querier并行查询,并汇总后返回。它是一个可选的部署组件,通常我们部署它用来防止大型查询在单个查询器中引起内存不足的问题。

Loki的这些组件主要构成系统内的两条数据路径如下图,红色的为数据写入路径,绿色的为数据查询路径。

了解Cortex的同学可能看到这个图发现比较眼熟。没错,根据Loki的开发者描述,Loki的分布式架构正是从Cortex代码里面获取的。毕竟都是一个公司的产品,有个成熟的架构不用新造轮子????

Loki分布式架构

一致性哈希的应用是整个Loki实现分布式部署的关键部分,正如和Cortex一样,Loki的Distributor组件会将日志的租户ID或者Label集进行哈希处理,并决定将处理后日志发送给哈希环上的某一个Ingester处理。Ingester内维护了一个生命周期管理器,它会利用consul的token将自己的状态注册到哈希环中,其中状态包括PENDINGJOININGACTIVELEAVINGUNHEALTHY

JOINING状态的ingester可能会处理日志写入的请求
LEAVING状态的ingester可能仍会处理日志的查询请求

为了保证查询最终的一致性,Loki在响应客户端数据之前,Distributor必须要等待一半以上的Ingester服务成功响应后才会返回。

现在我们再来看看Loki要满足分布式所需要具备的条件:

  • 日志块文件需要持久化的对象文件存储,推荐Ceph S3

  • 日志索引需要一个可以水平扩展的NoSQL数据库,推荐Cassandra

  • 需要一个Consul的集群来保存Loki主要组件状态

  • 需要一个统一网关,用于Loki日志写入和查询的负载均衡

那么我们得到的Loki的整体架构就会像下面这样:

对了,如果你看过小白之前的文章《巧用缓存加速Loki日志查询》,如果我们希望在Loki分布式部署架构里面还要引入缓存的话,那Loki的架构就变成这样

怎么样,感觉是不是有点复杂了?不过这个图画着画着怎么感觉和Cortex一模一样。算了,大佬们负责设计,我们小白能用好就不错了????

Loki组件配置

Loki的模块部署主要通过在启动参数中调整--target参数来控制,默认情况下我们启动loki时没有指定该参数,那他就会以全量all_in_one的方式运行。

  • distributor_config定义了distributor的全局配置,主要维护了保存在consul或者etcd的一致性哈希环访问地址和ingesters心跳的信息。

ring:kvstore:#存储方式,支持consul、etcd或者memroy,三者选其一store: <string>#访问路径[prefix: <string> | default = "collectors/"]#kv存储的配置[consul: <consul_config>][host: <string> | default = "localhost:8500"][acl_token: <string>][http_client_timeout: <duration> | default = 20s][consistent_reads: <boolean> | default = true][etcd: <etcd_config>][endpoints: <list of string> | default = []][dial_timeout: <duration> | default = 10s][max_retries: <int> | default = 10][memberlist: <memberlist_config>][...略过...]#与ingesters的心跳超时时间[heartbeat_timeout: <duration> | default = 1m]

Loki自身利用gossip协议可以在内存里面实现了一致性hash,不过member的配置比较复杂,小白还是建议大家采用consul或者etcd来作为哈希环的存储后端

  • ingester_config里面定义生命周期管理器和日志存储的相关配置,这部分除生命周期管理器需调整外,大部分可以使用默认配置。

lifecycler:ring:kvstore:# 参照istributor_config配置即可[store: <string> | default = "consul"][prefix: <string> | default = "collectors/"][consul: <consul_config>][etcd: <etcd_config>][memberlist: <memberlist_config>][heartbeat_timeout: <duration> | default = 1m][replication_factor: <int> | default = 3]# 注册在哈希环上的token数,可以理解为虚拟节点[num_tokens: <int> | default = 128][heartbeat_period: <duration> | default = 5s]# 从服务的网卡上读取IP地址interface_names:- [<string> ... | default = ["eth0", "en0"]]
  • query_frontend_config这部分定义查询前端的配置

frontend:# 压缩http的响应包[compress_responses: <boolean> | default = false]# 定义下游的querier服务地址[downstream_url: <string> | default = ""]

query_frontend拆分查询请求是通过queryrange.split_queriers_by_interval决定的。如果将它设置为1h,query_frontend会将一天的查询分解为24个一小时的查询,将其分发给querier,然后在返回后聚合日志。

这在生产环境中非常有用,小白强烈建议开启。

query_frontend对于缓存的应用,当前支持Prometheus指标,对于日志的缓存,Loki1.6版本还不支持,后续可以期待下。

  • gateway是一个外部自定义的nginx负载均衡器,主要是将Loki的日志写入和查询请求做路由和负载均衡,它的核心配置可以参照如下:

server {listen               3100;location = / {proxy_pass      http://querier:3100/ready;}location = /api/prom/push {proxy_pass       http://distributor:3100$request_uri;}location = /api/prom/tail {proxy_pass       http://querier:3100$request_uri;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}location ~ /api/prom/.* {proxy_pass       http://querier-frontend:3100$request_uri;}location = /loki/api/v1/push {proxy_pass       http://distributor:3100$request_uri;}location = /loki/api/v1/tail {proxy_pass       http://querier:3100$request_uri;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}location ~ /loki/api/.* {proxy_pass       http://querier-frontend:3100$request_uri;}}

关于Loki的分布式总结小白就介绍到这里,《听说,你的Loki还是单体?(下篇)》我将更新利用Helm的方式部署Loki集群,敬请期待。

往期推荐

Loki和Fluentd的那点事儿

巧用缓存加速Loki查询

今日实践:Loki丝滑般的数据切换

今日实践:利用Grafana为你的Loki添加告警

关于云原生小白

云原生小白的创号目的是将平日里离大家较远云原生应用以实用的角度展现出来,站在小白的角度来看待和使用云原生,并以每篇文章解决一个实际问题的出发点带领大家走进云原生。

扫描二维码

获取更多精彩

云原生小白

这篇关于听说,你的Loki还是单体?(上篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817274

相关文章

笔试,牛客.kotori和n皇后​,牛客.AOE还是单体

目录 牛客.kotori和n皇后​编辑 牛客.AOE还是单体 牛客.kotori和n皇后  想起来,我之前还写过n皇后的题,但是这个我开始只能想到暴力解法 判断是不是斜对角线,联想y=x+b和y=-x+b,假如在一条线上,那么他们的x和y会对应成比例,这个扫描+判断是一个O(n^2)的操作。 import java.util.*; import java.io.*;//

loki语法记录

- **规则标题**: {{ .Annotations.Values }} - **触发时值**: {{ .ValueString }} - **监控对象**: {{ .Labels.Values }} - **监控指标**: {{ .Status }} - {{ if .Alerts.Resolved }}**恢复时间**: {{ .StartsAt }}{{else}}**触发时间**: {{

单体到微服务:架构变迁

单体架构与微服务架构:从单体到微服务的演变 引言单体架构概述微服务架构的优势一、功能定位二、使用场景三、配置方式四、性能特点Eureka - 服务注册与发现框架核心功能工作原理优势应用场景 结论 引言 在软件开发的世界中,随着业务的增长和技术的发展,传统的单一应用结构逐渐暴露了其局限性。 与此同时,微服务架构作为一种创新的软件设计模式,因其卓越的灵活性、可伸缩性和自主性而赢

你听说过思维导图吗?

引子 如果你没听说过思维导图,那么你可能错过了很美妙的一个工具。不过没关系,现在了解一下也不算迟。 思维导图又叫心智导图是表达发散性思维的有效的图形思维工具 ,它简单却又极其有效,是一种革命性的思维工具。 名词解释大家都不爱看,所谓的思维导图其实就是类似于下面这样一张图。 是不是觉得好复杂,徒手画图?我可没说。我们现在接触到的文档大多数都是电子化的,所以你经常看到的思维

听说做过这30件事的情侣不容易分手

听说做过这30件事的情侣不容易分手。1.每一周至少有一次约会的时间。2.聊天时多加一些语气词,“嗯嗯”改为“好哒”,“没有”改为“没有呀”,“晚安”变为“晚安噢”。你会发现每天的生活都充满了甜蜜的粉红色气泡。3.维持亲密关系最重要的方式之一就是见面。很多时候两个人再生气、矛盾再大,只要见个面,或者抱抱亲亲,所有的愤怒都会消失。别那么急着说分手。4.一个男生展示地有多成熟,他心底的小男孩就会有多幼稚

从单体架构到微服务架构的演变,微服务带来的挑战是什么?

文章目录 微服务架构与SOA架构最大的不同就是如下的几点。微服务架构带来的挑战微服务架构的优点微服务架构面临的挑战 如何实现微服务架构微服务架构图 微服务架构   业务系统进行服务化改造之后,对于原有的共享类型的业务系统可以拆分成复用的服务而存在,大大提升了整体系统的资源利用率。对于服务的拆分是否越小越好,还是需要结合业务场景进行拆分,最终达到解耦合的目的,可以提升业务的容

到底要多少粒麦子 你一定听说过这个故事。

package org.bluebridge.topics;/** 到底要多少粒麦子你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,在第4个棋盘格放8粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有64格)。国王以为他只是想要一袋麦子而已,哈哈大笑。当时的条

一直听说“不忘初心”,今天才知道真正内涵!

古语有云:“不忘初心,方得始终。” 什么是初心?                          1912年春天,哈佛大学教授桑塔亚纳正站在课堂上给学生们上课,突然,一只知更鸟飞落在教室的窗台上,欢叫不停。桑塔亚纳被这只小鸟所吸引,静静地端详着它。过了许久,他才转过身来,轻轻地对学生们说:“对不起,同学们,我与春天有个约会,现在得去践约了。”说完,便走出了教室。 那一年,49岁的

软件架构的发展经历了从单体结构、垂直架构、SOA架构到微服务架构的过程剖析

1.单体架构 特点: 1、所有的功能集成在一个项目工程中。 2、所有的功能打一个war包部署到服务器。 3、应用与数据库分开部署。 4、通过部署应用集群和数据库集群来提高系统的性能。 优点: 1、项目架构简单,前期开发成本低,周期短,小型项目的首选。 缺点: 1、全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。 2、系统性能扩展只能通过扩展集群结点,成本高、有瓶

linux 安装kafaka单体服务

1.下载kafka的linux安装包 前往Apache Kafka官方网站下载页面(Apache Kafkahttps://kafka.apache.org/downloads),选择最新稳定版的Kafka二进制分发文件,通常是以`.tgz`结尾的文件。 手动下载kafka_2.13-3.8.0.tgz到本地,然后上传到linux服务器 2.解压Kafka 将下载的Kafka压缩包解压