问题描述

业务侧反馈了一个诡异问题,有些日志通过容器的实时日志能够查到,但是通过聚合日志界面却找不到。而且找不到的还是时间比较前的,过了很久再查也是查不到,感觉是丢失了。

环境描述

环境是灵雀云,聚合日志功能是灵雀云自带的,跟日志组件相关的架构图如下:

问题排除

检查了kafka服务、lanaya服务都正常,日志也没有明显的报错。

查看kafka消息队列堆积情况,由于kafka启用了集群鉴权,故需先配置一下才能查:

 # cat /tmp/consumer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="xxxxxxx~HHv";

然后到kafka目录下,查看由哪些group

cd /opt/kafka_2.12-2.2.1/bin
sh kafka-consumer-groups.sh --bootstrap-server 10.1.xxx.xxx:9092 --command-config /tmp/consumer.properties --list

根据查到的group,及之前在lanaya的研究,确定了哪个是业务日志使用的group,然后再查看堆积情况:

sh kafka-consumer-groups.sh --bootstrap-server 10.1.xxx.xxx:9092 --group alauda_log  --command-config /tmp/consumer.properties --describe

发现LAG这列(也就是堆积数)存在很多的负值,截取部分结果如下:

TOPIC            PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                    
ALAUDA_LOG_TOPIC 2          28770006        4516870         -24253136       lanaya@lanaya-597b7cc85c-b7vwn 
ALAUDA_LOG_TOPIC 8          28770060        4516882         -24253178       lanaya@lanaya-597b7cc85c-b7vwn 
ALAUDA_LOG_TOPIC 13         28770059        4516866         -24253193       lanaya@lanaya-597b7cc85c-b7vwn 
ALAUDA_LOG_TOPIC 18         28971707        28971707        0               lanaya@lanaya-597b7cc85c-b7vwn 
ALAUDA_LOG_TOPIC 15         28971758        28971758        0               lanaya@lanaya-597b7cc85c-86npq 
ALAUDA_LOG_TOPIC 25         28769782        4516867         -24252915       lanaya@lanaya-597b7cc85c-86npq 
ALAUDA_LOG_TOPIC 9          28971756        28971774        18              lanaya@lanaya-597b7cc85c-86npq 

正常来说,LAG应该是0或者是正整数,出现负值应该是有问题的。先解决这个问题再看看。

问题解决

根据上面结果可以看出现在偏移量是有问题的。所以我想到的是把偏移量重置。和业务沟通过,不怕之前的数据丢失,所以我直接把偏移量重置到最新的:

sh kafka-consumer-groups.sh --bootstrap-server 10.1.xxx.xxx:9092 --command-config /tmp/consumer.properties --group alauda_log --reset-offsets --to-latest  --execute  --all-topics

–to-latest 请注意这个参数,如果你的业务要求尽量不丢日志,那就不要直接使用这个。具体的参数建议研究下。

这里还有个问题,当消费者还在消费的时候是无法reset队列的,所以需要先停止消费,然后再重置。

kubectl scale deployment lanaya  -n cpaas-system --replicas=0 

重置完成后再把lanaya启动,把上面命令里的0改为原来的副本数执行即可。

经过以上处理,业务侧观察了一段时间,没再出现日志丢失的情况,问题解决。

总结

  1. kafka队列深度异常导致日志收集出现缺少,一般都是kafka队列堆积导致,可以通过kafka-consumer-groups.sh –reset-offsets命令重置偏移量解决。
  2. 要先熟悉架构,不然太难了。我之前不熟悉这个,每查一步都要摸索很久,后面找到厂商要了个架构图才有了比较清楚的认识。