kafka rebalance机制

摘要:
kafkar均衡机制kafka保证同一消费者组中只有一个消费者会使用消息。事实上,kafka保证每个使用者实例将在稳定状态下使用一个或多个特定数据,分区的数据将仅由特定使用者实例使用。这种设计的缺点是,同一消费者群体中的消费者无法平均消费数据,优点是每个消费者不必与大量经纪人进行通信,以减少通信开销。同事们还减少了分配的难度,使其更易于实施。此外,由于同一分区中的数据是有序的,因此可以确保每个分区中的的数据也被有序地消耗。

kafka rebalance机制

kafka保证同一个consumer group中只有一个consumer会消费掉某条消息,实际上,kafka保证的是稳定状态下每一个consumer实例只会消费一个或者多个特定的数据,而某个partition的数据只会被某一个特定的consumer实例所消费,这样设计的劣势是无法让同一个consumer group里的consumer均匀的消费数据,优势是每个consumer不用跟大量的broker通信,减少通信开销,同事也降低了分配的难度,实现也更简单,另外,因为同一个partition里的数据都是有序的,这样可以保证每个partition里的数据也是有序被消费的。如果某consumer group中consumer数量少于partition的数量 则至少有一个consuemr会消费多个partition的数据,如果consumer的数量与partition数量相同,则正好一个consumer消费一个partition 的数据,而如果consumer的数量多于partition的数量时,会有部分consumer无法消费该topic下任何一条信息。

Consumer Rebalance 算法如下:

  1. 将目标topic下所有的partition排序,存于pt
  2. 对某 consumer group 下所有consumer 排序,存于cg ,第i个consumer记为ci `
  3. N=size(Pt)/size(cg) 向上取整
  4. 解除ci对原来分配的partiiton 的消费权(i从零开始)
  5. 将第i*N到(i+1)* N-1partition分配给ci

目前consumer realance 的控制策略是由每一个consumer通过通过zookeeper完成的,具体的控制方法

  1. /consumer/[consumer-group]/下注册id
  2. 设置/cnsumer/[consumer_group] watcher
  3. 设置对/brokers/ids 的watcher
  4. zk下设置watcher的路径节点更改,触发consumer rebalance

在这种策略下,每一个consumer或者broker的增加或减少都会触发consumer rebalance 因为每个consumer只负责调整自己所消费的paritition,为了保证整个consumer group的一致性,所以当一个consumer触发了rebalance时,该consumer group 内的其他所有consumer 也应该同时触发rebalance

herd effect

任何broker或者consumer的增减都会触发所有的consumerrebalance

split brain

每个consumer分别单独通过zookeeper判断哪些parittion dowm了 那么不同consumer

zookeeper 看到的view就看不一样了,这样会造成错误的reblance尝试,而且有可能所以的consumer 都认为rebalance

免责声明:文章转载自《kafka rebalance机制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇idea中push项目到远程仓库,提示:push to origin/master war rejectedmybatis-plus学习下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jenkins Generic Webhook Trigger+gitlab设置触发器

在生产环境中因为代码仓库迁移导致Jenkins设置的触发器失效,在调试的过程gitlab触发事件响应状态码为200,但是响应消息一直为{"status":"ok","data":{..."triggered":false,"url":""}}}} 。 此篇文章的描述主要针对该问题,且面向对Jenkins和Gitlab有一定经验的小伙伴。 文章标签: Je...

关于Java高并发的问题

前言: 对于开发的网站,如果网站的访问量非常大的话,那么就需要考虑相关的并发访问问题了。 一.同步和异步的区别和联系 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其它的命令。 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系...

分享一些 Kafka 消费数据的小经验

前言 之前写过一篇《从源码分析如何优雅的使用 Kafka 生产者》 ,有生产者自然也就有消费者。 建议对 Kakfa 还比较陌生的朋友可以先看看。 就我的使用经验来说,大部分情况都是处于数据下游的消费者角色。也用 Kafka 消费过日均过亿的消息(不得不佩服 Kakfa 的设计),本文将借助我使用 Kakfa 消费数据的经验来聊聊如何高效的消费数据。...

LPC (Local procedure calls) (一)数据结构

什么是LPC LPC(Local-Process-communicationandnotlocalprocedure-Calls)是一种在NT内核中实现的基于消息的高速通信机制。LPC可用于两个用户模式进程之间、用户模式进程与内核模式驱动程序之间或两个内核模式驱动程序之间的通信。一个例子是通过LPC通信的两个用户模式进程。像CSRSS.exe与SMSS.e...

使用ionic3快速开发webapp(二)

本文整理了使用ionic3开发时会用到的一些最基本组件及用法 1、ion-tabs 最常见的通过标签切换页面: tabs.html 1 <ion-tabs> 2 <ion-tab [root]="tab1Root" tabTitle="首页" tabIcon="home"></ion-tab> 3 <ion...

Linux命令发送Http的get或post请求(curl和wget两种方法)

    Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求。下面就来介绍一下Linux系统如何模拟Http的get或post请求。 一、get请求:   1、使用curl命令:   curl “http://www.baidu.com” 如果这里的URL指...