发现kafka丢消息后的排查

背景:

      最近在用kafka做消息中间件,producer从hive中读取消息发送到kafka,后端storm对消息分类发送到elasticsearch建立索引。

问题:

      hive表中总共350万数据,当时整个全量索引结束后发现,最后索引条数总共310万左右。storm日志没有任何错误日志。

排查:

      首先排查storm consumer的问题,由于发现storm日志没有任何异常,所以第一步基本排除建索引程序的问题。storm 消费kafka用的官方storm-kafka包,而且已开启ack,所以基本排除storm端的问题。

    现在怀疑kafka里的数据本身只有310万条数据,写了一个程序扔到了kafka集群上探查了一下,印证了自己的想法。果然,数据只有310万条。现在基本判断问题的在kafka producer上。仔细查看了下producer代码

props.put("acks","all");

props.put("retries",3);     

     "acks" 选项表示kafka 的ack级别:acks=0 意味着producer永远不会等待任何一个来自broker的ack,意味着不需要任何确实,发送及以为着成功。acks=1 意味着在leader replica已经接收到数据后,producer会得到一个ack,这个选项对速度与安全性做一个平衡,但是不需要等其他副本确认,如果发生leader挂了,其他副本还没来得及同步,这时就会发生数据丢失的情况。最后一种数据最安全的情况就是acks=al,l意味着在所有的ISR都接收到数据后,producer才得到一个ack。这个选项提供了最好的持久性,只要还有一个replica存活,那么数据就不会丢失,但是相应的吞吐量会受到影响。本着对业务对数据可靠性的要求,我选择了最高的可靠级别,这点没毛病。

    "retries"选项大于0的值将使客户端重新发送任何数据,一旦这些数据发送失败,会间隔一段时间重试,这个值设置的就是重试间隔时间。初步怀疑这个值太小,如果磁盘卡顿,网络中断超过三秒,是否会丢数据。所以将这个参数调大到300。

     重新打包上传到storm集群重新跑了一回,数据还是丢了30多万。场面一度尴尬。。问题陷入了僵局。

转机:

    现在的问题已经超过了我的认知,之前从来没出现过如此严重的丢数据的问题。在网上搜的资料大部分都看过。理论上可靠性可以通过副本解决,没有类似于我这个种问题。心想着如果不行,只能更改broker 从page cache同步到硬盘的频率了。鬼使神差下,我更改了下producer的压缩格式,从snappy改到gzip,这次kafka中的消息,竟然只少了2000。同样的参数,只改了下压缩格式。我又查看下了前两次用snapp格式,kafka里的消息数,发现了一个问题,两次用snappy的时候,kafka消息数竟然一模一样。如果不是玄学的问题,理论上如果丢消息,350万条,丢相同条数的信息概率简直太小了。

  现在问题似乎已经很清晰了,gzip压缩率要比snappy高,snappy优势在于压缩速度。压缩率高意味着单条数据要小。现在基本问题定位在单条数据大小的问题。但是为什么producer端没有异常日志呢。查看一下producer发送消息的源码:“Future send(ProducerRecord var1)” producer 发送消息后会发挥一个future,这种模式是异步发送方式,当broker返回异常信息时并不会抛出。,producer.send(producerRecord).get(),加上get(),将异步改同步,打包运行果然发送到30万条左右数据时就已经抛出异常

kafka.common.MessageSizeTooLargeException

解决:

  至此问题已经定位到,下一步解决问题,搜了下stackoverflow,参考下最高票回答:

Consumer side:fetch.message.max.bytes- this will determine the largest size of a message that can be fetched by the consumer.

Broker side:replica.fetch.max.bytes- this will allow for the replicas in the brokers to send messages within the cluster and make sure the messages are replicated correctly. If this is too small, then the message will never be replicated, and therefore, the consumer will never see the message because the message will never be committed (fully replicated).

Broker side:message.max.bytes- this is the largest size of the message that can be received by the broker from a producer.

