Vector 是一种高性能的可观察性数据管道,可让组织控制其可观察性数据。收集、转换并将所有日志、指标和跟踪路由到SRE团队想展示或者存储的任何地方。由于 Vector 用 Rust 编写,提供了内存安全和效率保证,使其在其他现有工具中独树一帜。Vector 引入了单元测试框架,可以更轻松地维护复杂的日志收集工具拓扑。属于一款新型开源产品,比所有替代方案快 10 倍(引用官方话语)。
据官方显示 《Vector》 每月下载数百万次,T-Mobile、Comcast、Zendesk 和 Discord 等公司依赖 Vector 来拥有他们的可观察性数据。
Events(事件)代表 Vector 中的单个数据单元。
流经 Vector 的各个数据单元称为事件。事件必须属于 Vector 定义的一种可观察性类型。
Vector 定义事件的子类型。这对于建立特定领域的要求以实现与现有监控和可观察性系统的互操作性是必要的。
日志事件可以理解为就是通常的key/value。
以下是日志事件的示例(作为 JSON)
{
"log": {
"custom": "field",
"host": "my.host.com",
"message": "Hello world",
"timestamp": "2020-11-01T21:15:47+00:00"
}
}
Vector 日志事件是时间点事件的结构化表示。 它包含一组描述事件的任意字段。 Vector 的一个关键原则是保持架构中立。 这确保了 Vector 可以使用任何模式,随着需求发展支持旧模式和未来模式。 Vector 不需要任何特定的字段,每个组件都会记录它提供的字段。
Options:
------可以无限嵌套的任意一组键/值对。
示例:
{
"custom": "field",
"host": "my.host.com",
"message": "Hello world",
"timestamp": "2020-11-01T21:15:47+00:00"
}
字段类型官方链接 https://vector.dev/docs/about/under-the-hood/architecture/data-model/log/#star
Vector度量事件表示对时间序列执行的数值运算。与其他工具不同的是,Vector中的指标被视为一等公民,与不同的指标服务可以直接进行交互,无需任何转换即可与各种指标服务互相交互操作。Vector采用的度量数据模型强调准确性和正确性,而不是严格固定度量类型。因此,Vector中可以包含各种度量类型,例如Prometheus和StatsD,以确保不同系统之间的度量数据可以进行正确的互操作。
官方链接 https://vector.dev/docs/about/under-the-hood/architecture/data-model/metric/
Why not just events?
据官方描述,他们很喜欢纯事件世界的想法,在这个世界中,每项服务都完美地配备了包含丰富数据和上下文的事件。但实际上,考虑到服务通常会发出质量参差不齐的日志和指标。通过设计 Vector 以满足它们所在的服务,我们充当通向更新标准的桥梁。这就是为什么我们将事件放在数据模型的顶部,而日志和指标是派生类别。
最后,考虑各种数据类型的复杂数据模型允许可观察性系统之间的正确互操作性。例如,如果没有正确的内部指标数据类型,则无法实现具有 statsd 源和 prometheus 接收器的管道。
可以将跟踪事件理解为一种特殊的日志事件。 在撰写本文时,支持跟踪事件的组件是:datadog_agent 源、datadog_traces 接收器以及示例和重新映射转换。
组件是源、转换和接收器的通用术语。 组件摄取、转换和路由事件。可以依赖这些创建拓扑。
目前Vector支持的组件类型列表:https://vector.dev/components/
可以理解为Vector从哪可以采集到数据?源的示例包括file、syslog、statsd和stdin。例如采集docker容器的日志信息等等。
https://vector.dev/docs/reference/configuration/sources/
转换负责在 Vector 传输时改变事件。这可能涉及解析、过滤、采样或聚合,其实跟Logstash组件类似,会借助于丰富的插件去实现。
https://vector.dev/docs/reference/configuration/transforms/
接收器是事件的目的地。 每个接收器的设计和传输方法由与其交互的下游服务决定。 例如,socket sink 用于流式传输单个事件,而 aws_s3 sink 用于缓冲和刷新数据。
https://vector.dev/docs/reference/configuration/sinks/
Vector 的管道模型基于有向无环图包含独立子图的组件。事件必须沿单一方向从源流向接收器,并且不能创建循环。图中的每个组件都可以产生零个或多个事件。
流水线模型
包括如何配置、更改、重新加载等,官方均有相关说明 https://vector.dev/docs/about/under-the-hood/architecture/pipeline-model/
接收器主要负责快速发送事件。 如果他们无法跟上,他们有一个可配置的缓冲区来保存事件,直到它们可以被发送。 默认情况下,Vector 使用内存缓冲区,但也可以使用磁盘缓冲区。 一旦缓冲区填满,行为是可配置的。
buffer.when_full = block #默认配置。当缓冲区填满时,背压将应用于图中的先前组件。
buffer.when_full = drop_newest #当缓冲区填满时,新事件将被丢弃。这不提供背压。
如何理解背压?
背压(Backpressure)是一种控制组件之间数据流速率的机制,它通过限制发送数据源的速率来保持数据消费者接收数据的速率。在一个数据流系统中,如果生产者(即数据源)产生数据的速度大于消费者(即数据接收方)的处理速度,那么未处理的数据将会在缓冲区内不断积累,最终导致系统崩溃。为避免这种情况,背压机制会在消费者缓慢处理数据时通过降低生产者数据生成速率的方式来平衡生产者和消费者之间的数据流量,从而保持整个系统的稳定性。上述所提到的背压作用,是指当缓冲区填满时,数据流系统通过背压机制对之前的组件进行限流,降低数据源的产生速率以协调整个数据流系统的各个组件处理速度,以避免引起系统崩溃。
Buffer配置链接 https://vector.dev/docs/reference/configuration/sinks/vector/#buffer
如果接收器的缓冲区填满并配置为提供背压,则该背压将传播到任何连接的转换,这也将传播到源。源试图将背压传播到任何提供数据的系统。确切的机制因来源而异。例如,HTTP 源可能会拒绝带有 HTTP 429 错误(太多请求)的请求,或者基于拉取的源(例如 Kafka)可能会减慢获取新事件的速度。
源发送事件的速度与配置为提供背压的最慢接收器一样快(buffer.when_full = block)
例如,如果在此配置中有一个源发送到 3 个接收器,则源将开始从接收器 2(500 个事件/秒)提供背压,因为这是配置为提供背压的最慢接收器。 接收器 1 将丢弃多达 250 个事件/秒,而接收器 3 将未得到充分利用。
接收器 1:可以以 250 个事件/秒的速度发送 ( buffer.when_full = drop_newest)
接收器 2:可以以 500 个事件/秒的速度发送 ( buffer.when_full = block)
接收器 3:可以以 1000 个事件/秒的速度发送 ( buffer.when_full = block)
组件配置了多个数据源时,当组件在进行背压时,Vector无法保证哪个数据源会优先得到处理。为了确保所有输入都能够得到充分的处理,需要确认下游组件能够处理所有连接的数据源的数据量。这意味着,如果单个组件被配置了多个数据源并且同时从这些数据源接收数据,那么当进行背压处理时,Vector无法确定应该优先处理哪个数据源的数据。为了避免数据丢失和处理错误,需要确保下游组件能够处理所有连接的数据源的数据量。也就是说,如果一个组件同时处理多个数据来源,那么需要确保下游的组件可以处理所有数据流,以确保数据的完整性和正确性。
角色是 Vector 为创建端到端管道而填充的部署角色。
作为守护进程角色旨在收集单个主机上的所有数据。 这是数据收集的推荐角色,因为它可以最有效地利用主机资源。 Vector 实现了有向无环图拓扑模型,支持从多个服务进行收集和处理。
sidecar 角色将 Vector 与每个服务耦合,只专注于为该单个服务收集数据。 虽然建议使用上述提到的守护进程角色,但如果想将数据收集的责任转移给服务所有者时,sidecar 角色会很有用。 而且,在某些情况下,它更易于管理。
聚合器角色设计用于中央处理,从多个上游源收集数据并执行跨主机聚合和分析。
对于 Vector,这个角色应该专门用于:跨主机聚合和分析。Vector 的独特之处在于它既可以作为代理也可以作为聚合器。这使得在边缘分布处理成为关键。我们强烈建议尽可能将处理推到边缘,因为它更高效且更易于管理。
拓扑是将 Vector 部署到基础架构中的最终结果。 拓扑可能像将 Vector 部署为代理一样简单,也可能像将 Vector 部署为代理并通过多个 Vector 聚合器路由数据一样复杂。
可以称之为“最简单的拓扑”,在分布式架构中,Vector 从客户端节点直接与下游服务通信。
【优点】
【缺点】
简单性、稳定性和控制之间的良好平衡。对于很多用例,集中式部署拓扑是分布式拓扑和基于流的拓扑之间的良好折衷,因为它提供了基于流的拓扑的许多优点,例如职责的清晰分离,而不会因基于流的设置,通常涉及将 Vector 与Apache Kafka或Apache Pulsar等系统结合使用。
【优点】
【缺点】
最持久和最有弹性的拓扑结构。这种拓扑结构通常用于非常大的流,团队熟悉运行基于流的服务,例如 Kafka。
优点
缺点
附开源日志采集器性能测评:
链接 https://mp.weixin.qq.com/s/8mCVk3gvXPOijTlcRjUR_w
如何选择合适的开源日志收集器?
链接 https://mp.weixin.qq.com/s/yZh3LDmMW7EQurj0W-9wGA