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

  • 相关阅读:
    668. Kth Smallest Number in Multiplication Table
    658. Find K Closest Elements
    483. Smallest Good Base
    475. Heaters
    454. 4Sum II
    441. Arranging Coins
    436. Find Right Interval
    410. Split Array Largest Sum
    392. Is Subsequence
    378. Kth Smallest Element in a Sorted Matrix
  • 原文地址:https://www.cnblogs.com/xido/p/14607748.html
Copyright © 2011-2022 走看看