消费端出现offset重置为latest, earliest现象,类似log:

(org.apache.kafka.clients.consumer.internals.Fetcher.handleFetchResponse:)  - Fetch offset  is out of range, resetting offset

原因:该consumer消费的topic的leader和followers的状态不一致时,发生leader切换,会发生offset out of range,此时consumer进行消费时发现offset非法,会进行offset重置

在测试环境中创建一个topic test,3个分区,2个副本,broker 1为leader,broker 2为follower。 
写入一些数据消费端进行正常消费,消费至最新状态A处之后,将test的follower的broker2停掉,继续向test写入数据,并让consumer再次消费至最新状态B处。

此时停掉的follower broker 2的状态已和leader broker 1的状态不一样,已滞后leader的状态。

现在将follower broker 2启动,此时follower和leader的状态不一样,follower需要和leader进行同步,但当follower与leader未同步成功之前将leader broker 1停掉,然后follower broker 2经过leader的选举机制被迫选为leader(unclean.leader.election.enable为true时,选择第一个启动的副本为leader),在被选举为leader之前broker 2的状态并没有和broker 1的状态一致,也就是说broker 2上的LEO并没有同步到B处,而broker 2被选举为了leader,此时producer继续向topic中写数据,写入之后consumer会进行消费,consumer需要消费的offset的B,而broker 2的LEO并没有同步到B处,此时就发生了out of ranger,offset被重置。

优化方案

针对以上情况我们进行了一下修改: 
1. 将topic的副本数设置为3(原先为2),减少ISR列表只有一个leader的几率 
2. 调整min.insync.replicas为2(默认是1),此参数的意思是当ISR中的个数小于此值时,producer无法写入数据,会抛出异常。此参数还需要结合acks来使用,需要将acks设置为all或者-1(flume中kafkaChannel默认是all)。 
3. 调整unclean.leader.election.enable参数为false(默认为true),此参数标识当ISR中没有副本时,选举最早启动的broker为leader。 版本0.11中已经修改默认值为false

4. 集群因为维护需要重启时,先停掉一台broker,然后重启该broker,等到该broker已加入到ISR中之后,再对其它broker进行如上操作,切勿单个broker依次重启。

Kafka配置项unclean.leader.election.enable造成consumer出现offset重置现象的更多相关文章

  1. Kafka学习笔记(4)----Kafka的Leader Election

    1. Zookeeper的基本操作 zookeeper中的节点可以持久化/有序的两个维度分为四种类型: PERSIST:持久化无序(保存在磁盘中) PERSIST_SEQUENTIAL:持久化有序递增 ...

  2. Leader Election

    Leader Election Zookeeper的基本操作 Zookeeper虽然是分布式系统,但它并不是为文件存储而设计的,Zookeeper里存储的一般是配置信息和源信息.实际上,Zookeep ...

  3. ZooKeeper leader election

    Paxos是分布式应用中解决同步问题的核心.作为应用研发工程师,我们总是倾向于使用一种相对简洁的方式实现复杂的算法.ZooKeeper leader election实现就是一个非常好的参考. 其实现 ...

  4. Leader Election 选举算法

    今天讲一讲分布式系统中必不可少的选举算法. leader 就是一堆服务器中的协调者,某一个时刻只能有一个leader且所有服务器都承认这个leader. leader election就是在一组进程中 ...

  5. Zookeeper 学习笔记之 Leader Election

    ZooKeeper四种节点类型: Persist Persist_Sequential Ephemeral Ephemeral_Sequential 在节点上可注册的Watch,客户端先得到通知再得到 ...

  6. Kafka获取订阅某topic的所有consumer group【客户端版】

    之前写过如何用服务器端的API代码来获取订阅某topic的所有consumer group,参见这里.使用服务器端的API需要用到kafka.admin.AdminClient类,但是这个类在0.11 ...

  7. kafka consumer 指定 offset,进行消息回溯

    kafka consumer 如何根据 offset,进行消息回溯?下面的文档给出了 demo: https://cwiki.apache.org/confluence/display/KAFKA/0 ...

  8. kafka配置项host.name advertised.host.name

    遇到的问题: 在本机或者其他机器telnet IP 9092,通,使用域名也通,telnet 127.0.0.1 9092不通 host.name:按配置文件说明,是Kafka绑定的interface ...

  9. 报错:NoSuchMethodError: kafka.javaapi.PartitionMetadata.leader()Lkafka/cluster/Broker;

    报错现象: 在pom文件添加: <dependency> <groupId>org.apache.kafka</groupId> <artifactId> ...

随机推荐

  1. 使用Redmine的PHP API时,如何判断需求是否为原子需求

    使用Redmine的PHP API时,如何判断需求是否为原子需求 使用redmine的PHP接口时,怎样才能判断需求是否为原子需求呢,下面给出具体的做法: /** * 判断是否为原子需求, 即是否依然 ...

  2. [Leetcode]112. Path Sum -David_Lin

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  3. leetcode — word-ladder

    import java.util.*; /** * Source : https://oj.leetcode.com/problems/word-ladder/ * * * Given two wor ...

  4. [ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)

    一.Spring 使用 AspectJ 进行 AOP 的开发:注解的方式 1.1 引入相关的jar包 1.2 引入spring的配置文件 <?xml version="1.0" ...

  5. 【CSS】按钮的禁用与可用 CSS Cursor 属性

    禁用时的样式 可用时的样式 样式很简单,禁用就设置为灰色,可用就设置为红色,今天这个不是重点,重点的是,光标的样子 一般,禁用时候,光标移动到按钮的上方,光标如下 而在启用按钮的时候,光标移动到按钮上 ...

  6. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(6)- 文语合成实现(pyttsx3, eSpeak1.48.04)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之文语合成实现. 文语合成是Jays-PySPEECH的核心功能,Jays-PySPEECH借 ...

  7. Flask的请求处理机制

    在Flask的官方文档中是这样介绍Flask的: 对于Web应用,与客户端发送给服务器的数据交互至关重要.在Flask中由全局的request对象来提供这些信息 属性介绍 request.method ...

  8. [MySQL] mysql的事务隔离和幻读和死锁问题

    1.系统要通过严格的ACID测试,ACID表示原子性/一致性/隔离性/持久性原子性:一个事务必须被视为一个不可分割的最小工作单元一致性:数据库总是从一个一致性的状态转换到另外一个一致性的状态隔离性:通 ...

  9. 学JAVA的第二天,静态网站制作,脑阔一点疼

    先从下载apache-tomcat-9.0.17开始 在下边这个网站下载,下边一步步来 下面删除的这些是暂时用不上的,先吧它删除了,因为会拖慢启动速度 下边把ROOT里边除WEB-INF外的全不删除了 ...

  10. 记一次servlet项目启动

    前言 tomcat 和 jetty 都属于 web 容器. mac安装tomcat brew install tomcat 安装之后,输入 catalina -h,可以看到各种命令,如run.star ...