Kafka的Producer、Broker和Consumer之间采用的是一套自行设计的基于TCP层的协议。Kafka的这套协议完全是为了Kafka自身的业务需求而定制的,而非要实现一套类似于Protocol Buffer的通用协议。
基本数据类型
定长数据类型:int8,int16,int32和int64,对应到Java中就是byte, short, int和long。
变长数据类型:bytes和string。变长的数据类型由两部分组成,分别是一个有符号整数N(表示内容的长度)和N个字节的内容。其中,N为-1表示内容为null。bytes的长度由int32表示,string的长度由int16表示。
数组:数组由两部分组成,分别是一个由int32类型的数字表示的数组长度N和N个元素。
Kafka支持下面几种压缩方式,
压缩方式 编码
不压缩 0
Gzip 1
Snappy 2
LZ4 3
Kafka中读写message有如下特点:
写message
消息从java堆转入page cache(即物理内存)。
由异步线程刷盘,消息从page cache刷入磁盘。
读message
消息直接从page cache转入socket发送出去。
当从page cache没有找到相应数据时,此时会产生磁盘IO,从磁
盘Load消息到page cache,然后直接从socket发出去
Kafka高效文件存储设计特点
Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。
通过索引信息可以快速定位message和确定response的最大大小。
通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作。
通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间大小。
Kafka判断一个节点是否活着有两个条件:
1. 节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接。
2. 如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久。
Leader会追踪所有“同步中”的节点,一旦一个down掉了,或是卡住了,或是延时太久,leader就会把它移除。至于延时多久算是“太久”,是由参数replica.lag.max.messages决定的,怎样算是卡住了,怎是由参数replica.lag.time.max.ms决定的。
只有当消息被所有的副本加入到日志中时,才算是“committed”,只有committed的消息才会发送给consumer,这样就不用担心一旦leader down掉了消息会丢失。Producer也可以选择是否等待消息被提交的通知,这个是由参数request.required.acks决定的。
Kafka保证只要有一个“同步中”的节点,“committed”的消息就不会丢失。
Kafaka动态维护了一个同步状态的副本的集合(a set of in-sync replicas),简称ISR,在这个集合中的节点都是和leader保持高度一致的,任何一条消息必须被这个集合中的每个节点读取并追加到日志中了,才回通知外部这个消息已经被提交了。因此这个集合中的任何一个节点随时都可以被选为leader.ISR在ZooKeeper中维护。ISR中有f+1个节点,就可以允许在f个节点down掉的情况下不会丢失消息并正常提供服。ISR的成员是动态的,如果一个节点被淘汰了,当它重新达到“同步中”的状态时,他可以重新加入ISR.这种leader的选择方式是非常快速的,适合
是什么原因导致分区的副本与leader不同步
一个副本可以不同步Leader有如下几个原因
慢副本:在一定周期时间内follower不能追赶上leader。最常见的原因之一是I / O瓶颈导致follower追加复制消息速度慢于从leader拉取速度。
卡住副本:在一定周期时间内follower停止从leader拉取请求。follower replica卡住了是由于GC暂停或follower失效或死亡。
新启动副本:当用户给主题增加副本因子时,新的follower不在同步副本列表中,直到他们完全赶上了leader日志。
一个partition的follower落后于leader足够多时,被认为不在同步副本列表或处于滞后状态。在Kafka-0.8.2.x中,副本滞后判断依据是副本落后于leader最大消息数量(replica.lag.max.messages)或replicas响应partition leader的最长等待时间(replica.lag.time.max.ms)。前者是用来检测缓慢的副本,而后者是用来检测失效或死亡的副本
复制(Replication)
1)一个partition的复制个数(replication factor)包括这个partition的leader本身。
2)所有对partition的读和写都通过leader。
3)Followers通过pull获取leader上log(message和offset)
4)如果一个follower挂掉、卡住或者同步太慢,leader会把这个follower从”in sync replicas“(ISR)列表中删除。
5)当所有的”in sync replicas“的follower把一个消息写入到自己的log中时,这个消息才被认为是”committed“的。
6)如果针对某个partition的所有复制节点都挂了,Kafka选择最先复活的那个节点作为leader(这个节点不一定在ISR里)。
负载均衡
1)producer可以自定义发送到哪个partition的路由规则。默认路由规则:hash(key)%numPartitions,如果key为null则随机选择一个partition。
2)自定义路由:如果key是一个user id,可以把同一个user的消息发送到同一个partition,这时consumer就可以从同一个partition读取同一个user的消息。
异步批量发送
批量发送:配置不多于固定消息数目一起发送并且等待时间小于一个固定延迟的数据。
副本配置规则
真正重要的事情是检测卡或慢副本,这段时间follower replica是“out-of-sync”落后于leader。在服务端现在只有一个参数需要配置replica.lag.time.max.ms。这个参数解释replicas响应partition leader的最长等待时间。检测卡住或失败副本的探测——如果一个replica失败导致发送拉取请求时间间隔超过replica.lag.time.max.ms。Kafka会认为此replica已经死亡会从同步副本列表从移除。检测慢副本机制发生了变化——如果一个replica开始落后leader超过replica.lag.time.max.ms。Kafka会认为太缓慢并且会从同步副本列表中移除。除非replica请求leader时间间隔大于replica.lag.time.max.ms,因此即使leader使流量激增和大批量写消息。Kafka也不会从同步副本列表从移除该副本。
相关推荐
它通过简化配置和提供高度抽象的API,使开发者能更专注于业务逻辑而非底层细节。 要基于Spring Boot创建Kafka消费者,我们需要以下步骤: 1. **依赖引入**:在`pom.xml`文件中添加Spring Boot和Spring Kafka的依赖...
**Kafka概述** Kafka是由LinkedIn开发并贡献给Apache软件基金会的一个开源消息系统,它是一个高性能、可扩展的分布式消息中间件。...通过深入学习Kafka尚硅谷.pdf,你可以更全面地了解Kafka的实践应用和技术细节。
Kafka中文API使用介绍及配置的目的是为了帮助中文使用者了解如何使用Kafka的API,并且能够搭建相应的环境以及进行基本的配置。 首先,介绍Kafka的基本应用场景,它通常被用于两大类应用:构建实时的流数据管道...
KafkaConsumer的API和配置细节可以参考KafkaConsumer相关文档。消费者的迭代器会返回ConsumerRecords,这是简单命名元组,用于暴露基本消息属性,如topic、partition等。 开发者在使用kafka-python时需要注意版本...
3. **分区分配策略**:Kafka-clients提供了多种分区分配策略,如`RangeAssignor`和`RoundRobinAssignor`,在源码中可以详细了解这些策略的实现细节。 二、生产者API 1. **消息发送**:`Producer.send()`方法是生产...
"Kafka Producer拦截器与Kafka Streams" Kafka Producer拦截器是Kafka 0.10版本引入的主要用于实现clients端的...但是,在使用这些工具时,需要注意一些重要的细节,如线程安全、错误处理等,以确保系统的稳定运行。
《Kafka技术内幕》这本书深入剖析了Apache Kafka这一分布式流处理平台的设计原理和实现细节,旨在帮助读者理解Kafka的核心机制,并能有效地运用到实际项目中。以下是对Kafka源码设计与实现的一些关键知识点的详细...
### Kafka学习之路——详解Kafka原理与架构 #### 一、Kafka简介 Kafka是一款由LinkedIn开发并开源的...通过对Kafka核心概念和技术细节的理解,我们可以更好地利用Kafka来解决实际问题,提高数据处理的效率和可靠性。
关亍 kafka 的实现细节,返主要就是讲 design 的部分:《细节上》、《细节下》 关亍 kafka 开収环境,scala 环境的搭建:《开収环境搭建》 数据生产者,producer 的用法:《producer 的用法》、《producer 使用注意...
Kafka的快速开始部分为初学者提供了一种简便的入门方式,而其生态系统的介绍则展示了Kafka与周边技术的集成,这对于建立大规模的、复杂的数据处理系统非常重要。 总的来说,Kafka文档中所涵盖的知识点非常丰富,既...
下面详细介绍各个知识点。 首先,虚拟机的安装是搭建Kafka集群的基础。文中提到了使用VMWare来安装三台虚拟机,并分配了固定的NAT IP地址,分别是***.***.**.***、***.***.**.***和***.***.**.***。为了方便管理,...
1. **安全概述**:介绍 Kafka 安全框架的整体架构。 2. **加密与认证**:通过 SSL 协议实现数据加密传输和双向认证。 3. **授权与 ACLs**:定义了访问控制列表,控制用户对资源的操作权限。 4. **安全特性集成**:...
8. 源码解析:通过对关键模块的源码分析,帮助读者深入理解Kafka的设计思想和实现细节。 总之,《Kafka技术内幕》是一本深入浅出的Kafka指南,适合对分布式系统和大数据感兴趣的开发者阅读,无论是初学者还是有经验...
《Kafka权威指南》详尽地介绍了Kafka的基本概念、架构设计以及实际操作。书中首先会讲解Kafka的起源和设计理念,然后深入到Kafka的组件,如Producers(生产者)、Brokers(代理)、Consumers(消费者)和Topics...
在C++中与Kafka交互时,通常会依赖于Kafka提供的SDK或者API,这些接口封装了与Kafka服务器通信的细节。 描述中提到,这些文件是编译后的动态库文件,包含`.h`头文件和`.so`(Shared Object)文件。`.h`文件包含了...
本文将详细介绍如何为 Kafka 配置 Kerberos 安全认证,包括安装 Kerberos 服务、配置 Zookeeper 的 Kerberos 认证以及最终配置 Kafka 的 Kerberos 认证。 #### 二、整体架构设计 Kerberos 的部署通常需要一个中心化...
### Kafka系列解读知识点总结 #### 一、Apache Kafka简介与设计理念 ...以上内容涵盖了Kafka的基础概念、核心功能、部署配置、开发实践等多个方面,对于理解Kafka的工作原理及其实现细节提供了全面的指导。
本书不仅涵盖了Kafka Streams的基础知识,还涉及了高级主题和技术细节,是学习Kafka Streams不可或缺的资源之一。 #### 二、Kafka Streams简介 Kafka Streams是一个用于构建应用程序或微服务的数据流处理库,它...
《Kafka技术内幕:图文详解Kafka源码设计与实现》这...通过对《Kafka技术内幕:图文详解Kafka源码设计与实现》的阅读,读者能够全面了解Kafka的设计思想,深入掌握其实现细节,并能有效应用于实际的大数据处理场景中。