主题与分区管理
# 一、主题管理
主题和分区是Kafka的两大概念:
- 主题:消息的归类
- 分区:对消息的二次归类
其中主题的管理包括最基本创建主题、删除主题、查看主题和修改主题操作,可以通过Kafka提供的kafka-topics.sh
脚本来执行这些操作:
exec $(dirname $0)/kafka-run-class.sh kafka.admin.TopicCommand "$@"
该命令本质上是调用了kafka.admin.TopicCommand
类来执行主题管理的操作。
# 二、主题的创建
通过kafka-topics.sh
脚本来创建主题:
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic quickstart-events --partitions 4 --replication-factor 1
Created topic quickstart-events.
上面的命令,创建一个分区为4,副本因子为1的主题,我们可以到对应的日志文件中查看创建的主题分区:
# ls -al kafka-logs-7a7ae42d8266 | grep quickstart-events
drwxr-xr-x 2 root root 4096 Apr 14 04:27 quickstart-events-0
drwxr-xr-x 2 root root 4096 Apr 14 04:27 quickstart-events-1
drwxr-xr-x 2 root root 4096 Apr 14 04:27 quickstart-events-2
drwxr-xr-x 2 root root 4096 Apr 14 04:27 quickstart-events-3
由于只有一个副本,相当于一个broker
,因此所有的分区都在这个副本里面,先有如下情况:
如果分区为4,副本因子为2、broker 数为3的情况下,按照2、3、3的分区副本个数分配给各个 broker 是最优的选择。
在分区数为3、副本因子为3,并且 broker 数同样为3的情况下,分配3、3、3的分区副本个数给各个 broker 是最优的选择
# 三、查看主题
# 1、单个主题查看
通过describe
指令类型来查看分区副本的分配细节:
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic quickstart-events
Topic: quickstart-events TopicId: E33Oz8TFT1SxmkXoromrEw PartitionCount: 4 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: quickstart-events Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events Partition: 2 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events Partition: 3 Leader: 0 Replicas: 0 Isr: 0
Topic
:主题名称Partition
:分区号PartitionCount
:主题下分区的数量
# 2、全部主题查看
通过 list
指令可以查看当前所有可用的主题,示例如下:
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
quickstart-events
quickstart-events2
describe
指令来查看单个主题信息的,如果不使用 --topic 指定主题,则会展示出所有主题的详细信息:
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe
Topic: quickstart-events TopicId: E33Oz8TFT1SxmkXoromrEw PartitionCount: 4 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: quickstart-events Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events Partition: 2 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events Partition: 3 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 TopicId: Pr_rsJmrSAOCcJJ21qKgrA PartitionCount: 4 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: quickstart-events2 Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 Partition: 2 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 Partition: 3 Leader: 0 Replicas: 0 Isr: 0
describe
中的--topic还支持指定多个主题:
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic quickstart-events,quickstart-events2
# 四、修改主题
当一个主题创建之后,我们仍然可以对其进行修改,比如修改分区个数,修改配置等,主要指令为alter
:
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic quickstart-events2 --partitions 5
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic quickstart-events2 --partitions 5
# bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic quickstart-events2
Topic: quickstart-events2 TopicId: Pr_rsJmrSAOCcJJ21qKgrA PartitionCount: 5 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: quickstart-events2 Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 Partition: 2 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 Partition: 3 Leader: 0 Replicas: 0 Isr: 0
Topic: quickstart-events2 Partition: 4 Leader: 0 Replicas: 0 Isr: 0
目前Kafka只支持增加分区,不支持减少分区。
# 五、删除主题
如果确定不再使用一个主题, 那么最好的方式是删除,这样可以释放一些资源。
bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic quickstart-events2
# 六、分区管理
# 1、优先副本的选举
分区使用多副本机制来提升可靠性,只有leader副本对外提供读写服务,
而follower副本只负责在内部进行消息的同步。为了保证可靠性,同一个分区同一个broker节点中不可能出现它的多个副本。
优先副本: 所谓的优先副本是指AR集合列表中的第一个副本,比如[1,2,0],那么这个分区的优先副本就是1。
# 2、如何选择合适的分区数
根据实际业务场景、软件条件、硬件条件、负载情况等来做具体的考量。
# 3、分区数越多吞吐量就越高?
分区是Kafka中最小的并行操作单元:
- 对于生产者,每一个分区的数据写入是完全可以并行化的
- 对于消费者,Kafka只允许单个分区中的消息被一个消费者线程消费,一个消费组的消费并行度完全依赖所消费的分区数。
但是并非分区数越多,吞吐量就越大,随着分区数的增加,相应的吞吐量会有所增加,一旦分区数超过某个阈值,整体的吞吐量是下降的。