Kafka相关知识点
kafka是分布式发布-订阅消息系统,是一个分布式,可划分的,冗余备份的持久性的日志服务,主要用于处理流式数据
为什么要使用kafka,为什么要使用消息队列
缓冲和削峰:尚有数据有突发流量,或下游没有足够多的机器来保证冗余,kafka在中间起到一个缓冲的作用,把消息暂存在kafka总分,下游服务就可以按照自己的节奏进行慢慢处理。
解耦和扩展性:消息队列可作为一个接口层,解耦重要的业务流程,只需要遵守约定,针对数据编程即可获取扩展能力。
冗余:可采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以即使消费端业务短时间死掉,也不会影响主要业务的正常进行。
异步通信:消息队列允许用户把消息放入队列,但不立即处理它,想向队列中放多少消息就放多少消息,然后在需要的时候再去处理他们。
kafka的相关术语
produce不在zookeeper中注册,消费者和kafka在zookeeper中注册。
由图可得,每一台kafka服务器为一个broker,broker中可以容纳多个topic,每个topic又有多个分区,分区可以存储在不同的broker,每个分区都有一个leader和多个follower副本。为保证安全,leader副本和follower副本一般放在不同的broker,这样一个broker宕机,其他broker上的follower或leader还存活,通过controller选举新的leader,还可以继续工作
broker
broker是消息代理,producer往broker里指定的topic中写消息,consumer从broker里面拉取指定topic的消息,然后进行业务处理,broker在中间起一个代理保存消息的中转站。一台kafka服务器就是一个broker,也就是一个代理,一个broker可以容纳多个topic。一个集群由多个broker组成,每个代理有一个非负整id,且在整个集群中id唯一
topic:
消息的分类,生产者将消息发送到特定主题,消费者订阅该主题或主题的分区消费
patition分区
一个主题可分成多个分区,每个分区由一系列有序,不可变的消息组成,是一个有序队列,每个分区物理上可对应一个文件夹,分区的命名规则为主题名_分区编号。分区编号中只有一个副本对外提供服务,通过zookeeper。
zookeeper的作用
zookeeper是一个分布式的协调组件,早期用zk做meta信息存储,consumer的消费状态,group的管理记忆offset的值,考虑到zk本身的因素以及可能存在单点问题,新版本中弱化了zk的作用,新consumer使用了kafka内部的group coordination协议,减少了对zk的依赖。但broker依然依赖zk,zk在kafka中还用来选举controller和检测broker是否存活等。
replica副本:leader,follower
同一个分区有多个副本,目的是为了冗余,一高可用性,需要保证副本的一致性。kafka会选分区的一个副本作为leader副本,其他作为follower副本,只有leader副本处理读写,follower只从leader上复制数据
offset偏移量
发布到分区的消息会追加到日志文件的尾部,每条消息在日志文件中的位置都会对应一个按序递增的偏移量,偏移量不表示消息在磁盘的位置,kafka几乎不允许随机读写,消费者可以指定偏移量开始位消费。
日志段
日志被划分为多个日志段,是日志对象分片的最小单位,和日志对象一样,日志段也是逻辑概念,一个日志段对应磁盘上一个具体日志文件和两个索引文件。日志以.log结尾,.index偏移量索引文件,.timeindex消息时间戳索引文件
消费者和消费者组
消费者通过拉方式获取数据,每个消费者属于一个消费者组,同一个主题消息只能被消费者组中的一个消费者消费。
一个topic为一类消息,每个topic被分成多个partition,每个par