1、概述
kafka是⼀个分布式、分区的、多副本的、多订阅者的消息发布订阅系统(分布式MQ系统),可以⽤于搜索⽇志,监控⽇志,访问⽇志等kafka对消息保存是根据Topic进⾏归类,kafka集群有多个kafka实例组成,每个实例(server)成为broker。⽆论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可⽤性集群保存⼀些meta信息
2、消息队列的应⽤场景1、系统之间解耦合
耦合的状态表⽰当你实现某个功能的时候,是直接接⼊当前接⼝,⽽利⽤消息队列,可以将相应的消息发送到消息队列,这样的话,如果接⼝出了问题,将不会影响到当前的功能2、峰值压⼒缓冲
⾼流量的时候,使⽤消息队列作为中间件可以将流量的⾼峰保存在消息队列中,从⽽防⽌了系统的⾼请求,减轻服务器的请求处理压⼒3、异步通信
异步处理替代了之前的同步处理,异步处理不需要让流程⾛完就返回结果,可以将消息发送到消息队列中,然后返回结果,剩下让其他业务处理接⼝从消息队列中拉取消费处理即可
3、kafka的消费模式点对点传递模式
消息⽣产者发布消息到Queue队列中,通知消费者从队列中拉取消息进⾏消费。消息被消费之后则删除,Queue⽀持多个消费者,但对于⼀条消息⽽⾔,只有⼀个消费者可以消费,即⼀条消息只能被⼀个消费者消费。发布-订阅模式
利⽤Topic存储消息,消息⽣产者将消息发布到Topic中,同时有多个消费者订阅此topic,消费者可以从中消费消息,注意发布到Topic中的消息会被多个消费者消费,消费者消费数据之后,数据不会被清除,Kafka会默认保留⼀段时间,然后再删除。发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息
4、优点
可靠性:分布式的,分区,复制和容错
可扩展性:kafka消息传递系统轻松缩放,⽆需停机
耐⽤性:kafka使⽤分布式提交⽇志,这意味着消息会尽快能快速的保存在磁盘上,因此它是持久的性能:kafka对于发布和订阅都具有⾼吞吐量。即使存储了许多TB的消息,它也爆出稳定的性能kafka⾮常快:保证零停机和零数据丢失
5、⾼性能顺序读写
即使写到普通硬盘也能由很好的性能批量读写
每次传输量不会特别⼩,RTT(往返时间)的开销就会微不⾜道零拷贝
⽂件传输不经过⽤户空间,⽽直接在内核空间传输到⽹络
6、kafka架构1、producer
消息⽣产者,向kafka中发布消息的⾓⾊2、consumer
消息消费者,即从kafka中拉取消息消费的客户端3、consumer group
消费者组,消费者组是⼀组中存在多个消费者,消费者消费broker中当前topic的不同分区中的消息,消费者组之间互不影响,所有的消费者都属于某个消费者组,即消费者组是逻辑上的⼀个订阅者。某⼀个分区中的消息只能够⼀个消费者组中的⼀个消费者所消费4、broker
经纪⼈,⼀台Kafka服务器就是⼀个Broker,⼀个集群由多个Broker组成,⼀个Broker可以容纳多个Topic5、topic
每条发布到kafka集群的消息都有⼀个类别,这个类别就叫做Topic6、partition
分区,为了实现扩展性,⼀个⾮常⼤的Topic可以分布到多个Broker上,⼀个Topic可以分为多个Partition,每个Partition是⼀个有序的队列(分区有序,不能保证全局有序)7、replica
副本Replication,为保证集群中某个节点发⽣故障,节点上的Partition数据不丢失,Kafka可以正常的⼯作,Kafka提供了副本机制,⼀个Topic的每个分区有若⼲个副本,⼀个Leader和多个Follower8、leader
每个分区多个副本的主⾓⾊,⽣产者发送数据的对象,以及消费者消费数据的对象都是Leader9、follower
每个分区多个副本的从⾓⾊,实时的从Leader中同步数据,保持和Leader数据的同步,Leader发⽣故障的时候,某个Follower会成为新的Leader
⼀个Topic会产⽣多个分区Partition,分区中分为Leader和Follower,消息⼀般发送到Leader,Follower通过数据的同步与Leader保持同步,消费的话也是在Leader中发⽣消费,如果多个消费者,则分别消费Leader和各个Follower中的消息,当Leader发⽣故障的时候,某个Follower会成为主节点,此时会对齐消息的偏移量
7、kafka读写机制写
1、通过ZK,找到对应的partition的leader
2、开始写数据,同时为了保证数据不丢失,follow也会拉取数据,返还给leader ACK3、如果所有的副本都已经写⼊成功,再返还producer ACK读
1、通过ZK,找到对应的partition的leader2、通过ZK,找到consumer对应的offset3、根据offset从leader拉取数据
根据全局的offset找segment,因为segment是根据全局offset来命令,通过⼆分法快速定位offset在那个segment根据全局的offset转换到局部的offset
根据局部的offset去查找稀疏索引(index⽂件)在log中遍历找到offset对应的数据顺序往下读写
4、1.0版本后,消费者将offset⾃定义保存8、kafka中的数据组成结构topicpartitionlog
存储producer⽣产的数据indextimeindexpartition
9、消息不重复kafka⽣产者幂等性防⽌⽣产者重复数据原理PID
sequence number
10、消息不丢失broker数据不丢失
⽣产者通过分区的leader写⼊数据后,所有在ISR中的follow都会从leader中复制数据,保证数据不丢失,多副本机制⽣产者数据不丢失
通过ACK机制确保数据写⼊成功
⽣产者可以通过同步和异步两种⽅式发送数据
同步:发送⼀批数据给kafka后,等待kafka返回结果异步:发送⼀批数据给kafka后,只提供⼀个回调函数消费者数据不丢失
At-least once:⼀种数据可能会重复消费
Exactly- once:仅被消费⼀次,将offest和数据都保存在⼀个关系型数据库中,底层是通过关系型的数据库来保证有且仅有⼀次的消费11、kafka副本ack机制ack=0
不等待broker确认,直接发送下⼀条数据,性能最⾼,但是可能会丢失数据ack=1
等待leader确认接收后,才会发送下⼀条数据,性能中等ack=all/-1
等待所有已经将数据同步后,才回到发送下⼀条数据,性能最慢
12、分区的leader和followleader:读写数据
follow:同步数据,参与选举
leader和follow是针对分区,不是broker
分配分区的leader在不同的broker中,负载均衡AR、ISR、OSR
AR:表⽰所有分区的副本ISR:表⽰正在同步的副本OSR:表⽰不在同步的副本leader选举
所有的partition的leader由controller完成根据ISR来选择⼀个新的leader
如果该partition的所有副本都宕机的情况下,则新的leader为-1controller介绍
kafka启动时会在所有的broker中选择⼀个controllercontroller是针对broker的
创建topic、或者添加分区、修改副本数之类的管理任务都是由controller完成
kafka分区的leader选举也是由controller决定的controller选举
controller是⾼可⽤的,是⽤ZK来进⾏选举
⼀旦某个broker崩了,其他的broker会重新注册为新的controllerleader负载均衡
kafka引⼊了preferred replica的概念
在ISR列表中,第⼀个replica就是preferred replica存放在broker的第⼀个分区就是preferred replica可以⼿动均匀分配每个分区的leader
因篇幅问题不能全部显示,请点此查看更多更全内容