本文主要介绍kafka相关系列概念,为之后深入理解kakfa相关知识做一简单的铺垫
kafka作用:
目前来看,kafka主要被用做消息系统,存储系统以及一些流式处理相关,其中消息系统算是kafka最常用的一个场景。
kafka作为消息系统自然和传统的消息系统一样都具备基本的系统解耦,削峰填谷,冗余存储,异步通信等功能,与一般消息系统不同的是,kafka提供了一般消息系统难以实现的消息顺序性保障以及回溯消费的能力.这些会在后面的系列文章中一一讨论。
kafka可以作为一个存储系统来使用,这是因为kafka向具有消息持久化的功能和多副本机制,可以将消息持久化到磁盘,不过相比较而言,大部分场景还是使用kafka作为消息中间件的场景比较多,毕竟目前可选的存储很多,而kafka也更擅长做其他方面的工作。
至于流式处理相关的能力暂时不做介绍,后续可以单独作为一个点来聊。
kafka基本概念解析
如图所示,kafka主要有以下4个组成部分
1.producer: producer,也叫生产者,负责发送消息到broker。
2.broker: kafka机器实例,也可以是一个kafka进程,多个kafka机器组成一个kafka集群。
3.zookeeper: 管理集群相关信息,例如控制器选举等工作,元数据存储等工作。
4.consumer: consumer,也叫消费者负责从broker拉取消息。
以上4个组件为kafka基本组成的四大要素,想要理解kafka基础逻辑还需要了解如下几个核心概念
1.topic: kafka发送消息是以topic作为基础归类,每条消息都需要指明一个topic进行发送或消费。
2.partition: topic可以被分为多个分区,每个分区属于一个topic,同一个topic下不同的分区存储不同的消费内容,也就是说每条消息只归属于一个partition,由分区分配工作来选择一条消息具体被存储到哪一个分区。由此可见,如果分区规则合理,那么整个topic可以达到一定程度的均衡。
3.offset: 每条消息在partition中会被唯一的分配一个offset,offset是消息在分区内的唯一标识,kafka通过offset来保证消息在单个partition中有序性,由于offset是单个partition的概念,所以在多个partition中无法提供有序访问。
4.replica: 副本机制,每个partition可以对应1到多个replica,通过增加replica数量可以提高集群的容灾能力,同一个partition中不同的副本中保存的是相同的消息.多个replica之间为leader和follower的关系(也就是一主多从),其中follower节点只负责从leader节点同步消息,leader节点对外提供读写能力,具体这么设计的原因在后续文章会做详细总结。
5.AR: partition中所有的副本(leader+follower)组成AR集合。
6.ISR: partition中所有与leader副本保持一定程度同步的follower组成ISR(也包括leader)。
7.OSR: partition中除了ISR集合的所有副本,从概念也可以看出AR=ISR+OSR。 leader副本接受到外界消息,follower副本开始从leader副本拉取消息进行同步,同步过程中follower相对于leader来说会有一定的滞后,leader负责维护和跟踪follower的滞后情况,动态的维护ISR和OSR集合,也就是说在ISR中和OSR中的副本有可能会动态的替换,当ISR中的副本同步leader副本落后的时候会被踢出ISR到OSR中,同样的OSR中的副本也有可能因为追上leader节点而进入ISR集合,默认情况只有ISR中的副本在leader发生故障时可以竞选leader.当然也可以通过一定的配置打破(后面会介绍,但是极度不建议)。
8.HW: 高水位,代表了当前partition能被consumer拉到的最大offset。
9.LEO: 每个副本各自维护当前可被写入的下一条消息的offset,leader副本和所有ISR种最小的LEO为该partition的HW,如下图所示:
某一时刻leader副本和follower1副本保持完全同步的状态,两个副本的LEO都为5(注意8中LEO的概念,这里不是4而是5),但是follower2为4,所以此时partition的HW为4,那么消费者可以消费offset为0-3的消息.直到某个时间点follower2的同步状态追上的leader和follower1副本,那么此时集群HW为5,消费者可以消费partition的offset为0-4的消息。