您的当前位置:首页正文

kafka总结

2021-03-03 来源:爱go旅游网
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可以容纳多个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

因篇幅问题不能全部显示,请点此查看更多更全内容