一次kafka集群重启引发的线上问题

本文详细介绍了在kafka集群重启后,由于__consumer_offsets topic数据量过大导致的问题,分析了问题原因,包括配置错误和消费提交偏移量过多。提出了设置过期策略和查看日志信息的方法,并提供了优化方案,如调整清理策略和应用代码优化,成功将数据量从900G降至2G。

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

1. 背景

在某次运维发现线上的kafka server集群的默认配置的size太小,不能满足业务发送数据的要求,导致业务阻塞,于是,更改了kafka server的某项参数的size大小之后,并重启了线上kafka server集群。
在重启集群之后,线上实时业务消费kafka topic的消费者开始报错,在消费端的错误信息为:

  1. 消费方的error错误信息为:
"Container exception":
org.apache.kafka.common.errors.TimeoutException: Timeout of 6000ms expected expired before successfully committing offsets{orders-5=OffsetAndMetadata{offset=197572354, leaderEpoch=null, metadata=''}}
  1. 查看error错误信息的上下文,发现有相应的warn日志:
[Consumer clientId=consumer-25, groupId=orderconsumer-my-consumer] Offset commit failed on partition order-3 at offset 197449610: The coordinator is loading and hence can't process requests.
  1. 另外 kafka server在重启的过程中也打印了相应的启动的日志,大致是__consumer_offset这个topic正在loading相关的数据。
输出日志信息待补充

2. 业务处理

在kafka server 集群重启后,业务这边消费端的偏移量无法提交,并不断报上述的

### 将数据从一个Kafka集群推送到另一个Kafka集群的方法 要实现将数据从一个Kafka集群推送到另一个Kafka集群,可以采用多种方法和技术栈来完成这一目标。以下是几种常见的解决方案及其具体配置方式: #### 方法一:使用 MirrorMaker 2 (MM2) MirrorMaker 是 Apache Kafka 提供的一个工具,用于在两个 Kafka 集群之间复制数据。MirrorMaker 2 支持双向复制以及更复杂的拓扑结构。 ##### 配置步骤 1. **安装并启动 MM2** 下载 Kafka 安装包后,在 `bin` 目录下找到 `connect-mirror-maker.sh` 脚本文件。 2. **编写配置文件** 创建一个名为 `mm2.properties` 的配置文件,内容如下: ```properties clusters=source,destination source.bootstrap.servers=<源Kafka集群地址>:<端口> destination.bootstrap.servers=<目标Kafka集群地址>:<端口> # 复制所有主题 source->destination.enabled=true source.topics.regex=.* ``` 3. **运行 MirrorMaker 2** 执行以下命令启动镜像过程: ```bash bin/connect-mirror-maker.sh config/mm2.properties ``` 此方法适用于大规模的数据迁移场景,并能保持两者的实时一致性[^1]。 --- #### 方法二:利用 Logstash 中间件 Logstash 可作为中间层,读取来自第一个 Kafka 集群的主题消息并将它们写入第二个 Kafka 集群。 ##### 配置示例 ```conf input { kafka { bootstrap_servers => "<源Kafka集群地址>:<端口>" topics => ["source_topic"] group_id => "logstash_kafka_to_kafka" auto_offset_reset => "earliest" } } output { kafka { bootstrap_servers => "<目标Kafka集群地址>:<端口>" topic_id => "target_topic" } } ``` 在此配置中,Logstash 会持续监听指定的 Kafka 主题,并将其接收到的消息转发至另一 Kafka 实例[^3]。 --- #### 方法三:借助 TiCDC 工具 对于涉及数据库变更捕获的应用场景,TiCDC 是一种可行的选择。它能够捕捉 TiDB 数据库的变化并通过 Kafka 进行传输。虽然其主要用途并非单纯连接两个 Kafka 集群,但在某些特定情况下仍可适用。 例如,当需要先从某个关系型数据库提取更新日志再传递给下游服务时,可以通过设置合适的 changefeed 来达成目的[^2]。 --- #### 方法四:开发自定义 Java 应用程序 如果偏好编程控制整个流程,则可通过编写一段基于 Kafka Producer/Consumer API 的代码片段来手动管理跨集群通信逻辑。 下面是一个简单的例子演示如何用 Java 实现该功能: ```java import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Collections; import java.util.Properties; public class KafkaClusterReplicator { public static void main(String[] args) throws InterruptedException { Properties consumerProps = new Properties(); consumerProps.put("bootstrap.servers", "<源Kafka集群地址>:<端口>"); consumerProps.put("group.id", "cluster_replicator"); consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps); consumer.subscribe(Collections.singletonList("<源主题名称>")); Properties producerProps = new Properties(); producerProps.put("bootstrap.servers", "<目标Kafka集群地址>:<端口>"); producerProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); producerProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); KafkaProducer<String, String> producer = new KafkaProducer<>(producerProps); while (true) { consumer.poll(100).forEach(record -> { producer.send(new ProducerRecord<>("<目标主题名称>", record.key(), record.value())); }); } } } ``` 这种方法提供了极大的灵活性,允许开发者针对特殊需求调整行为模式[^4]。 --- #### 总结 以上介绍了四种不同的策略用来解决“怎样把一个 Kafka 集群里的资料传送到另外一个 Kafka 集群里”的问题。每种方案都有各自的特点和局限性,请依据实际业务环境挑选最合适的技术路径实施部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值