整套解决方案:基于Golang的云原生日志采集服务设计与实践

优采云 发布时间: 2022-10-08 15:17

  整套解决方案:基于Golang的云原生日志采集服务设计与实践

  架构师(JiaGouX)我们都是架构师!<br />架构未来,你来不来?<p style="margin-right: auto;margin-left: auto;max-width: 100%;box-sizing: border-box;min-height: 1em;width: 0px;height: 10px;border-top: 0.6em solid rgb(255, 100, 80);border-bottom-color: rgb(255, 100, 80);overflow-wrap: break-word !important;border-right: 0.7em solid transparent !important;border-left: 0.7em solid transparent !important;"><br />

  <br /></p>

  1. 背景

  云原生技术的浪潮已经到来,技术变革迫在眉睫。

  在这一技术趋势下,网易推出了青州微服务云平台,集微服务、Servicemesh、容器云、DevOps等于一体,在公司集团内部得到广泛应用,也支持众多外部客户的云原生转型。和迁移。

  其中,日志是很容易被忽视的部分,但却是微服务和DevOps的重要组成部分。没有日志,就无法解决服务问题。同时,日志采集的统一也是很多业务数据分析、处理、审计的基础。

  但是在云原生容器化环境中,采集 的日志有点不同。

  2、容器日志的痛点采集传统的host模式

  对于部署在传统物理机或虚拟机上的服务,日志采集工作清晰明了。

  业务日志直接输出到主机,服务运行在固定节点上。手动或使用自动化工具,在节点上部署日志采集代理,添加代理配置,然后启动采集日志。同时,为了方便后续的日志配置修改,也可以引入配置中心,发布代理配置。

  Kubernetes 环境

  在 Kubernetes 环境中,情况并非如此简单。

  一个 Kubernetes 节点上运行着很多不同服务的容器,容器的日志存储方式也有很多种,例如 stdout、hostPath、emptyDir、pv 等。由于频繁的主动或被动迁移,频繁的销毁和在 Kubernetes 集群中创建 Pod,我们不能像传统方式那样手动向每个服务发出 log采集 配置。另外,由于日志数据会集中存储在采集之后,所以根据namespace、pod、container、node等维度,甚至是环境变量和标签等维度对日志进行检索和过滤是非常重要的。容器。

  以上都不同于传统log采集配置方式的需求和痛点。究其原因,传统方式与Kubernetes脱节,无法感知Kubernetes,无法与Kubernetes集成。

  随着近年来的快速发展,Kubernetes 已经成为容器编排的事实标准,甚至可以被视为新一代的分布式操作系统。在这个新的操作系统中,控制器的设计思想驱动着整个系统的运行。控制器的抽象解释如下图所示:

  由于 Kubernetes 良好的可扩展性,Kubernetes 设计了自定义资源 CRD 的概念。用户可以自己定义各种资源,在一些框架的帮助下开发控制器,用控制器把我们的期望变成现实。

  基于这个思路,对于日志采集,记录一个服务需要采集,需要什么样的日志配置,是用户的期望,而这一切都需要我们开发一个日志采集 的控制器来实现。

  3. 探索与建筑设计

  有了上面的方案,除了开发一个控制器,剩下的就是围绕这个思路做一些选型分析了。

  记录采集代理选择

  log采集controller只负责连接Kubernetes和生成采集配置,不负责真正的log采集。目前市面上有很多log采集代理,比如传统ELK技术栈的Logstash、CNCF*敏*感*词*项目Fluentd、最近上线的Loki、beats系列的Filebeat等。下面进行简要分析。

  代理集成

  对于log采集agent,在Kubernetes环境中一般有两种部署方式。

  一种 sidecar 方法,即与业务容器部署在同一个 Pod 中。这样Filebeat只需要采集业务容器的日志,只需要配置容器的日志配置,简单隔离。很好,但是最大的问题是每个服务必须有一个Filebeat才能去采集,通常一个节点上的Pod很多,加起来内存等开销并不乐观。

  另一种也是最常见的方法是在每个节点上部署一个 Filebeat 容器。相比之下,内存占用一般要小很多,而且对 Pod 没有侵入性,更符合我们平时的使用习惯。

  同时普遍采用Kubernetes的DaemonSet部署,省去了Ansible等传统自动化运维工具,部署和运维效率大幅提升。

  

  所以我们优先使用 Daemonset 来部署 Filebeat。

  整体结构

  选择Filebeat作为日志采集代理,集成自研日志控制器后,从节点的角度来看,我们看到的架构如下:

  日志平台下发特定的 CRD 实例到 Kubernetes 集群,日志控制器 Ripple 负责 List&amp;Watch Pods 和来自 Kubernetes 的 CRD 实例。

  通过Ripple的过滤和聚合,最终生成一个Filebeat输入配置文件。配置文件描述了服务的采集Path路径、多行日志匹配等配置,还默认配置了PodName、Hostname等到日志。在元信息中。

  Filebeat 会根据 Ripple 生成的配置自动重新加载并采集 登录节点,并发送到 Kafka 或 Elasticsearch。

  由于 Ripple *敏*感*词* Kubernetes 事件,它可以感知 Pod 的生命周期。无论 Pod 被销毁还是调度到任何节点,它仍然可以自动生成相应的 Filebeat 配置,无需人工干预。

  Ripple 可以感知 Pod 挂载的日志卷。无论是docker Stdout的日志,还是HostPath、EmptyDir、Pv存储的日志,都可以在节点上生成日志路径,告诉Filebeat去采集。

  Ripple 可以同时获取 CRD 和 Pod 信息,所以除了默认在日志配置中添加 PodName 等元信息外,还可以结合容器环境变量、Pod 标签、Pod Annotation 等对日志进行标记,以方便后续的日志过滤、检索和查询。另外,我们在Ripple中加入了定期清理日志等功能,保证日志不丢失,进一步增强了日志采集的功能和稳定性。

  4.基于Filebeat的实用功能扩展

  总的来说,Filebeat 可以满足大部分 log采集 的需求,但是还是有一些特殊的场景需要我们自定义 Filebeat。当然,Filebeat 本身的设计也提供了很好的扩展性。Filebeat目前只提供了elasticsearch、Kafka、logstash等几种类型的输出客户端,如果我们想让Filebeat直接发送到其他后端,需要自定义自己的输出。同样,如果您需要过滤日志或添加元信息,您也可以制作自己的处理器插件。不管是加输出还是写处理器,Filebeat提供的大体思路基本一致。一般来说,有3种方式:

  直接fork Filebeat,在已有源码上开发。

  无论是输出还是处理器都提供了类似Run、Stop等接口,你只需要实现这类接口,然后在init方法中注册对应的插件初始化方法即可。

  当然,由于Golang中的init方法是在导入包的时候调用的,所以需要在初始化Filebeat的代码中手动导入。

  复制一份Filebeat的main.go,导入我们自研的插件库,重新编译。

  本质上,它与方法1没有太大区别。

  Filebeat 还提供了基于 Golang 插件的插件机制。需要将自研插件编译成.so共享链接库,然后在Filebeat启动参数中通过-plugin指定库的路径。

  然而,事实上,一方面,Golang 插件还不够成熟和稳定。另一方面,自研插件仍然需要依赖同版本的libbeat库,也需要用同版本的Golang编译。可能坑比较多,不推荐。

  如果想了解更多关于 Filebeat 的设计,可以参考我们的文章文章。

  ()

  为了支持各业务方的对接,我们扩展了grpc输出的开发,支持多个Kafka集群的输出。

  立体监控

  但真正的难点在于,业务方实际使用后,出现采集无法登录、日志配置多行或采集二进制大文件导致Filebeat oom和其他问题随之而来。我们在 Filebeat 和日志采集 的综合监控上投入了更多的时间,例如:

  接入青州监控平台,包括磁盘io、网络流量传输、内存使用、cpu使用、pod事件告警等,保证基础监控的完善。

  新增日志平台数据全链路延迟监控。

  采集Filebeat自己的日志,通过自己的日志开始采集上报哪些日志文件,当采集结束时,避免每次ssh到各个节点查看日志配置和解决问题。

  自研Filebeat导出器,连接prometheus,采集报告自己的metrics数据。

  

  通过三维监控增强,极大的方便了我们的问题排查,降低了运维和人工成本,也保证了服务的稳定性。

  五、Golang的性能优化与调优

  从 Docker 到 Kubernetes,从 Istio 到 Knative,基于 Golang 的开源项目已经成为云原生生态的主力军。Golang 的简单性和效率不断吸引新项目将其用作开发语言。

  我们青州微服务平台除了使用Golang编写Filebeat插件和控制器开发日志采集外,还有很多基于Golang的组件。其中,我们踩过很多坑,积累了一些Golang优化经验。

  但是很多时候,我们看到了太多的GC原理、内存优化、性能优化,却往往在写完代码、完成一个项目后就无从下手。实践是检验真理的唯一标准。因此,通过自己检查和探索来提高姿势水平,找到关键问题是捷径。

  对于性能优化,Golang 为我们提供了三个键:

  这是一个简单的例子。

  以sync.Pool为例,sync.Pool一般用于保存和复用临时对象,减少内存分配,降低GC压力。应用场景很多。比如号称比Golang官方Http快10倍的FastHttp,就大量使用了sync.Pool。Filebeat 使用 sync.Pool 将批处理日志数据聚合成 Batch 并分批发送。在 Nginx-Ingress-controller 渲染生成 nginx 配置的时候,也要使用 sync.Pool 来优化渲染效率。我们的日志控制器 Ripple 还使用 sync.Pool 来优化渲染 Filebeat 配置时的性能。

  首先,使用 go benchmark 测试不使用 sync.Pool 时通过 go 模板渲染 Filebeat 配置的方法。

  您可以看到结果中显示的方法每次执行的时间,以及分配的内存。

  然后使用 go pprof 查看 go benchmark 生成的 profile 文件,观察整体性能数据。

  其实go pprof有很多数据供我们观察,这里只展示内存分配信息。可以看出,在基准测试期间总共申请了超过 5 GB 的内存。

  接下来,我们使用 go trace 查看压测过程中的 goroutine、堆内存、GC 等信息。

  这里只截取600ms到700ms的时间段。从图中可以清楚地看到,100ms 内发生了 170 次 GC。

  使用相同的方法和步骤,使用sync.Pool后测试结果。

  分配的内存总量减少到了160MB,同一时间段内的GC次数也减少到了5次,差距非常明显。

  总结与展望

  在云原生时代,日志作为可观察性的一部分,是我们排查问题和解决问题的基础,也是后续大数据分析处理的开始。

  在这个领域,虽然有很多开源项目,但仍然没有强大统一的log采集agent。或许这种绽放的景象会永远持续下去。因此,我们在自主研发的日志代理 Ripple 的设计中也提出了更多的抽象,保留了与其他日志采集代理接口的能力。未来,我们计划支持更多的日志采集代理,打造更丰富、更健壮的云原生日志采集系统。

  如果喜欢这篇文章,请点击右上角分享文章到你的朋友圈~~

  如果您有想要了解和学习的知识点或技术点,也可以留言给若飞安排分享

  ·结尾·

  解决方案:百度推出外链查询工具意味着什么?

  快速提升网站的销量,使用365webcall在线客服软件

  文:达世君的博客

  注:相关网站搭建技巧请移步网站搭建教程频道

  很多站长对百度快照非常紧张。他们认为快照越新越好。突然有一天,快照没有更新,甚至快照都被还原了。这是降级的前兆。我相信了一段时间。然而10月23日百度升级链接作弊算法后,李彦宏在百度站长平台上的公告却适得其反,让我感觉“变砖”了。《家》总是表达谬误,不管你信不信,反正我信!

  至于为什么百度快照时间会倒退,也就是百度快照回滚,Lee并没有给出明确的解释。他刚才说,对于一个重要的网页,搜索引擎会在数据库中保存多个快照。在一些非常特殊的情况下,搜索引擎系统可能会选择与当前搜索结果不同的快照版本,导致快照时间倒退。这对网站在搜索引擎中的性能没有影响,也不代表搜索引擎对网站的降级过程完成了,而是与是否存在有关网页上的重要更新

  此外,百度站长工具平台的另一个重要变化是增加了百度外链查询工具。检查 网站self 问题和 网站SEO 优化有很大帮助。百度推出的外链查询工具的作用是什么,我们所谓的站长应该如何使用这个外链查询工具呢?? 个人认为主要从以下几个方面使用:

  1、观察外链波动

  

  通过这个百度外链查询工具,我们可以清楚的看到,他计算出来的外链总数,和其他站长工具查询的外链和外链的数量是不一样的。当然,毫无疑问是百度自己的外部链接。工具查询比较准确,我们可以用它来观察网站外部链接的变化

  2、筛选和积累优质资源

  通过百度外链查询工具,可以查询到网站平台收录发布的外链,速度快,权重高。这些优质的网络资源是可以积累起来的。合理利用可以让后期的优化事半功倍。

  3. 提高外部链接的质量,检查链接是否自然

  1.相关性

  网站外链构建中使用的锚文本可以通过百度外链工具提取,可以查看网站的锚文本是否排列合理,是否相关到外链所在的页面,因为只有具有一定的相关性,才能在外链页面和网站登陆页面之间转移权重。同时也可以知道主关键词和长尾关键词的推广是否足够。

  2. 广泛

  建立外链时,不仅要强调外链的数量,还要考虑外链的广度;通过百度外链查询工具,可以查看所有外链是来自一个平台还是几个平台,如果来自一个平台的外链太多网站会导致百度怀疑网站 外部链接作弊

  

  3. 平衡

  检查网站的链接布局是否合理,链接平衡是否完美。所有外部链接不能只指向主页或单个页面。这种链接布局不利于网站外链的平衡,应合理安排网站登陆页,平衡链接点,让外链显得更自然

  4. 有效性

  就目前查询到的外链数据而言,虽然有些网页没有被百度收录列出,但是百度外链工具查询到的页面上设置的外链仍然被百度视为外链,可以从这些数据可以看出,只有百度外链工具找到的“直播链接”是有效的。也许这就是为什么论坛签名中没有锚文本的“死链接”没有效果。

  4.提升网站内容质量

  百度一直强调希望站长关注网站的内容建设。只有提升网站的内容价值和检索体验,才能获得用户和搜索引擎的信任。当然,除非外链不再是搜索引擎算法的参考因素,否则提升整体网站内容质量还有很长的路要走

  综上,我们可以看到百度外链工具的作用,通过对这些功能的分析,我们其实可以看出百度推出这个工具是为了方便站长认真网站内容,给用户和搜索引擎提供有价值的事情,恰逢百度一再强调希望站长专注于网站内容建设

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线