作者:刘卯银|火山引擎日志体系架构

本文整理自火山引擎开发者社区 Meetup 第八期讲演,首要介绍了火山引擎 TLS 日志服务的架构完成、规划优化以及实践事例。

谈到日志体系,首要要从日志说起,日志在 IT 体系里无处不在,也是 IT体系大数据的要害来源。日志的品种和款式十分多,以在线教育体系为例,日志包含客户端日志、服务端日志。服务端日志又包含事务的运行/运维日志以及事务运用的云产品产生的日志。要办理诸多类型的日志,就需求一套一致的日志体系,对日志进行收集、加工、存储、查询、剖析、可视化、告警以及消费投递,将日志的生命周期进行闭环。

Kubernetes 下日志收集的开源自建计划

开源自建

火山引擎前期为了快速上线事务,各团队基于开源项目树立了自己的日志体系,以满意根本的日志查询需求,例如运用典型的开源日志渠道 Filebeat+Logstash+ES+Kibana 的计划。

但是在运用过程中,咱们发现了开源日志体系的缺乏:

  • 各事务模块自己树立日志体系,形成重复建设。
  • 以 ES 为中心的日志架构能够运用 ES 查询便利的优势,但是资源开支大、本钱高。并且 ES 与 Kibana 在界面上强绑定,不利于功用扩展。
  • 开源计划一般选用单机 yaml 做收集装备,当节点数很多的时候,装备十分繁琐。
  • 开源体系的收集装备难以办理,数据源也比较单一。

云原生环境下的日志采集、存储、分析实践

Kubernetes 下的日志收集

Kubernetes 下怎么收集日志呢? 官方推荐了四种日志收集计划:

  • DaemonSet:在每台宿主机上树立一个 DaemonSet 容器来布置 Agent。事务容器将容器规范输出存储到宿主机上的文件,Agent 收集对应宿主机上的文件。
  • Streaming Sidecar:有一些事务体系的日志不是规范输出,而是文件输出。Streaming Sidecar 的方法能够把这些文件输出经过 Sidecar 容器转换成容器的规范输出,然后收集。
  • Sidecar Logging Agent:事务 Pod 内单独布置 Agent 的 Sidecar 容器。这种方法的资源阻隔性强。
  • API/SDK:直接在容器内运用 API 或 SDK 接口将日志收集到后端

以上前三种收集计划都只支撑收集容器的规范输出,第四种计划需求改造事务代码,这几种方法对收集容器文件都不友好。但用户关于日志文件有分类的需求,规范输出将一切日志混在一同,不利于用户进行分类。假如用户要把一切日志都转到规范输出上,还需求开发或许装备,难以推广。因而 Kubernetes 官方推荐的计划无法彻底满意用户需求,给咱们的实际运用带来了很多不方便。

自建日志收集体系的困境与挑战

云原生场景下日志品种多、数量多、动态非永久,开源体系在收集云原生日志时面对诸多困难,首要包含以下问题:

一、收集难

  • 装备杂乱 体系规划越来越大,节点数越来越多,每个节点的装备都不一样,手工装备很简单犯错,体系的变更变得十分困难。
  • 需求不满意 开源体系无法彻底满意实际场景的用户需求,例如不具备多行日志收集、完好正则匹配、过滤、时间解析等功用,容器文件的收集也比较困难。
  • 运维难度高 大规划场景下大量 Agent 的晋级是个挑战,体系无法实时监控 Agent 的状态,当Agent 状态反常时也没有毛病告警。

二、 产品化才能缺乏

  • 可用性低: 由于缺少流控,突发的事务简单使后端体系过载,事务之间简单相互影响。
  • 资源运用功率低 假如装备的资源是固定的,在突发场景下简单形成功用缺乏的问题;但假如装备的资源过多,普通场景下资源运用率就会很低;不同的组件装备不均衡还会导致功用瓶颈浪费资源。ES 的原始数据和索引运用相同的资源装备,也会导致高本钱。
  • 功用缺乏 比如 ES 的投递和消费才能弱、剖析才能固化、没有告警才能、可视化才能有限。

火山引擎一致日志渠道 TLS

在遇到这些问题今后,咱们研发了一套一致的日志办理渠道——火山引擎日志服务(Tinder Log Service,简称为 TLS)。TLS 的整体架构如下:

云原生环境下的日志采集、存储、分析实践

面对各种日志源,TLS 经过自研的 LogCollector/SDK/API,可支撑专有协议、 OpenTelemetry 和 Kafka 协议上传日志。支撑多品种型的终端、多种开发语言以及开源生态规范协议。

收集到的日志首要会存入高速缓冲集群,削峰填谷,随后日志会匀速流入存储集群,依据用户装备再流转到数据加工集群进行日志加工,或许到索引集群树立索引。 树立索引后用户能够进行实时查询和剖析。TLS 供给规范的 Lucene 查询语法、SQL 92 剖析语法、可视化仪表盘以及丰厚的监控告警才能。

