想了解更多关于开源的内容,请访问:
开源基础软件社区
https://ost.
Loggie萌芽于网易严选业务的实际需求,成长于严选与数帆的长期共建,持续发展于网易数帆与网易传媒、中国工商银行的紧密协作。广泛的生态,使得项目能够基于业务需求不断完善、成熟。目前已经开源:https://github.com/loggie-io/loggie。
严选日志平台初期,使用filebeat采集云内日志,用flume采集云外日志。期间经历了一段痛苦的运维排障时期,被问的最多的几个问题:
而且同时维护了2套日志采集agent,维护成本高。不管是filebeat还是flume都存在以下几点严重的问题:
同时也调研其他开源的日志采集agent,或多或少都存在上述问题,且都没有足够的可观测性和运维手段(工具)来帮助运维排障,更不用说完整的日志解决方案。
因此我们走向了自研的道路。
loggie在2022年初已开源:https://github.com/loggie-io/loggie
欢迎大家使用,与社区一起成长!
基于golang,借鉴经典生产者-消费者模式的微内核设计。一个pipeline只有source、queue、sink、interceptor4个组件概念,且interceptor也不是必须的。pipeline支持配置热加载,组件热插拔,pipeline之间强隔离,防止相互影响。
pipeline的设计初衷主要是为了隔离性。之前运维遇到的一个严重问题:云内使用filebeat采集多个业务的多个日志文件,但是其中一个日志文件的采集配置的topic被误删,导致发送到kafka失败而阻塞,进而导致整个物理机几点的所有日志都阻塞。因此我们需要一种泳道隔离手段,来隔离不用业务、不同优先级的日志,避免相互影响。
pipeline的简洁设计使得我们的扩展极其便捷。在概念上,一个pipeline只有4种组件:source、queue、sink、interceptor,而且interceptor不是必须的。越少的概念,扩展者者就有越少的学习成本。并且,为了进一步提高扩展性,pipeline中的所有组件都抽象为component,所有的组件拥有一致的生命周期与实现方式。不仅方便了扩展,也方便了loggie对组件的统一管理。
基于pipeline,我们实现了配置热更新,组件热加载。reloader与discovery组件可以基于K8S CRD、http监听等方式(预留接口,可以对接例如zookeeper、consul、apollo等配置中心),以pipeline维度进行reload。因此,在保证了reload能力的同时仍然满足了pipeline隔离的目的。
interceptor在loggie中是一个可选的组件,却在loggie中扮演着非常重要的角色。loggie中绝大多数的增强功能都是基于interceptor实现的,例如限流、背压、日志切分、encode&decode、字符编码、结构化等。用户可以根据实际情况选择对应的interceptor提升loggie的适应能力。
完整内置interceptor:https://loggie-io.github.io/docs/reference/pipelines/interceptor/overview/。
对于一个日志采集agent来说,通常需要重点关心以下3点的设计与实现:
日志采集,我们关心的是这么几个问题:
这其实是两方面的问题:
如何做到文件事件感知呢?业界有两种做法:
两种方式各有利弊:
因此loggie结合两者共同实现了一个安全可靠,却又能及时感知事件的方案:
同时启用定时轮询和OS通知,使用OS通知然后搭配一个相对较长(loggie默认为10s)的定时轮询,将两者发现的事件进行合并以减少重复处理,这样就能同时兼具两者的优点。
但是实际测试下来,我们发现了cpu占用上升,分析原因:
所以,我们重新分析,什么样的事件是我们真正关心并需要及时感知的呢?
当我们无法及时发现文件写事件,会有什么影响呢?有两种情况:
- 如果这个文件正处于采集中(持有文件句柄),那这个文件的写事件没有影响。因为正在读这个文件,后续的写入理所当然能被读到。
- 如果这个文件处于不活跃状态(即文件已经读取到了末尾,并且一定时间内没有发现新内容,甚至文件的文件句柄被释放了),这个情况我们希望能及时感知文件的写事件以方便我们及时采集最新的写入内容。
因此,重要的是“不活跃”文件的写事件。
当我们没有及时发现新建事件,会有什么影响呢?
首条日志写时间到发现时间之间的日志将会延迟采集(对于loggie来说,最大延迟在10s左右,因为默认的轮询时间间隔为10s),但是一旦感知到事件,采集可以很快追上进度。因此新建事件不那么重要。
当我们没有及时发现删除事件,会有什么影响呢?有3种场景:
- 文件被删除后,希望未采集完成的文件继续采集:这种情况,删除事件迟到不总要。因为当文件还未采集完,及时发现的删除事件没有意义;当文件采集完后,未及时发现的删除事件仅影响文件句柄释放延迟。
- 文件被删除后,希望尽快释放磁盘空间:仅仅导致文件句柄释放延迟,即磁盘空间释放延迟(大概在10s左右)。
- 文件被删除后,希望未采集完的文件给予一定的容忍时间再释放磁盘空间:这种情况近会导致文件最终释放延迟的时间=容忍时间+事件迟到时间。
因此,删除事件不重要。
同上,不重要。但是如何得知文件改名以及改成什么名确实个值得好好思考的问题!(暂不展开)
所以,真正重要的是不活跃的文件写事件。因此我们的架构调整为:
成果:
文件读的快的原则:
矛盾点:
因此文件读取的原理为:
成果: 读取性能达到2G/s(本地macbook ssd环境测试)。
公平性我们关心的是文件之间的读取平衡,不要造成文件读取饥饿(长时间得不到读取而造成数据延迟)。业界这块的做法有两种:
因此loggie实现了基于“时间片”的读取方式:
成果: 仅仅用一个线程(goroutine)就处理了loggie所有的日志读取任务,且最大可能的保证了公平性。
loggie保证了数据的不丢失,实现了at least once保证。对于文件读取来说,可靠性的实现有一定特殊性:需要保序ack,即我们对于采集点位记录的持久化前提是当前ack之前的ack全部done。因此为了提高保序ack的性能,我们的这块的设计进行了一些优化:
对于sink端提交的ack不立即进行持久化,而且进行了双重压缩:
成果: 大大减少了cpu的消耗和ack持久化的磁盘io次数。
对比filebeat,同等情况下,发送至Kafka(单行、单文件、相同发送并发度、无解析场景):
基于loggie我们做了很多运维治理,以及应用分析的事情:
根据长期运维、排障经验归纳提炼的内置指标,可以指导帮助我们快速发现定位问题:
提供了grafana模版,可以一键配置:https://github.com/loggie-io/installation/tree/main/prometheus/grafana-dashboard。
日志从采集到最终的存储,链路可能比较冗长,中间任何一个环节出问题都可能导致日志丢失。因此需要有一个日志完整性校验的机制来判断日志的采集情况。通常我们比较关心两方面问题:
那如何计算日志有没有丢呢?精确完整性计算的核心原理:
机器ip是确定的,但是如何唯一标识日志文件呢?
文件名可能重复,因此需要文件名+文件inode(文件标识)。但是inode只在磁盘分区中唯一,因此需要修改为文件名+文件inode(文件标识)+dev(磁盘标识)。但是inode存在复用的情况,如果文件被采集完后被删除了,inode被复用给一个同名的文件,这样就变相的造成重复,因此我们需要增加文件内容的前n个字符编码。最终的计算维度为:机器ip+文件名称+inode+dev+{fistNBytes}。
之所以用小计批任务计算,主要有两个原因:
- 日志的完整性计算不需要太实时,因为采集的日志可能因为种种原因而迟到,实时计算的话很可能会存在太多的数据丢失的情况。而且计算的量级非常大,不适合实时计算。
- 另一面,不使用更大的时间间隔(例如T+1)计算的原因是,通常日志都会配置轮转和清理。如果间隔过大,计算出有丢失的日志可能因为轮转和清理被删除了,那就失去了补数据的机会。
计算需要的所有metric都附带在loggie采集的的日志元数据中。
成果: 简单易用的平台化展示与补数据。
我们计算了日志在整个链路环节中的延迟情况,重点日志还会根据延迟情况及时的报警:
端到端的延迟计算意义:
由于日志采集后,可能被后续的业务监控报警以及大数据数仓处理分析计算应用,因此日志的质量变得愈发重要。那如何衡量日志质量呢?本质上,日志从非结构化数据被采集后经过一系列处理计算变成了结构化数据,因此我们在日志结构化的过程中定义了日志质量分的计算:
效果:
日志质量治理的意义:
基于采集的日志数据我们做2个重量级的应用,使得日志的重要程度上升了一个维度,让日志真正拥有强烈的业务含义。
考虑以下需求:
通常实现这些需求需要不小的开发周期,但是基于业务实时监控,只需要花5-10分钟的时间在平台上配置即可展示与报警:
核心原理:
成果:
大大降低了业务服务对关键业务过程的监控报警的开发成本,通过配置即可拥有业务实时监控报警的能力。
当前微服务盛行,用户的一个操作可能涉及底下多个微服务调用,考虑以下问题:
业务全链路监控应运而生:
以交易链路为例,从首页->搜索&推荐->商详->加购->下单->支付这个主链路以及辐射出来的几条支链路,整体的流量是怎么样的?调用qps是怎么样的?平均rt是什么样的?错误情况如何?通过业务全链路监控一目了然。
核心实现原理:
业务全链路实时监控的意义非凡,使得我们能够站在更高的维度,以全局视角审视整个业务流程下的服务调用情况,及时发现链路中的薄弱环节以及异常情况,帮助我们优化服务依赖,提升服务稳定性。
严选基于loggie的日志平台化建设,我们一方面在满足基于日志的问题分析诊断这一基础需求之余,进一步了提升日志质量、问题排查效率、全链路可观测可运维能力。另一方面,我们扩展能力与丰富应用场景,只需要简单配置就使得日志拥有强烈的业务含义与监控语义,使得我们能够站在更高的维度审视&监控业务链路中的异常,提前发现链路服务与资源问题。
想了解更多关于开源的内容,请访问:
开源基础软件社区
https://ost.
文章标题:新一代创新互联日志架构 - Loggie的设计与实践
本文URL:http://www.shufengxianlan.com/qtweb/news8/321108.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联