zoukankan      html  css  js  c++  java
  • kafka rebalance机制

    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

  • 相关阅读:
    【HDOJ】1058 Humble Numbers
    activity去标题栏操作&保留高版本主题
    谷歌安卓官方开发者网站 https://developer.android.google.cn
    TortoiseGIT
    Git的优势
    eoe开发社区
    安卓巴士 http://www.apkbus.com/
    Git简介
    SVN标准目录结构
    关于人生的
  • 原文地址:https://www.cnblogs.com/xido/p/14607748.html
Copyright © 2011-2022 走看看