当日志存储达到一定周期,不再需求实时剖析之后,用户能够把日志投递到本钱更低的火山引擎目标存储服务中,或许经过 Kafka 协议投递到其他云产品。假如用户有更高阶的剖析需求,TLS 也支撑把日志消费到实时核算、流式核算或离线核算进行更深化的剖析。

TLS 的体系规划遵从高可用、高功用、分层规划的准则。

  • 高可用:经过存算别离,一切服务都是无状态的,毛病快速恢复。
  • 高功用:一切集群都可横向扩展,没有热门。
  • 分层规划:各模块之间低耦合,模块之间定义规范接口,组件可替换。

以上便是火山引擎自研的日志存储渠道 TLS 的体系架构,下面将详细介绍 TLS 相较于开源体系做的优化。

体系优化

中心化白屏化的装备办理

当日志体系中收集 Agent 数量较多时,不再合适在每台机器上手工装备,因而咱们开发了中心化、白屏化的装备办理功用,支撑动态下发收集装备,并支撑检查 Agent 运行状态监控、支撑客户端主动晋级。

中心化装备的完成流程如下:

  1. 客户端主动向服务端建议心跳,携带本身版别信息;
  1. 服务端收到心跳,检查版别;
  1. 服务端判断是否需求下发装备信息给客户端;
  1. 客户端收到装备信息,热加载到本地装备,以新的装备进行收集。

云原生环境下的日志采集、存储、分析实践

中心化装备办理的优势在于:

  • 牢靠:中心化办理,装备不丢失,白屏化装备不简单犯错。
  • 高效:各种环境下一切的装备都是一致处理,不管 LogCollector 布置在移动端、容器还是物理机上,用户都能够在服务端相同的界面上装备,装备以机器组为单位批量下发,快速高效。
  • 轻松运维:用户能够在服务端检查客户端的运行状态,对客户端的反常宣布告警。经过中心化装备,TLS 能够向客户端推送最新版别,主动晋级。

CRD 云原生装备方法

中心化、白屏化的装备方法是合适运维人员的装备方法。在开发测试主动化的场景下,最优的方法是 CRD。传统的方法经过 API 接口去做收集装备,用户一般需求写数千行代码来完成。TLS 供给了云原生 CRD 的方法来进行装备,用户只需求在 yaml 文件里装备要收集的容器、容器内的日志途径以及收集规矩即可完成收集装备。由于不再需求编写代码,CRD 方法大幅提高了日志接入功率。

云原生环境下的日志采集、存储、分析实践

CRD 的装备流程如下:

  1. 运用 Kubectl 指令创立 TLS LogConfig CRD;
  1. TLS Controller 监听到 CRD 装备更新;
  1. TLS Controller 依据 CRD 装备向 TLS Server 发送指令,创立 topic、创立机器组,创立日志收集装备;
  1. LogCollector 定时请求 TLS Server,获取新的收集装备并进行热加载;
  1. LogCollector 依据收集装备收集各个容器上的规范输出或文本日志;
  1. LogCollector 将收集到的日志发送给 TLS Server。

合适大规划、多租户场景的客户端

云原生环境下的日志采集、存储、分析实践

开源日志收集客户端一般只支撑一个 Output,多个 Input 选用相同的 Pipeline,相互影响。为了适应大规划、多租户场景,火山引擎自研了日志收集的客户端 LogCollector。LogCollector 对不同的 Input 选用不同的 Pipeline 做资源阻隔,减少多租户之间的相互影响。一个 LogCollector 支撑多个 Output,能够依据不同的 Output 单独做租户鉴权。一起咱们还在 LogCollector 内完成了自适应反压机制,假如服务端繁忙,LogCollector 会主动推迟退避,服务端空闲时再发送,减少算力担负。

产品优化

可用性提高

云原生环境下的日志采集、存储、分析实践

在可用性方面,TLS 支撑多级全局流控,能根绝因事务突发导致的毛病分散问题。

  • 在日志收集到高速缓冲集群时,依照用户的 Shard 数操控写入高速缓冲区的流量
  • 当数据从高速缓冲区流向存储集群时,按存储集群操控单个存储集群的流量。
  • 从存储集群到索引集群,按索引集群操控单个索引集群的写入流控以及查询剖析并发数。

功率提高

索引和原始数据别离

云原生环境下的日志采集、存储、分析实践

ES 的索引和数据存在一同,咱们在规划过程发现索引和原始数据别离会更优,首要表现在:

  • 提高数据流动性:存储集群支撑批量消费接口,消费数据不经过索引集群。相关于从索引集群先查询后消费的形式,直接从存储集群消费功用更高,有用提高数据流动性。
  • 下降本钱:索引和存储能够选用不同本钱的存储,整体的存储本钱就会下降。用户能够随时按需创立索引,进一步下降索引本钱。
  • 提高可用性:索引能够异步创立,流量突发时创立索引慢不会影响存储写入速率。