Broker side (per topic):max.message.bytes- this is the largest size of the message the broker will allow to be appended to the topic. This size is validated pre-compression. (Defaults to broker'smessage.max.bytes.)



作者:MoCuishle_15b7
链接:https://www.jianshu.com/p/ec93eb4f7733
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、基础知识与概念1.1 简要介绍Apache Kafka是什么,它的主要用途是什么?1.2 解释一下Kafka中的Producer、Broker、Consumer以及Topic的概念?1.3 Kafka消息是如何保证顺序性的?1.4 Kafka中的消息是如何存储的?1.5 解释Kafka的高可用性和分区(Partitions)机制?二、架构与设计2.1  Kafka集群是如何工作的?如何设计一个高可用的Kafka集群?2.2  Kafka中的副本(Replication)是如何实现的?它如何保证数据失?2.3  解释一下Kafka的ISR(In-Sync Replica)列表及其重要性?2.4 Kafka支持的几种消息传递语义有哪些?2.5  如何在Kafka中实现消息的持久化和缓存策略?三、消费者与生产者3.1  Kafka消费者如何消费消息?特别是谈论消费者组的概念及其作用。3.2 如何在Kafka生产者中配置消息发送的可靠性保障?3.3 Kafka消费者如何处理消息的偏移量(Offsets)管理?手动提交与自动提交的区别?3.4  如何实现Kafka的 Exactly-Once 消息传递语义?四、性能与优化4.1  影响Kafka性能的因素有哪些?如何进行性能调优?4.2  解释Kafka的批处理机制及其对性能的影响?4.3  Kafka如何处理大量消息积压的情况?4.4  谈谈Kafka的延时问题以及可能的解决方案?五、故障排查与安全性5.1  如果Kafka Broker宕机了,会有什么影响?如何恢复?5.2  如何监控和诊断Kafka集群的健康状况?5.3  Kafka提供了哪些安全特性来保护数据?如何实施认证和授权?5.4  在多租户环境下,如何确保Kafka的安全隔离?
最新发布
04-03
### Apache Kafka 基础概念 Apache Kafka 是一种高吞吐量的分布式发布订阅消息系统,最初由 LinkedIn 开发并开源[^2]。它被设计用于处理实时数据流,并支持大规模的数据管道和应用程序集成。 #### 核心组件 - **主题 (Topic)**:Kafka 中的消息类别或提要名称。 - **分区 (Partition)**:每个主题可以划分为多个分区,这些分区分布在不同的服务器上以提高可伸缩性。 - **副本 (Replica)**:为了提供容错能力,Kafka 支持为每个分区创建多个副本。 - **生产者 (Producer)** 和 **消费者 (Consumer)**:分别负责向 Kafka 发送消息以及从 Kafka 接收消息。 --- ### 架构设计 Kafka 的架构基于分布式系统设计理念,其核心目标是高性能、持久化存储和水平扩展能力。以下是主要特点: 1. **分布式的日志记录**:Kafka消息作为不可变的日志条目保存在磁盘中,允许快速随机访问。 2. **分区机制**:通过将主题分成多个分区来实现负载均衡和更高的吞吐量。 3. **复制机制**:确保即使某些节点失效,仍然能够继续服务请求。 4. **ZooKeeper 协调**:早期版本依赖 ZooKeeper 来管理元数据和服务发现;新版本逐渐减少对其依赖。 --- ### 生产者与消费者模型 Kafka 使用经典的生产者-消费者模式来进行消息传递。这种模型具有以下几个重要方面: #### 生产者行为 - **同步 vs 异步发送**:生产者可以选择同步方式等待确认或者异步批量提交消息。 - **重试策略**:当发生网络错误或其他临时问题时,生产者可以根据配置自动尝试重新发送失败的消息。 - **压缩选项**:启用压缩功能可以帮助节省带宽资源消耗[^1]。 #### 消费者行为 - **拉取模型**:不同于传统的推送方法,Kafka 让客户端主动获取所需的信息。 - **偏移量控制**:每一条已读过的记录都会有一个对应的 offset 值用来标记位置状态以便后续追踪进度。 --- ### 性能优化建议 针对不同场景下的需求调整参数设置对于提升整体效率至关重要: 1. 批量加载大小 (`batch.size`) 调整至合理范围有助于平衡延迟与传输成本之间的关系; 2. 设置合适的 `linger.ms` 参数可以让更多待发送项组合成单次操作从而降低频率; 3. 对于频繁写入密集型应用而言增加线程池规模可能带来显著改善效果[^3]。 --- ### 故障排查指南 当面对诸如超时异常等问题时可以从以下几个角度入手分析原因所在: - 检查网络连接状况是否存在包现象影响正常通信过程; - 确认 broker 是否处于健康运行状态下并且有足够的可用空间供分配给新的分片实例使用; - 查看 client-side logs 寻找更详细的报错描述辅助定位根本症结所在。 --- ### 安全特性概述 随着企业级部署越来越普遍,安全性也成为考量重点之一: - 数据加密传输保护敏感资料免受中途截获威胁; - 用户认证授权体系防止未授权访问破坏业务逻辑流程; - SSL/TLS 加密通道建立端到端保密通讯环境保障隐私权不受侵犯。 ```python from kafka import KafkaProducer, KafkaConsumer producer = KafkaProducer(bootstrap_servers='localhost:9092') consumer = KafkaConsumer('my_topic', bootstrap_servers='localhost:9092') for message in consumer: print(f"Received {message.value.decode()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值