记一次Kafka生产问题

本文记录了一次由于Kafka __consumer_offsets 分区数据异常增长导致的生产问题。通过检查配置,发现日志保留策略未生效。通过查询Zookeeper中的topics特殊配置并进行调整,解决了这个问题。涉及的命令包括查询和修改topics的配置,以及清理策略的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近北京电信的生产服务器突然间磁盘报警,发现是kafka-log的__consumer__offsets–55数据量过大导致,这个topic是kafka记录偏移量的主题,这个分区的数据量达到3.1个T;
默认配置server.conf里的核心配置项
#最大日志保留大小 log.retention.bytes=1073741824
#日志保留时间长度 log.retention.minutes=10
log.segment.delete.delay.ms=1000 #过期数据删除策略,
最重要的配置 log.cleaner.enable=true log.cleanup.policy=delete
#以上配置只对默认配置,属于全局配置,并不一定对全部topic起效

如果以上配置对你的topics不起效果,说明该topics有独立的特殊配置,用以下命令查询该topics的特殊配置(重载配置)
#localhost:2182是zookeeper的ip和端口,__consumer_offsets是要查询的topics bin/kafka-configs.sh --zookeeper localhost:2182 --entity-type topics --entity-name __consumer_offsets --describe #假如结果如下: Configs for topics:__consumer_offsets are segment.bytes=104857600,cleanup.policy=compact,compression.type=uncompressed 则说明segment.bytes、cleanup.policy、compression.type这三个配置项是针对topics的,server.conf配置log.cleanup.policy, log.segme

### Kafka 中精确一次消息传递语义的实现 Apache Kafka 的 0.11 版本引入了精确一次 (exactly-once) 消息传递语义的支持,这是分布式流处理领域的一个重要里程碑[^1]。为了支持这一特性,Kafka 实现了两个核心功能:幂等性和事务。 #### 幂等性 (Idempotence) 幂等性确保即使生产者多次发送相同的消息到同一个分区,最终只会被一次。这通过为每个生产者分配唯一的生产者 ID (PID),并维护每条消息的序列号来实现。如果检测到重复的消息,则会丢弃该消息而不写入日志[^4]。 #### 事务支持 (Transactions) 除了幂等性外,Kafka 还提供了跨多个分区和消费者组的原子提交能力。这意味着可以将一组操作作为一个整体成功或失败,从而保证数据一致性。具体来说: - 生产者可以通过开启事务模式,在一个事务中执行多步操作。 - 当所有步骤完成时,生产者可以选择提交整个事务;如果有任何一步失败,则回滚整个事务[^2]。 这些机制共同作用下实现了端到端恰好一次交付语义[end-to-end exactly-once delivery semantics],即从输入源读取数据、经过计算再到输出目标存储过程中都能保持一致性的保障[^5]。 以下是利用 Kafka 提供的新特性的简单代码示例展示如何启用上述提到的功能之一——使用事务API来进行精准一次性投递: ```java Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-transactional-id"); KafkaProducer<String, String> producer = new KafkaProducer<>(props); producer.initTransactions(); try { producer.beginTransaction(); for(int i=0;i<10;i++) { producer.send(new ProducerRecord<>("topic", Integer.toString(i))); } producer.commitTransaction(); // Commit only if all sends succeed. } catch (ProducerFencedException | OutOfOrderSequenceException e){ producer.abortTransaction(); } finally{ producer.close(); } ``` 此段程序片段展示了怎样初始化交易环境并通过循环向指定主题发布一系列录之后再决定是确认还是取消当前正在进行中的交易过程.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值