5. Partition

  • java
  • java
  • kafka

一、什么是分区

前面也多次提到了分区(partition),分区组成了topic

每个分区都是一个单独的 log 文件,消息以append的方式写入log文件,每个消息都有自己的编号Offset。

Offset 是一个递增的、不可变的数字,由 Kafka 自动维护。

二、消息的有序性

Partition内部的消息可以视为是有序的

  • 如果一个Topic由多个Partition组成,那么这个Topic的消息是无序的
  • 如果Topic只有一个Partition的话,那么这个Topic的消息可以视为是无序的。(单个Partition会阻碍消费者消费速度)

三、Partition的好处

  • 提高消费速度,应该为topic换分为尽可能多的partition,最好是在业务早起阶段就预先划分好可观的partition。同时消费者尽可能保持与partition数量一致,发挥最大的消费能力
  • 数据冗余,当leader分区所在broker挂了后,分布在其他broker的副本分区follower会呗选举成为leader,避免数据丢失

四、reassign

对现有的Kafka集群进行扩容,扩容之后的新Kafka Broker默认是不会有任何Topic和Partition的。

需要利用分区重分配命令kafka-reassign-partitions将现有的数据平衡到新的Broker上去。

4.1 增加partitions

bin/kafka-topics.sh --zookeeper xxxx --alter --topic all --partitions 24

直接新增partition并不会立马起到负载均衡,提升消费速度的作用,还需要分区冲平衡( reassign partitions),将旧的数据分配到新的分区上

4.2 reassign partitions

./bin/kafka-reassign-partitions.sh --broker-list "broker ids" --topics-to-move-json-file move.json --zookeeper xxxx --generate

--topics-to-move-json-file需要指定一个文件,文件里写上你要reassign的topic,如下所示: move.json:

{"topics": [{"topic": "xxxx"}], "version":1 }

上面的命令会生成一个执行计划,将执行计划保存到reassign.json,下面的命令会用到

bin/kafka-reassign-partitions.sh --reassignment-json-file reassign.json --zookeeper  --execute

验证一下是否reassign成功

./bin/kafka-reassign-partitions.sh --zookeeper xxxx --reassignment-json-file reassignment.json --verify
Loading...