网易云原生日志平台的架构演进与实践

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. 网易云原生日志平台的架构演进与实践 傅轶 | 网易
2. 01 02 03 云原生最初的探索 Operator化的日志采集 进入深水区 大规模场景下的困境与挑战 新的征程 开源Loggie的现在与未来
3. 1. 云原生最初的探索 Operator化的日志采集
4. 混乱与秩序 ➤ 混乱的主机时代 ➤ 上云/云原生化 云原生的日志是什么样❓ • 采集Agent: Filebeat/Logstash/Flume/Rsyslo • 中转:Kafka/Logstash/Flin • 存储:Elasticsearc • 配置下发:手动/各种配置中心 公司内基于轻舟的容器化、云原生化进程 不同部⻔日志选型、架构各异
5. Kubernetes下的日志采集难题 ➤ 和主机日志的差异 动态迁移 Pod会主动或者被动的迁移, 频繁的销毁、创建 无法人为下发日志采集配置 日志存储多样性 容器的日志存储与表现方式有 很多不同的类型 例如stdout、hostPath、 emptyDir、pv等 Kubernetes元信息 查询日志时,需要根据 namespace、pod、container、 node,甚至包括容器的环境变 量、label等维度来检索、过滤
6. 容器日志采集常⻅思路 ➤ 只采集标准输出 • 挂载stdout路径、path通配 • 一些Agent实现了watch Kubernetes,注入 Namespace/Pod等元信息 符合云原生12要素,但是不适合复杂业务,难以推广
7. 容器日志采集常⻅思路 ➤ Agent日志路径全局挂载 • emptyDi • hostPath (K8s1.15以上可使 用subPathExpr路径隔离 • pv 无Kubernetes元信息注入 无法针对服务级别单独配置
8. 容器日志采集常⻅思路 ➤ Sidecar方式 • 每个业务Pod增加一个日志采集 Agent sideca • 挂载相同的empty/hostPath. • Agent挂载配置文件configMap 侵入性较强;资源占用较多 • eg: 增加一个sidecar将业务日志文件转换成自身容器的stdout,采集stdout日志 ➤ 其他
9. 轻舟日志服务v1.0 ➤ Sidecar方式和DaemonSet选择 资源占用 侵入性 稳定性 隔离性 性能 DaemonSet 每个节点一个,较小 基本无侵入 不影响业务Pod 节点日志都由同一个 Agent采集,较差 节点日志量大时可能出 现瓶颈 Sidecar 每个Pod一个,较大 Pod部署侵入 Agent OOM等会影响业务Pod; Agent只采集所在Pod 只采集所在Pod,出现 数量多影响下游组件 日志,较好 瓶颈概率较小 Tips 优先使用DaemonSet的方式采集日志,如果某个服务日志量特别大, 可以单独使用Sidecar的方式采集日志
10. 轻舟日志服务v1.0 ➤ 适配云原生的核心架构设计 自研Ripple + 开源日志采集Agent Filebeat 解决了开源Agent在Kubernetes环境下的 不足: • 基于CRD日志配置指定Pod • 自动感知Pod生命周期 • 自动添加服务元信息 • 支持采集日志盘hostPath/emptyDir/ Pv/docker rootfs
11. 轻舟日志服务v1.0 ➤ 在严选 ➤ 被集团绝大多数部⻔使用 …
12. 2. 进入深水区 大规模场景下的困境与挑战
13. 进入深水区,远比表面复杂 采集 查询 人肉运维越来越多 冰山一⻆ ETL 超大规模 客户场景复杂 排障痛苦 功能开发难以扩展 性能不足 稳定性 难以支撑更大规模
14. Filebeat单个队列问题 ➤ 在严选的隐患:隔离性不足 问题 Flume中转机一个队列发生堵塞,会导致某节点发送到 该中转机的Filebeat全部发送日志失败 尝试 将Filebeat改造成多队列,试图增强隔离机制 隐患 Filebeat先天架构的不足,引入很多workaround的改动, 导致代码不便维护,存在oom等隐患
15. Filebeat只支持一个Output ➤ 扩展受限 需求 客户需要发送日志到两个Kafka集群,存储不同类型的日志 避免单个Kafka集群的性能瓶颈 ❓ 临时方案 Filebeat只支持单个output,只能一个节点部署多个Agent 后果 引入大量运维维护成本,资源占用增多,水平扩展麻烦
16. Filebeat不适合做中转机 • • • • 中转 聚合 解析 切分 … ➤ 目前方案 B. Flink A. Logstash Logstash性能较弱 ● 语言栈不统一,引入另外服务,增加维护成本 ● 手动配置 ● 大部分场景只需要简单的日志切分 ● 要求有配套的运维、监控、排障能力 ● 依赖流式处理平台 ●
17. 可观测性/稳定性不足 排障痛苦 • 日志为什么没有采集? • 日志采集查询有延迟 • 日志为什么丢了? metrics不足 ❓ 指标割裂,和服务无关联 • 快速增⻓的日志占据满了磁盘 无Prometheus格式 … 突发预警不够
18. 可观测性/稳定性不足 ➤ 举例:幽灵文件 现象 传媒线上集群节点磁盘使用率一直在增⻓,90%+报 警,但是文件实际占用不多 原因 日志滚动会删除文件,但是由于下游Kafka吞吐不够,导 致Filebeat继续保持文件句柄fd,发送日志文件,确保日 志文件不丢失; 但被删除的文件仍然占据了磁盘空间; 反思 没有日志输入指标 ● 没有发送延迟指标 ● 没有堆积指标 … ● Filebeat核心监控指标不够,影响稳定性
19. 性能不够 问题 网关节点单台审计日志量大,Filebeat无法及时发 送,导致消费端无法实时处理和展示数据 尝试优化 配置调优,换独立SSD Kafka集群, 仍然无法超过80MB/ 如果配置发送数据压缩,会导致CPU 1000%+
20. 其他的开源项目能否解决这些问题? ➤ 对比 基于Golang, 资源占用较 小,性能优 异,语言栈匹 配 基于JRuby, 比较消耗资 源,性能较差 基于Java,比 较消耗资源, 性能一般 基于Ruby, 性能一般 技术语言栈:部分性能差,部分开发效率低 ● 容器化场景支持:部分不支持,部分只支持容器标准输出 ● 完整日志解决方案:均未提供 ● 基于C,资源 占用小,性能 好,开发效率 低
21. 3. 新的征程 开源Loggie的现在和未来
22. 自研新版Agent 基于Golang的轻量级、高性能、云原生日志采集、聚合Agent,支持多Pipeline和组件热插拔
23. 核心概念 • Source:输入源,一个Pipeline可以有多个不同的输入源 • Sink:输出源,一个Pipeline仅能配置一种类型的输入源,但是可以有多个并行实例 • Interceptor:拦截器,数据流经过多个Interceptor被链式处理 • Queue:队列,目前有内存队列 • Pipeline:管道,sources/interceptors/queue/sink共同组成了一个Pipeline,不同的Pipeline数据隔离 • Discovery:配置下发,目前支持Kubernete • Monitor EventBus:各组件监控数据的暴露或发送 • Reloader:配置的动态更新
24. 特性 一栈式日志解决方案 可插拔组件,可扩展性大大增强,可同 时支持日志中转、过滤、解析、切分、 日志报警等 生产级特性 吸收了我们⻓期的大规模运维经验,形成 了全方位的可观测性、快速排障、异常预 警、自动化运维能力 云原生的日志形态 快速便捷的容器日志采集方式,原生 的Kubernetes动态配置下发 资源与性能 基于Golang,较小的资源占用,优异 的吞吐性能,较高的开发效率
25. ➤ 中转、聚合、解析、处理 01 ➤ 日志报警 一栈式日志解决方案 ➤ 快速研发 不仅仅是日志采集 优异的可扩展性 ➤ 更多扩展
26. 中转、聚合、解析、处理 ➤ 基于各类Interceptor 流处理/SQL/Function 解析、切分 分流、聚合、转存 • 统一技术栈,无需引入Flume或者 Logstash等第三方中转,便于维护 • CRD里写解析规则等,实时生效, 自动reload,易于使用
27. 日志报警 ➤ 之前 ➤ 现在 使用logAlert Interceptor即可 基于ElastAlert 使用ElastAlert轮询Elasticsearch (存在配置下发、告警接入、自 身高可用等问题) ● 基于采集链路 ● 单独部署,使用Elasticsearch Source 基于Flink 在Flink里解析关键字或者正则 匹配(存在重量级、依赖配套的 运维、监控报警、排障等问题)
28. 快速研发 ➤ 微内核,插件化,组件化 • 所有插件均抽象为component,通过实现生命 周期接口,可快速开发一个sink/source/ interceptor/discovery Everything is component
29. 更多扩展 ➤ 采集K8s Event ● 组件复用(缓存、性能、重拾、 配置等等) ➤ 定时冷备 ● 只需研发特定场景的功能组件 ● 效率提升/可扩展性强
30. 02 ➤ 基于CRD的使用方式 ➤ Kubernetes下多架构支持 云原生的日志形态
31. 基于CRD的使用方式 只需create/update CRD实例即可: • 采集指定Pods/Node节点/集群日志 • 日志流如何中转、聚合 • 转发到哪些下游 • 解析处理日志 • 限流/日志报警检测 … 部署一键化 配置自动化 动态reload
32. Kubernetes下多架构支持 • 多形态: • Agen • Aggregato • 多架构: • 直接发送 • 中转、处理 • 多输出端
33. 03 生产级特性 ➤ 完善的监控指标 ➤ 解决大规模场景下的痛点
34. 完善的监控指标 根据⻓期运维、排障需求归纳提炼 ● ● 完善的指标 ● 采集进度 ● ⻓期采集未完成 ● 采集发送延迟 ● Fd情况 ● 输出Qp ● 服务级别指标 多种暴露方式 ● 原生Prometheus格式 ● Rest AP ● 可发送Kafk ● 日志输出
35. 解决大规模场景下的痛点 吸收大规模生产实践总结的经验教训,完善功能 ➤ 稳定性 ➤ 运维排障 ● 独立Pipeline增强服务隔离性 ● 检测⻓时间未采集完成的日志文件 ● 采集Qps限制 ● 各类参数均支持全局默认配置 ● 可配置定时清理日志 ● 无采集情况的日志查询、下载 ● 检测突发增⻓的日志文件 ● 提供常⻅排障运维接口 ● 合理的Fd保留机制 … …
36. 04 ➤ 基准测试 ➤ 性能对比 资源与性能
37. 基准测试 ➤ Filebeat ● ➤ Loggie 865% 217% 73.3MB/s 120MB/s 同等情况下,发送至Kafka(单行、单文件、相同发送并发度、无解析场景)
38. 性能对比 ● Loggie和Filebeat消耗的CPU相比,大概仅为后者 的1/4,同时发送吞吐量为后者的1.6~2.6倍 ● Filebeat的极限吞吐量存在瓶颈,80MB/s后很难 提升,而Loggie的极限值更高,多文件采集下甚 至达到了200MB/s+
39. 开源计划 12月份正式开源 敬请期待
40. RoadMap&Doing ● ● 更多组件与功能扩展 ● Source: htt ● Sink: file, clickhouse, pulsar, influxdb等 ● 持久化Queu ● 轻量级的流处理能力 ● WASM形态支持自定义日志解析处理 ● 支持接入Knative/KEDA等Serverless形态扩缩容指标 服务发现与配置中心 ● 云原生与Kubernete ● 主机模式的配置下发:支持Consul, Apollo等 ● 自动注入Loggie sidecar形态支持 ● Opentelemetry兼容与支持 参与贡献 共同建设
41.

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-16 00:23
浙ICP备14020137号-1 $Map of visitor$