3、采集链路 1.0 版本
在 1.0 版本中,我们对采集链路做了大改动 ——在 Agent 与 Kafka 之间增加一个缓冲层,这里我们称之为 Bus。
Bus 主要做三件事情:
一是连接收敛;
二是数据缓冲;三是数据路由转发。
(1)连接收敛
连接收敛,简单讲就是多个连接变成一个连接。
为什么要这样呢?
因为 Kafka 的每一个连接都会消耗 Kafka 的资源。
当连接较多的情况下,Kafka 的性能会下降,数据采集速度也会下降。
随着连接增多,故障连接的个数会更大。
如果连接故障,就会触发 Kafka 的 rebalance,rebalance 会进一步影响采集性能。
所以我们需要做连接
收敛。
(2)数据缓冲
数据缓冲主要是解决数据丢失的问题。
如何实现呢?
比如说 Kafka 出现了故障,之前的版本很明显会导致 Agent 的发送速度下降。
因为 Agent 发送速度赶不上数据的生产速度,那这部分的数据就滚动删除,这样数据就丢失了。
如果我们在 Bus 层做一个数据的缓冲,假如说链路出现故障,那 Bus 可以用一些本地磁盘资源,将数据进行旁路存储,这样 Agent 可以正常发送。
当 Kafka 稳定之后,Bus 再异步发送到 Kafka,这样也不会影响正常的实时采集链路,这就解决了数据丢失的问题。
(3)数据路由转发
在引入了 Bus 之后,我们同时也做了数据转发。有的数据不一定到 Kafka ,比如有的数据需要直接到 ES,用于做检索。我们通过对 Bus 配置修改来决定数据发送的地方。数据从哪里来到哪里去做成可配置的,让整个采集链路变得更加灵活。
(4)部署问题
引入的 Bus 应该部署在哪个地方呢?
这里有两种部署方案:
一种是将 Bus 和 Kafka 部署在一起,将 Agnet 跨机房部署;
另一种是将 Bus 与 Agent 部署在一起,与 Kafka 跨机房部署。
无论如何选择,都存在跨机房的问题。
思考之后,我们采取的是第二种部署方案。
因为跨机房数据传输无疑会导致 RT 增大,数据传输的吞吐量下降。
为了弥补 RT 的问题,我们通常的做法是增大发送临界区 patchSize 或者数据发送 Task 的数量。
我们要么在 Agent 端增加,要么在 Bus 端增加。
在 Agent 端增加,对业务是有感知的,Agent 是与业务服务部署在一起的,所有我们只能在 Bus 端修改 patchSzie 与发送的任务数。
因此,我们就需要选择第二种部署方案。