听说,你的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

相关文章

从单体到微服务:Java架构演进之路

从单体到微服务:Java架构演进之路 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 随着互联网行业的不断发展,软件架构也在不断演进,从最初的单体应用到如今的微服务架构,Java作为一种流行的编程语言,在这个演进过程中扮演着重要的角色。本文将探讨在Java生态系统中,从单体架构向微服务架构的演进之路。 单体架构的特点 在单

听说分享笔记会奖励粮票的,我也发一篇

由于咱们兄弟连限制下载,所以内容直接写下去了,复制粘贴吧 所有内容都是写在PHP文件的,新建一个PHP复制到里面吧,有充分的注释,都是自己写的例子,名称都是$a $b之类的,凑合看吧 /*------------------------------------数组函数开始------------------------------------*/ echo "<br/><font c

为什么说静态工厂方法可能会比构造器更好?听说读完就会有一个女朋友?

文章目录 什么是静态工厂方法静态工厂方法比构造器好在哪里静态工厂方法有名称而构造器没有(前者可读性更好)不必每次调用它们的时候都创建一个新对象可以返回原返回类型的任何子类对象创建泛型对象可以更加简洁 静态工厂的局限之处总结 前言:相信读过《Effective Java》(第二版)的小伙伴知道我在说什么,作者在书中总结了78条黄金建议,其中建议的第一条就是:考虑用静态工厂方法替代构造

java单体服务自定义锁名称工具类

需求: 操作员能够对自己权限下的用户数据进行数据填充,但是不同操作员之间可能会有重复的用户数据,为了避免操作员覆盖数据或者重复操作数据,应该在操作用户数据时加锁,要求加的这一把锁必须是细粒度的锁,不能锁住所有用户的操作 ,只锁当前操作用户,锁的名字为用户id,在获取到锁之后执行业务操作,否则阻塞等待, 这个单体服务锁工具如何设计? 思路: 思路: 1、锁工具类:首先创建一个Concurre

基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码 UWB定位技术 超宽带定位 高精度定位系统源码

基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码  UWB定位技术 超宽带定位 高精度定位系统源码 UWB高精度定位系统采用先进的无线载波通信定位技术,通过在工作区域定位基站和现场人员佩戴的标签,实现对进入生产现场人员的高精度定位,复杂场景下检测精度最高可达10cm,系统容量大,判断准确,实时性好。基于系统定位功能开发的电子围栏及SOS报警等功

Cesium前端实现倾斜摄影数据单体化的效果

倾斜摄影数据要实现单体化,有好几种方式: 其一:利用收费的超图IServer制作单体化,具体制作流程在他们官方网站有制作流程文档(但IServer的收费不菲,性价比不高) 可参考: http://support.supermap.com.cn:8090/iserver/iClient/for3D/webgl/zh/examples/TopicDoc/LoadObliqueModel_Oper

自己感觉很不容易的作品。。。。不过听说很烂......囧

问题及代码: /* *Copyright (c) 2014,烟台大学计算机学院 *ALL right reserved *文件名;frist.cpp *作者;童宇 *完成日期2014年10月10日 *版本号v1.0 *问题描述:求1的1次方+2的2次方+3的3次方+.......+m的m次方 *输入描述:输入最大整数m *程序输出:输出1的1次方+2的2次方+3的3次

某商业落地充电桩后台服务器通迅协议V2.28 开源 | 嘎嘎快充充电桩平台V2(支持 汽车 电动自行车 云快充1.5、云快充1.6 单体服务 )

嘎嘎快充开源充电桩平台 源码下载地址https://gitee.com/itholiday 充电桩与后台服务器 通讯协议 V2.28 目录 1 网络拓扑 1.1 功能界定: 1.1.1 充电机智能终端 1.1.2 智能中心管理系统 1.2 接口定义: 1.3 通讯方式: 1.4 通信规约 1.5 报文格式 1.6 关键命令 2 应用层 2.1 数据格式 2.2 心跳包机制

听说部门来了个00后测试开发,一顿操作给我整麻了

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍!给公司省了不少成本。 后来才知道,他在以前的公司,业务能力特别强,JVM调优经验丰富。 在他来之前我们公司从不不做JVM调优,之前也有朋友说,“我们公司的系统从来都没有经过性能调优,集成测试没问题后就上

听说你天天加班,那就不给你加薪了

网上看了篇文章,颇有些道理,转载下。 比自己不加薪更痛苦的是什么?别人加薪了。 比别人加薪更痛苦的是什么?“别人”没有我努力(加班多)。 其实,老板都看得见。 无论是你天天留下来加班到八九点,还是你P了十分钟图晒的朋友圈,聪明又善良的老板都会勤勤恳恳的点赞。 然而,点赞是因为老板的职业素养,而不是你的看上去很勤奋。说的再直白点,点赞因为我是个好领导,而不是因为你看上去是个好员工。