分区及副本
主题是逻辑上的概念,它还可以细分为多个分区,Kafka中分区可以分布在不同的Broker上,也就是说一个主题可以横跨多个Broker,以此来提供比单个broker更强大的性能
offset是消息在分区的唯一标识,Kafka通过它来保证消息在分区内的顺序性,不过offset并不是跨分区的,也就是说Kafka保证分区有序而不是主题有序
每一条消息被发送到Broker之前,会根据分区规则选择存储到哪个具体的分区。如果分区规则设定的合理,所有消息可以被均匀地分配到不同的分区中
Kafka为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。同一分区的不同副本中保存的相同的消息(在同一时刻副本间并非完全一样),副本之间是一主多从的关系,其中leader副本负责处理读写请求,follower副本之负责与leader副本的消息同步。副本处于不同的broker中,当leader副本出现故障时,从follower副本中重新选举新的leader副本对外提供服务。
分区中所有副本统称为AR(Assigned Replicas)
所有与ledaer副本保持一定程度上同步的副本(包括leader副本在内)组成ISR(In-Sync Replicas)
leader副本负责维护和跟踪ISR集合中所有follower副本的滞后状态,当follower副本落后太多或失效时,leader副本会把它从ISR集合中剔除。如果OSR(Out-of-Sync Replicas)集合中有follower副本追上来了leader副本,那么ledaer副本会把它从OSR转移到ISR。默认情况下,当ledaer副本发生故障时,只有在ISR集合中才有资格被选举为新的leader。
LEO与HW
ISR与HW(High Watermark)和LEO(Log End Offset)也有紧密的关系
HW标识了一个特定的消息偏移量offset,消费者只能拉到这个offset之前的消息
LEO标识当前日志文件下一条待写入消息的offset,相当于当前日志分区中最后一条消息的offset + 1
分区ISR集合中每个副本都会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW
假设否个分区ISR集合中有3个副本,此时分区的LEO和HW都为3。消息3和消息4从生产者发出之后会被存入ledaer副本
消息写入leader副本之后,follower副本会发送拉取请求来拉取消息3和消息4进行消息同步
在同步过程中,不同的follower副本的同步效率也不尽相同。在某一个时刻,第一个follower完全跟上了leader副本而第二个follower只同步了消息3,如此leader副本的LEO为5,follower1的LEO为5,follower2的LEO为4,那么当前分区的HW取最小值4,此时消费者可以消费到offset为0至3之间的消息
服务端配置
log.dir
和log.dirs
:配置Kafka日志文件的存放的根目录,默认/tmp/kafka-logs
message.max.bytes
:指定broker所能接收消息的最大值,默认1000012B,约等于976.6KB。如果需要修改这个参数,那么还要考虑max.request.size
(客户端参数)、max.message.bytes
(topic端参数)