kafka学习(4) 主题与分区

主题和分区是kafka的核心概念, 主题作为消息的归类, 可以细分为一个或者多个分区, 分区可以看做是消息的二次归类, 分区的划分不仅为kafka提供了可伸缩性, 水平拓展的功能, 还通过多副本机制来为kafka提供数据冗杂以提高数据可靠性.

创建主题

在kafka配置文件中, 如果auto.create.topics.enable=true,则当生产者向一个未创建的主题发送消息或者消费者从一个未创建的主题拉取消息时, 会自动创建一个num.partitions=1(默认)和default.replication.factor=1(默认)的主题, 建议关闭设为false
使用kafka-topic.sh创建主题
kafka-topics --zookeeper cloudera02/kafka --create --topic test_gp --partitions 4 --replication-factor 2
执行完成后会在kafka的log.dir或者log.dirs目录下创建对应的主题分区文件夹

[root@cloudera01 data]# ls |grep test_gp
test_gp-0
test_gp-2
[root@cloudera01 data]# ssh cloudera02
Last login: Thu Jul  2 18:08:19 2020 from cloudera03
[root@cloudera02 ~]# cd /home/kafka/data/
[root@cloudera02 data]# ls |grep test_gp
test_gp-1
test_gp-2
test_gp-3
[root@cloudera02 data]# ssh cloudera03
Last login: Thu Jul  2 18:07:52 2020 from cloudera01
[root@cloudera03 ~]# cd /home/kafka/data/
[root@cloudera03 data]# ls |grep test_gp
test_gp-0
test_gp-1
test_gp-3

三个broker节点一共创建了8个文件夹, 是4个分区, 2个备份相乘的结果, 每个副本就是一个日志文件


kafka学习(4) 主题与分区_第1张图片
主题,分区,副本和Log日志的关系.png

主题和分区都是提供给上层用户的抽象, 而在副本层面或者说在Log层面才是真正的物理存储
同一个分区中的多个副本必须分布在不同的broker中(机器节点), 这样才能提供有效的数据冗杂

kafka-topics.sh中zookeeper, partitions, replication-factor和topic者四个参数分别表示zookeeper链接地址, 分区数, 副本因子和主题名称, 还有其他指令命令, 包括create, list, describe, alter, delete
可以通过describe指令来查看分区副本的分配细节

[root@cloudera02 ~]# kafka-topics --describe --zookeeper cloudera02/kafka --topic test_gp
Topic:test_gp   PartitionCount:4    ReplicationFactor:2 Configs:
    Topic: test_gp  Partition: 0    Leader: 78  Replicas: 78,77 Isr: 78,77
    Topic: test_gp  Partition: 1    Leader: 77  Replicas: 77,78 Isr: 77,78
    Topic: test_gp  Partition: 2    Leader: 78  Replicas: 78,77 Isr: 78,77
    Topic: test_gp  Partition: 3    Leader: 77  Replicas: 77,78 Isr: 77,7

Topic表示主题名称, Partition表示分区号, PartitionCount表示主题中的分区个数, ReplicationFactor表示副本因子,下面的Leader表示Leader副本所在的brokerid等等

创建主题时主题名不能与已经存在的主题同名 ,否则会报错

20/07/02 18:34:45 ERROR admin.TopicCommand$: org.apache.kafka.common.errors.TopicExistsException: Topic 'test_gp' already exists.

可以使用if-not-exists参数来避免这个问题,如果有重名则不创建, 也不报错, 如果没有出现重名, 则会成功创建

[root@cloudera02 data]# kafka-topics --zookeeper cloudera02/kafka --create --topic test_gp --partitions 4 --replication-factor 2 --if-not-exists

主题名如果存在"." kafka会自动把"."转化为下划线"", 所以topic.1_2和topic_1.2创建的主题名是一样的, 会报冲突
kafka主题的命名不推荐以双下划线
_开头, 双下划线一般是kafka的内部主题, 也不能只有"."

查看主题

使用list 和describe 指令来查看主题
通过list可以查看当前所有可用的主题

kafka-topics --zookeeper cloudera02/kafka --list

使用describe查看单个或者多个主题的信息, 多个主题之间用逗号隔开

kafka-topics --describe --zookeeper cloudera02/kafka --topic test_gp,test_pg
Topic:test_gp   PartitionCount:4    ReplicationFactor:2 Configs:
    Topic: test_gp  Partition: 0    Leader: 79  Replicas: 79,78 Isr: 79,78
    Topic: test_gp  Partition: 1    Leader: 77  Replicas: 77,79 Isr: 77,79
    Topic: test_gp  Partition: 2    Leader: 78  Replicas: 78,77 Isr: 78,77
    Topic: test_gp  Partition: 3    Leader: 79  Replicas: 79,77 Isr: 79,77
Topic:test_pg   PartitionCount:3    ReplicationFactor:2 Configs:
    Topic: test_pg  Partition: 0    Leader: 77  Replicas: 77,78 Isr: 78,77
    Topic: test_pg  Partition: 1    Leader: 78  Replicas: 78,77 Isr: 78,77
    Topic: test_pg  Partition: 2    Leader: 77  Replicas: 77,78 Isr: 78,77

修改主题

主题创建好之后可以对其进行修改, 包括修改分区数等等, 使用alter指令

[root@cloudera02 data]# kafka-topics --zookeeper cloudera02/kafka --alter --topic test_gp --partitions 5

建议在一开始就设置好分区, 避免进行调整, 目前kafka只支持增加分区数, 不支持减小分区数

分区管理

优先副本的选举

分区使用多副本机制来提升可靠性,但只有leader副本对外提供读写

你可能感兴趣的:(kafka学习(4) 主题与分区)