kafka总结
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可以容纳多个Topic
5、topic
每条发布到kafka集群的消息都有一个类别,这个类别就叫做Topic
6、partition
分区,为了实现扩展性,一个非常大的Topic可以分布到多个Broker上,一个Topic可以分为多个Partition,每个Partition是一个有序的队列(分区有序,不能保证全局有序)
7、replica
副本Replication,为保证集群中某个节点发生故障,节点上的Partition数据不丢失,Kafka可以正常的工作,Kafka提供了副本机制,一个Topic的每个分区有若干个副本,一个Leader和多个Follower
8、leader
每个分区多个副本的主角色,生产者发送数据的对象,以及消费者消费数据的对象都是Leader
9、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 ACK
3、如果所有的副本都已经写入成功,再返还producer ACK
读
1、通过ZK,找到对应的partition的leader
2、通过ZK,找到consumer对应的offset
3、根据offset从leader拉取数据
根据全局的offset找segment,因为segment是根据全局offset来命令,通过二分法快速定位offset在那个segment
根据全局的offset转换到局部的offset
根据局部的offset去查找稀疏索引(index文件)
在log中遍历找到offset对应的数据
顺序往下读写
4、1.0版本后,消费者将offset自定义保存
8、kafka中的数据组成结构
topic
partition
log
存储producer生产的数据
index
timeindex
partition
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和follow
leader:读写数据
follow:同步数据,参与选举
leader和follow是针对分区,不是broker
分配分区的leader在不同的broker中,负载均衡
AR、ISR、OSR
AR:表示所有分区的副本
ISR:表示正在同步的副本
OSR:表示不在同步的副本
leader选举
所有的partition的leader由controller完成
根据ISR来选择一个新的leader
如果该partition的所有副本都宕机的情况下,则新的leader为-1
controller介绍
kafka启动时会在所有的broker中选择一个controller
controller是针对broker的
创建topic、或者添加分区、修改副本数之类的管理任务都是由controller完成
kafka分区的leader选举也是由controller决定的
controller选举
controller是高可用的,是用ZK来进行选举
一旦某个broker崩了,其他的broker会重新注册为新的controller
leader负载均衡
kafka引入了preferred replica的概念
在ISR列表中,第一个replica就是preferred replica
存放在broker的第一个分区就是preferred replica
可以手动均匀分配每个分区的leader