zoukankan      html  css  js  c++  java
  • Kafka 负载均衡策略

    一、生产者负载均衡

    1、分区器

    使用分区器,kafka生产消息时,根据分区器将消息投递到指定的分区中。

    Kafka默认的分区器时DefaultPartitioner。它的分区策略是根据key进行分配的。

    如果key不为null: 对key值进行Hash计算,算出一个分区号; 拥有相同Key值被写入同一个分区;

    如果key为null: 消息将以轮询方式,在所有可用分区中分别写入消息。

    如果不想使用Kafka默认分区器,可以实现Partitioner接口,自己实现分区方法。

    并非分区数量越多,效率越高:
    Topic 每个 partition 在 Kafka 路径下都有一个自己的目录,该目录下有两个主要的文件:base_offset.log 和 base_offset.index。Kafka 服务端的 ReplicaManager 会为每个 Broker 节点保存每个分区的这两个文件的文件句柄。所以如果分区过多,ReplicaManager 需要保持打开状态的文件句柄数也就会很多。

    每个 Producer, Consumer 进程都会为分区缓存消息,如果分区过多,缓存的消息越多,占用的内存就越大;

    n 个分区有 1 个 Leader,(n-1) 个 Follower,如果运行过程中 Leader 挂了,则会从剩余 (n-1) 个 Followers 中选举新 Leader;如果有成千上万个分区,那么需要很长时间的选举,消耗较大的性能。

    参考: https://blog.csdn.net/u010711495/article/details/113678248

    二、消费者负载均衡

    1、再均衡

    再均衡是消费者层面的负载均衡

     当一个group中,有consumer加入或者离开时,会触发partitions均衡,从而提升topic的并发消费能力。

    引起消费者再平衡的情况

    1、新的消费者加入消费组
    2、某个消费者从消费组中退出(异常或正常)
    3、增加订阅主题的分区(kafka的分区数,可以动态的增加,但不能减少)
    4、某台broker宕机,新的协调器ZK当选
    5、某个消费者在心跳会话时间内没有发送心跳请求(配置参数:session.timeout.ms), 组ZK认为该消费者已经退出。

    如下图所示,分区partitions有: P0, P1,P2,P3

    加入group的消费者consumer有: C0, C1

    流程如下:

    1、 根据partitions索引号对partitions进行排序,P0, P1,P2,P3

    2、根据consumer id排序,C0,C1

    3、计算倍数 M = [P0, P1,P2,P3].size / [ C0, C1].size = 4 / 2 = 2;

    4、然后依次分配Ci = [P(i * M),P((i + 1) * M -1)], 当i=0时, C0=[P0,P1]; 当i=1时, C1=[P2,P3]

    作者:Work Hard Work Smart
    出处:http://www.cnblogs.com/linlf03/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!

  • 相关阅读:
    windows10上安装 .NET Framework 3.5
    Mac上安装Tomcat服务器
    实验室中搭建Spark集群和PyCUDA开发环境
    训练实录
    Hello World
    存储管理
    java脚本实现selenium架构下的复选框、上传文件的操作
    java脚本,selenium工具,自动发QQ邮件
    用java脚本,selenium2.0工具,切换窗口经验总结
    六、排队论模型
  • 原文地址:https://www.cnblogs.com/linlf03/p/15502869.html
Copyright © 2011-2022 走看看