filebeat处理k8s docker模式下部署导致deviceid改变,进而导致重复消费问题

Filebeat处理k8s docker模式下部署导致deviceid改变,进而导致重复消费问题

Filebeat消费文件出现了重复消费

我们通过filebeat的log模式扫描nginx的日志,批量发kafka,用来做实时的数据采集,最近发现在云环境上经常出现部分节点重复消费的问题,以下是排查和解决流程。

问题原因

filebeat处理k8s docker模式下部署导致deviceid改变,进而导致重复消费问题。在filebeat的registry文件夹下,记录了 inode + deviceid 作为文件offset进度的唯一标识,当磁盘挂载的宿主机改变后,deviceid同时跟着改变,最终导致了offset失效,然后重新消费了存在的所有nginx日志。

解决方案

升级filebeat到7.17.21, 然后设置file_identity模式为inode_marker,以下是官方对这个模式的说明:
官方文档
设置这个模式后,无需再担心deviceid改变的问题
但是有个问题是.filebeat-marker 生成,我理解这个文件代替了之前的deviceid作为新的设备标识,所以生命周期内,它只需要初始化一次,官方这里给出的生成方案,我在执行的时候会有如下报错:

lsblk: dm-1: failed to get device path
lsblk: dm-2: failed to get device path
lsblk: dm-3: failed to get device path
lsblk: dm-2: failed to get device path
lsblk: dm-0: failed to get device path
lsblk: dm-1: failed to get device path
lsblk: dm-0: failed to get device path
lsblk: dm-3: failed to get device path

所以我决定自定义uuid,写入隐藏文件作为设备的唯一标识ID [注意uuidgen生成的uuid尾部会带有换行符,需要手动清理] ,使用如下shell脚本代替官方的示例:

if [ ! -s /logs/.filebeat-marker ]; then
    uuidgen | tr -d '\n' > /logs/.filebeat-marker
fi

由此我们就可以正常在容器中运行filebeat做文件的采集了。
当然你也可以使用新版本的指纹功能:file_identity.fingerprint, 但是注意这要与filestream配合使用!
在这里插入图片描述

https://www.elastic.co/guide/en/beats/filebeat/7.17/filebeat-input-log.html#filebeat-input-log
https://www.elastic.co/guide/en/beats/filebeat/8.10/filebeat-input-filestream.html#_file_identity_2

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值