kafka概念

来源:《Apache Kafka 实战》胡夕

kafka: 消息引擎 + 流式处理平台kafka streams = 流式处理框架
kafka核心架构
-生产者发送消息给kafka服务器。
-消费者从kafka服务器读取消息。
-kafka服务器依托ZooKeeper集群进行服务的协调管理。

kafka的消息是用二进制方式-字节数组ByteBuffer保存,且是结构化的消息。
kafka自己设计了一套二进制的消息传输协议。
最常见的两种消息引擎范型:消息队列模型和发布/订阅模型,kafka同时支持这两种消息引擎模型。

borker-kafka服务器
producer-生产者
consumer-消费者
partition-分区
replica-副本
topic-主题
publisher-发布者
subscriber-订阅者


消息
消息:由消息头部、key和value组成。
消息头部:包括CRC32校验码、版本号、属性(一位-压缩类型)、时间戳、键长度和消息体长度等信息。
-key:消息键,对消息做partition时使用,即决定消息被保存在某topic下的哪个partition。
-value:消息体,保存实际的消息数据。
-timestamp:消息发送时间戳,用于流式处理及其他依赖时间的处理语义。如果不指定则取当前时间。

topic主题、partition分区
topic只是一个逻辑概念,代表了一类消息,也可以认为是消息发送到的地方。
kafka的topic通常被多个消费者订阅。
kafka采用topic-partition-message三级结构来分散负载。
kafka的topic有若干个partition组成。
kafka的partition是不可修改的有序消息序列或者说是有序的消息日志,每个partition有自己的partition号,从0开始。
用户对partition唯一能做的就是在消息序列的尾部追加写入消息。
partition上的每条消息都会被分配一个唯一的序列号-称为位移offset,从0开始顺序递增的整数。
kafka的一条消息其实就是一个<topic,partition,offset>三元组,通过该三元组可以在kafka集群中找到唯一对应的那条消息。

副本replica 

副本分为两类:领导者副本leader replica和追随者副本follower replica。

follow replica是不能提供服务非客户端的,也就是说不负责响应客户端发来的消息写入和消息消费请求。只是被动地向领导者副本获取数据,而一旦leader replica所在的broker宕机了,kafka会从剩余的replica中选举出新的leader replica继续提供服务。

kafka保证同一个partition的多个replica一定不会分配在同一台broker上。

ISR

全称in-sync replica,意思是与leader replica保持同步的replica集合。

kafka为partition动态维护一个replica集合。该集合中的所有replica保持的消息日志都与leader replica保持同步状态。只有这个集合中的replica才能被选举为leader replica,也只有该集合中所有replica都接收到了同一条消息,kafka才会将该消息置于“已提交”状态,即认为这条消息发送成功。

kafka的设计初衷就是为了解决互联网公司超大量级数据的实时传输。
设计之初就需要考虑以下4个问题:
吞吐量/延时、消息持久化、负载均衡和故障转移、伸缩性。

吞吐量/延时
吞吐量:某种处理能力的最大值。
kafka的吞吐量,就是每秒能够处理的消息数或者每秒能够处理的字节数。吞吐量越大越好。

延时:指一段时间间隔。
kafka的延时,表示客户端发起请求与服务器处理请求并发送响应给客户端之间的这一段时间。延时越短越好。

实现高吞吐量、低延时方法
-大量使用操作系统页缓存,内存操作速度快且命中率高。
-kafka不直接参与物理I/O操作,而是交由最擅长此事的操作系统来完成。
-采用追加写入方式,摒弃了缓慢的磁盘随机读/写操作。
-使用以sendfile为代表的零拷贝技术加强网络间的数据传输效率。

每次写入操作都只是把数据写入到操作系统的页缓存中,然后由操作系统自行决定什么时候把页缓存中的数据写到磁盘上。kafka会持久化所有数据到磁盘上。
kafka在设计时采用了追加写入消息的方式,即只能在日志文件末尾追加写入新的消息,且不允许修改已写入的消息,属于典型的磁盘顺序访问性操作,速度相当于内存随机访问。
kafka在读取消息时会首先尝试从操作系统的页缓存中读取,如果命中便把消息经页缓存直接发送到网络的socket上。这个过程就是利用Linux平台的sendfile系统调用实现的,实现技术就是零拷贝。
kafka大量使用页缓存,故读取消息时大部分消息很有可能依然保存在页缓存中,因此可以直接命中缓存。


消息持久化
kafka持久化消息,就是把消息持久化到磁盘上。
kafka是把所有消息立即写入文件系统的持久化日志中,之后kafka服务器才会返回结果给客户端通知它们消息已被成功写入。这样做既实时保存了数据,又减少了kafka程序对内存的消耗,从而将节省出的内存留给页缓存使用,进一步提升了整体性能。
好处:解耦消息发送与消息消费;实现灵活的消息处理,对于已经处理过的消息可以在未来的某个时间点被重新处理一次。


负载均衡和故障转移
负载均衡:让系统的负载根据一定的规则均衡地分配在所有参与工作的服务器上,从而最大限度地提升系统整体的运行效率。
kafka通过智能化的分区领导者选举来实现负载均衡,可以在集群的所有机器上以均等机会分散各个partition的leader。

故障转移:当服务器意外中止时,整个集群可以快速地检测到该失效failure,并立即将该服务器上的应用或服务自动转移到其他服务器上。
故障转移通常是以“心跳”或“会话”的机制来实现的,即主服务器与备份服务器之间的心跳无法维持或主服务器注册到服务中心的会话超时过期,那么就认为主服务器已无法正常运行,集群会自动启动某个备份服务器来替代主服务器的工作。
kafka服务器支持故障转移的方式就是使用会话机制。
每台kafka服务器启动后会以会话的形式把自己注册到Zookeeper服务器上。一但该服务器运转出现问题,与ZooKeeper的会话便不能维持从而超时失效,此时kafka集群会选举出另一台服务器来完全替代这台服务器继续提供服务。

伸缩性scalability
伸缩性:表示向分布式系统中增加额外的计算资源(比如CPU、内存、存储或带宽)时吞吐量提升的能力。
kafka实现线性扩容的方法:每台kafka服务器上的状态统一交由zookeeper保管,解决了阻碍线性扩容的因素-状态的保存。

kafka使用场景

消息传输、网址行为日志追踪、审计数据收集、日志收集、流式处理-kafka streams...

kafka通常把生产者producer和消费者consumer统称为客户端clients,这是与服务端broker相对应的。

猜你喜欢

转载自www.cnblogs.com/xl717/p/11684500.html