/tail2kafka

tail log to kafka, support lua filter before send

Primary LanguageC++Apache License 2.0Apache-2.0

简介

tail2kafka 是一个小工具,用于把文件内容实时 逐行 发送到 kafka, 类似于linux tail 命令实时把文件输出到屏幕上。在把文件行发送到kafka前,可以对文件行做一些 编程工作 ,这里用到了 lua

编译后的tail2kafka只有一个可执行文件,没有任何依赖,使用起来非常简单

编译安装启动

准备依赖

make get-deps 下载依赖库。在编译完成后,依赖库被静态链接到tail2kafka,所以tail2kafka仅有一个可执行文件,仅复制这一个文件到目标机器,就完成部署。

编译安装

编译 make 安装 make install ,默认路径是 /usr/local/bin 。如果需要更改安装路径 make install INSTALLDIR=/installpath

也可以使用 ./scripts/makerpm 打rpm包

启动

启动 tail2kafka /etc/tail2kafka 读取 /etc/tail2kafka 目录下的lua文件,并启动。

停止 kill $(cat /var/run/tail2kafka.pid)

重新加载配置 kill -HUP $(cat /var/run/tail2kafka.pid)

架构

tail2kafka 启动后,有两个进程,子进程完成实际工作,父进程负责重新加载配置和子进程存活检测。

数据分区和完整性

tail2kafka 支持三种分区方式,固定分区、根据机器IP分区和随机分区。

固定分区是指定一个固定分区,根据机器IP分区是对IP做hash自动计算出分区,两者的共同点是文件的数据总是发送到同一个分区,这两种方式可以保证绝对不丢数据。因为文件本身就是一个队列,kafka的一个分区也是一个队列, 队列 之间复制保证数据完整性。缺点是分区不均衡,且分区数量受机器数量限制,为了克服这个限制可以在消费时做二次分区。

随机分区是随机选择一个分区发送数据,一个文件的数据发送到多个分区,相当于一个 队列 的数据复制到多个 队列 ,没办法维护队列之间的映射关系,也就没法记录已发送数据在文件里的offset,进程重启时没法保证数据不丢失。好处是分区均衡。

配置

参考 tail2kafka 配置

内置集群部署支持

参考 tail2kafka 集群

性能

虚拟机测试供参考,测试脚本在 blackboxtest/loadtest.sh

数据大小平均每行大小ACK行/ 秒字节/ 秒
4G204811526731M
4G204802564152M
2G102413076932M
2G102404081642M
1G51215882331M
1G51209090948M
512M256111764732M
512M256011764732M

限制

  • 需要文件使用 \n 作为换行符
  • 一行最长2M,不建议使用很长的行,可能触发librdkafka的BUG