目前Kafka集群部署了4个Broker节点,但在压测的过程中,推送消息到Kafka没有起到负载均衡,都只推送到一台Broker节点,1、查看推送程序物理机连接kafka端口6667的TCP连接,确实只有一台
[root@~]# ss -anp |grep ':6667' |grep '11314' (Linux查看方式)
tcp ESTAB 0 0 ::ffff:172.16.10.133:43760 ::ffff:172.16.10.166:6667 users:(("java",pid=11314,fd=551))
C:\Users\jun>netstat -n |findstr ":6667" (Windows查看方式)
TCP 172.16.80.126:59795 172.16.10.166:6667 ESTABLISHED
2、查看topic分配的分区和Broker选择Leader也都只有一台borker=1001
[root@node-08 ~]# /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --describe --zookeeper 172.16.10.158:2181 --topic BuB
Topic: BuB PartitionCount:4 ReplicationFactor:4 Configs:
Topic: BuB Partition: 0 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: BuB Partition: 1 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: BuB Partition: 2 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: BuB Partition: 3 Leader: 1001 Replicas: 1001 Isr: 1001
3、如何让Kafka集群启到多个Broker节点负载均衡的作用呢?
在 Kafka 集群中,我们可以对每个 Topic 进行一个或是多个分区,并为该 Topic 指定备份数,指定备份数的时候,备份数要小于等于 Brokers 数。否则创建失败。
其中为什么备份数要小于等于Broker数,探究其中奥秘,修改备份参数:default.replication.factor=1个修改成了4个备份,Leader的选举变成了4台,
在刷新物理机推送消息与物理机的TCP连接,现在变成了4台:
[root@~]# ss -anp |grep ':6667' |grep 'pid=11314'
tcp ESTAB 0 0 ::ffff:172.16.10.133:43760 ::ffff:172.16.10.166:6667 users:(("java",pid=11314,fd=551))
tcp ESTAB 0 0 ::ffff:172.16.10.133:52254 ::ffff:172.16.10.168:6667 users:(("java",pid=11314,fd=549))
tcp ESTAB 0 0 ::ffff:172.16.10.133:51814 ::ffff:172.16.10.167:6667 users:(("java",pid=11314,fd=548))
tcp ESTAB 0 0 ::ffff:172.16.10.133:54038 ::ffff:172.16.10.169:6667 users:(("java",pid=11314,fd=550))
4、查看topic分配的4个分区也对应到4个Broker节点
[root@~]# /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --describe --zookeeper 172.16.10.158:2181 --topic BuB
Topic:BuB PartitionCount:4 ReplicationFactor:4 Configs:
Topic: BuB Partition: 0 Leader: 1001 Replicas: 1001,1002,1003,1004 Isr: 1001,1004,1002,1003
Topic: BuB Partition: 1 Leader: 1002 Replicas: 1002,1003,1004,1001 Isr: 1002,1001,1004,1003
Topic: BuB Partition: 2 Leader: 1003 Replicas: 1003,1004,1001,1002 Isr: 1003,1004,1002,1001
Topic: BuB Partition: 3 Leader: 1004 Replicas: 1004,1001,1002,1003 Isr: 1004,1002,1001,1003
参考链接:
总结:Kafka集群Broker要起到负载均衡作用的效果,default.replication.factor 备份数必须>=2,若是很均衡所有Broker节点,那就备份数=Broker节点数 ,否则就能均衡数=备份数
手动敲命令新建topic是可以负载均衡,推测跟kafka集群配置使用不当有关系
./kafka-topics.sh --create --zookeeper 192.168.128.102:2181 --replication-factor 1 --partitions 2 --topic topic1
最终排查,其实备份数只是备份多份数据用,是不会起到负载作用的,之所以会出现不负载这种场景,是因为在增加Borker节点的时候,加大分区数重启Kafka服务,topic已分配好的分区数没变更,所以直接通过Zookeeper命令删除所有topic是不可取的(rmr /broker),因为用命令直接删除zookeeper数据会删除不干净影响到kafka的leader负载均衡的选举,之后通过kafka的delete命令删除解决负载均衡的问题。
./kafka-topics.sh --delete --zookeeper 172.16.10.157:2181 --topic BuB # 删除分区
./kafka-preferred-replica-election.sh --zookeeper 172.16.10.157:2181 # 重新分区
注意:如果是多个kafka的broker节点,要关闭其中几个broker节点,通过kafka delete删除还是无效,会提示删除已被标志了,要快速删除,还是得到zookeeper上面进行直接删除。
======================================================================================================================
之后发现一个问题:kafka重新启动后,主题的分区分布又重新分配,有的节点只有分配3个分区,有的节点分配5个分区。