索引办理和调度

云原生环境下的日志采集、存储、分析实践

索引的流量是不行预测的,因而咱们在功率方面的另一个优化是支撑索引的办理和调度,完成弹性伸缩,然后提高可用性,处理规划问题。咱们的处理计划是在多个索引集群之间做数据流动,基于负载、资源、容量主动搬迁索引,支撑动态跨集群在线搬迁索引,平衡索引集群负载。

功用优化

  • 消费投递:在消费投递方面咱们支撑了丰厚的消费投递接口,包含:

    • 消费者
    • 消费组
    • Kafka 协议:经过 Kafka 协议进行规范协议的消费;
    • S3 协议:支撑经过 S3 目标存储的协议把日志投递到目标存储。

云原生环境下的日志采集、存储、分析实践

  • 查询剖析:支撑先查询过滤后剖析,减少剖析数据量提高功用。剖析支撑规范的 SQL 92,剖析结果支撑图表可视化。
  • 日志告警:经过实时监控日志,基于用户装备的监控规矩组合以及告警触发条件,满意条件就能够经过短信、邮件、飞书等方法发送告警给用户或用户组。
  • 可视化仪表盘:TLS 供给多种可视化仪表盘,完成实时监测,且仪表盘能够关联告警。

TLS 实践事例

接下来为大家介绍两个 TLS 的典型事例。

火山引擎内部事务及运维日志收集

TLS 目前支撑了火山引擎全国多个 Region 运维日志的收集剖析。日志类型包含事务的文件日志、容器规范输出。事务别离布置在内网、外网以及混合云,日志都经过 TLS 渠道一致做收集和剖析。

相较于前期各事务模块自己树立日志体系,选用 TLS 获得了如下收益:

  • 经济高效:资源运用率由之前的 20% 提高到现在的 80%,大幅下降资源本钱;
  • 可用性较高:多级流控加缓存,抗突发才能强,即便在索引体系毛病的时候也不会影响原始数据的流量;
  • 轻松运维:TLS 的一致运维提高了运维人员的才能,少量运维人员即可完成整个体系的运维。
  • 快速接入:TLS 能够在一小时内完成一个新事务的收集、查询、剖析、消费的快速接入。

某教育职业头部客户日志收集

该客户的体系事务首要收集的日志包含:

  • 文件日志
  • App 日志
  • Kubernetes 集群后端事务的日志
  • 用户行为日志

TLS 把这几个渠道的日志一致收集到云端,进行实时查询剖析以及进行告警。客户自建有大数据剖析渠道,TLS 可将日志数据经过消费的方法流转到该渠道进行在线、离线等更高阶的大数据剖析。关于时间长的历史数据,则投递到目标存储进行归档,然后下降整个体系的本钱。

用户的办理员可在 TLS 上一致检查一切渠道的各种日志,整个体系的建设和运维本钱也下降了。TLS 运用规范接口,能够兼容云上自建的剖析渠道,用户在快速上线的一起也能确保体系的高度兼容。

未来展望

未来,TLS 渠道会不断进行更深层次的优化:

  • 云产品的一键日志收集
  • 搜索引擎的深度优化
  • 数据清洗和加工的函数式接口
  • 集成更多第三方渠道,火山引擎云产品深度融合

火山引擎 TLS 日志服务将在5月初正式 GA,感兴趣的小伙伴能够在火山引擎开发者社区大众号后台回复要害字【TLS】重视试用。

Q&A:

Q:中心化装备,各个事务的日志收集装备是 OP 担任还是 RD 担任?
A:日志收集的中心化装备是 Web 方法,装备十分简单,不管是 RD 或是 OP 担任都能够。火山引擎上 Web 装备由 OP 来担任,容器主动化收集是用 CRD 的方法,一般是 RD 担任。

Q:收集端 Agent 的运用资源能够约束吗?是否会影响事务的资源运用?
A:CPU 占用量、内存占用量这些是能够装备的,不会影响事务的资源运用。

Q:CRD 和中心化装备不会冲突吗?
A:一般情况下不会冲突。CRD 有特定的命名规矩,只要 Web 装备和 CRD 装备的姓名不冲突就不会报错。假如姓名冲突,装备会失败,改姓名后重试即可。

Q:Node 节点宕机是否会丢日志?
A:不会。LogCollector 有 Checkpoint,Checkpoint 会定时更新。假如节点宕机没有更新 Checkpoint,日志会从上次 Checkpoint 点从头收集,所以是不会丢的。

Q:日志收集的推迟情况怎么?
A:一般在秒级推迟,后端事务忙的时候可能是几秒到十几秒的推迟。

Q:Kafka 协议是怎么暴露的?经过完成 Kafka Server 吗?
A:咱们是在服务端完成的 Kafka 协议。用户以 Kafka 的协议方法接入,鉴权也是以 Kafka 的鉴权协议来做的。用户看到的其实便是一个 Kafka。这样能够对用户做到透明。