消费端出现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. 第五章 服务容错保护:Spring Cloud Hystrix

    在微服务架构中,我们将系统拆分为很多个服务,各个服务之间通过注册与订阅的方式相互依赖,由于各个服务都是在各自的进程中运行,就有可能由于网络原因或者服务自身的问题导致调用故障或延迟,随着服务的积压,可能 ...

  2. ThreadPoolExecutor系列一——ThreadPoolExecutor 机制

    ThreadPoolExecutor 机制 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681529.html ...

  3. Magicodes.WeiChat——使用OAuth 2.0获取微信用户信息

    使用Magicodes.WeiChat,可以很方便的获取到微信用户的信息.在使用OAuth 2.0之前,你先需要做以下操作: 1)在开发者中心修改[网页授权获取用户基本信息],在弹出的界面输入自己的根 ...

  4. Django学习笔记(7)——单表操作和多表操作

    单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...

  5. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  6. SpringBoot系列——Spring-Data-JPA(升级版)

    前言 在上篇博客中:SpringBoot系列——Spring-Data-JPA:https://www.cnblogs.com/huanzi-qch/p/9970545.html,我们实现了单表的基础 ...

  7. SQL Server分页存储过程通用存储过程

    CREATE proc [dbo].[p_paging]@tableName varchar(8000),          --表名.视图名@indexCol varchar(50) = 'id', ...

  8. .NET: 使用.NET Core CLI开发应用程序

    要开发.NET Core应用程序,除了使用强大的Visual Studio之外,还可以使用.NET Core CLI..NET Core CLI (Command-Line Interface),也就 ...

  9. 廖雪峰老师博客学习《通过生成器generator生成列表式杨辉三角》

    说明:这是我接触生成器概念后,自己对它的理解,可能比较表面,没深入理解,也可能有错误.后续校正错误认知,将有关generator作为一个tag了! 希望以后能活用. 先贴出自己写的triangles( ...

  10. 流程控制值while 循环

    一.结束循环的两种方式 1. 修改条件tag=Truewhile tag: print(1) print(2) print(3) tag=False print(4) 2.while + break ...