kafka架构梳理

公司一直在用kafka,但是只用到了kafka的部分功能。kafka号称单机可以支持百万的吞吐量。所以想系统学习kafka是如何支持百万吞吐量的。网上的资料嘛,鱼龙混杂,还是要买本书,系统的看一下。我正在看的书是朱忠华所著<深入理解Kafka-核心设计与实践原理>。写的挺好的,确如书名所说,有原理有实践。大家可以买来看一下
为了便于记忆。引用书里的内容,梳理一下kafka的机构。

kafka核验概念
kafka的架构里引入了3个概念
1 .生产者:发送消息的一方,生产者生产消息,然后将其投递到kafka服务端
2 .消费者:接收消息的一方,消费者连接到kafka上,接收kafka的消息,对消息进行处理
3 .broker:每一个kafka实例或者一个kafka节点都可以看作一个broker。如果机器上只有一个kafka节点,也可以称这台机器为kafka服务器。多个broker组成kafka集群
kafka中还有两个特别重要的概念,主题与分区。
kafka中的消息是以主题为单位进行归类。生产者负责将消息发送到主题中(每一条消息都要指定主题)。消费者订阅主题,接收主题中的消息进行处理
kafka的主题只是一个逻辑的概念,它还可以细分为很多分区,分区可以看作一个可以追加消息的日志,消息都是追加到日志文件的尾部。
借用书中的图:
kafka架构梳理_第1张图片
同一主题下的不同分区的消息是不同的。分区中的每一条消息都会有一个offset值,偏移量。kafka通过offset来保证消息在分区中的顺序性。注意:消息只是在单分区中有序,多个分区的消息是无序的
每一条消息在发往主题的时候,根据分区规则算好要发往的分区。如果一个分区只对应一个文件的话,I/O的瓶颈很容易成为这个主题的瓶颈。分区很好的解决了这个问题,因为分区可以位于不同的broker节点上,所以可以实现水平扩展。在一定范围内,分区数越多,kafka的吞吐量越高。
kafka在分区的基础上,又引入了副本的概念,一个分区可以对应多个副本,多个副本之间的消息是一样的。为了实现容灾,一个broker节点上至多只能有一个自己的副本。副本之间是“一主多从”的关系,一个leader副本、多个follower副本。leader副本负责处理读写请求,follower副本只用来和leader副本的消息同步。当leader副本失效时,kafka从follower副本中选出一个作为新的leader副本。
kafka的多副本结构图如下:该broker集群有4个broker节点。某个主题有3个分区,每个分区有3个副本,1个leader副本,1个follower副本
kafka架构梳理_第2张图片
kafka消费端也具备一定的容灾能力。消费者从kafka服务端拉取消息进行消费,并在kafka服务端保存消费的位置。当消费者宕机,重新上线,可以根据之前保存的消息位移再次拉取消息进行消费。
AR:所有的副本统称AR
ISR:与leader副本保持一定的消息同步的副本。一定的范围,可以通过参数配置
OSR:与leader副本滞后过多的副本
AR=ISR+OSR
HW:高水位,它标识了一个特殊的消息偏移量,消费者只能拉取到这个offset之前的消息
LEO:下一条待写入消息的offset
HW和LEO的位置如图:
kafka架构梳理_第3张图片
灰色部分是消费者可以消费的消息。
ISR列表中最小的LEO就是分区的HW,消费者只能拉取HW之前的消息。kafka这么设计的原因很简单。保证消息的一致性
kafka的topic和分区都是逻辑上的概念,只有副本才是真正的物理概念,每一个副本都对应着一个或者多个日志文件
以上,就是我整理的关于kafka的架构知识,根据后面所学所用会持续更新。路过的大神如果觉着哪里不对,希望不吝指正,谢谢。
后面会继续学习书中所写的生产者、消费者、日志存储等章节,会提炼其中的内容进行更新

你可能感兴趣的:(kafka)