一个topic对应多个partition,这些partition分布在多个broker上,多个broker一起提供kafka服务。

在kafka中,Topic是一个存储消息的逻辑概念,可认为是一个消息的集合。而物理上,不同Topic的消息分开存储,每个Topic可划分多个partition,同一个Topic下的不同的partition包含不同消息。每个消息被添加至分区时,分配唯一offset,以此保证partition内消息的顺序性。

并且,kafka通过多副本复制技术,实现kafka集群的高可用和稳定性。每个partition都会有多个数据副本,每个副本分别存在于不同的broker。所有的数据副本中,有一个数据副本为Leader,其他的数据副本为follower。在kafka集群内部,所有的数据副本皆采用自动化的方式进行管理,并且确保所有的数据副本的数据皆保持同步状态。不论是producer端还是consumer端发往partition的请求,皆通过leader数据副本所在的broker进行处理。当broker发生故障时,对于leader数据副本在该broker的所有partition将会变得暂时不可用。Kafka将会自动在其他数据副本中选择出一个leader,用于接收客户端的请求。

在kafka的broker中,每个分区都会对照着文件系统的一个目录。在kafka的数据日志文件目录中,每个日志数据段都会分配两个文件,一个索引文件和一个数据文件。当前版本的kafka,每个broker会为每个日志段文件打开一个index文件句柄和一个数据文件句柄。因此,随着partition的增多,需要底层操作系统配置更高的文件句柄数量限制。这更多的是一个配置问题。

kafka中关于topic、broker及partition相关参数的几点说明:

1、num.partitions参数

默认值为1,可增加topic的partition数量,不可减少其个数。kafka集群通过partition对topic进行横向扩展,当有新broker加入kafka集群,可通过hash调用partition个数负载均衡。

2、broker之间分区分配

保证在broker之间平均分布partition副本,每个副本分布在不同的broker上,broker分布可用轮询或哈希。

3、partition不完全首领选举

对于副本机制,在 broker 级别有一个可选的配置参数 unclean.leader.election.enable,默认值为 fasle,代表禁止不完全的首领选举。这是针对当首领副本挂掉且 ISR 中没有其他可用副本时,是否允许某个不完全同步的副本成为首领副本,这可能会导致数据丢失或者数据不一致,在某些对数据一致性要求较高的场景 (如金融领域),这可能无法容忍的,所以其默认值为 false,如果你能够允许部分数据不一致的话,可以配置为 true。

4、增加分区

增加分区主要是为了扩展topic容量或降低单个partition的吞吐量。基于key区分partition的topic,改变了partition数量,key与partition之间的映射关系也会发生变化。

标签: none

添加新评论