前言
主题作为消息的归类,可以细分为一个或多个分区,分区看作是对消息的二次归类。
分区的划分不仅为Kafka提供了可伸缩性、水平扩展功能,还可以通过多副本机制来为Kafka提供数据冗余,以提高数据的可靠性。
从Kafka的底层实现来看,主题和分区都是逻辑上的概念,分区可以有一个或多个副本,每个副本对应一个日志文件。每个日志文件对应一个或多个日志分段。每个日志分段可以细分为索引文件、日志存储文件、快照文件等。
主题管理
主题的管理包括创建主题、查看主题信息、修改主题、删除主题等操作。
创建主题:broker端配置参数auto.create.topics.enable设置为true,当生产者向尚未创建的主题发送消息时,会自动创建一个分区数num.partitions(默认为1)、副本因子(default.replication.factor默认为1)的主题。 当一个消费者开始从未知主题读取消息时,或任意客户端向未知主题发送元数据请求时,都会创建一个相应的主题。
分区的管理
优先副本的选举、分区重分配、复制限流、修改副本因子
- 分区使用多副本机制来提高可靠性,但只有leader副本对外提供读写服务,而follower副本只负责在内部进行消息同步。为了有效治理负载失衡的情况,Kafka引入了优先副本概念(AR副本集合列表中的第一个副本)--分区平衡 生产环境中,不建议开启:leader.imbalance.per.broker.percentage参数,可能会引起负面的性能问题,引起客户端一定时间的阻塞
- 分区重分配:当集群中的一个节点宕机了,如果节点上的分区是单副本,那么这些分区就变成了不可用了。在节点恢复前必然数据丢失。如果是多副本,那么节点上的leader副本角色将会转移。
- 复制限流:分区重复配本质是:数据复制,先增加新的副本,然后进行数据同步,最后删除旧的副本。数据复制会占用额外的资源,如果重复配的数据量太大必然严重影响整体的性能,尤其是处于业务高峰期的时候,减少重分配的粒度,以小批次的方式来操作是一种可行的解决思路。