`
gaojingsong
  • 浏览: 1157143 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【Kafka 细节介绍】

阅读更多

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也不会从同步副本列表从移除该副本。

0
0
分享到:
评论

相关推荐

    kafka学习文档

    关亍 kafka 的实现细节,返主要就是讲 design 的部分:《细节上》、《细节下》 关亍 kafka 开収环境,scala 环境的搭建:《开収环境搭建》 数据生产者,producer 的用法:《producer 的用法》、《producer 使用注意...

    Kafka The Definitive Guide.pdf

    每个企业应用程序都会创建数据,无论是日志消息、度量、用户活动、传出消息还是其他什么。...通过详细的示例,您将了解Kafka的设计原则、可靠性保证、关键api和体系结构细节,包括复制协议、控制器和存储层。

    cpp-kafkabridge一个ApacheKafkaClientSDK

    kafkabridge 底层基于 librdkafka, 与之相比封装了大量的使用细节,简单易用,使用者无需了解过多的Kafka系统细节,只需调用极少量的接口,就可完成消息的生产和消费;

    kafka常考面试题2024年.zip

    每个问题都附有详细答案,帮助求职者深入理解Kafka的核心概念和技术细节。 适用人群:本套面试题适用于希望进入大数据领域、从事数据工程师、大数据开发、实时计算工程师等职位,以及对Kafka有深入了解需求的求职者...

    Kafk入门与实践

    《Kafka入门与实践》以Kafka 0.10.1.1版本以基础,对Kafka的基本组件的实现细节及其基本应用进行了详细介绍,同时,通过对Kafka与当前大数据主流框架整合应用案例的讲解,进一步展现了Kafka在实际业务中的作用和地位...

    消息队列kafka源码详细讲解分析

    关于kakfa消息对象源码分析最详解的讲解,更深刻的认识

    confluent-kafka-dotnet:Confluent的Apache Kafka .NET客户端

    可靠性-编写Apache Kafka客户端时,有很多细节需要正确处理。 我们将它们放在一个地方(librdkafka),并在所有客户(以及和 )中利用这项工作。 支持提供商业支持。 面向未来-由Kafka的创建者创建的Confluent,...

    Kafka从入门到源码分析原理课-视频教程网盘链接提取码下载 .txt

    课程分为理论和实践两部分,理论部分介绍Kafka架构、技术原理以及Kafka的功能拓展及应用,实践部分带领学员深入Kafka源代码,重点分析Kafka消息发布与订阅、存储、数据处理框架等技术细节。 视频大小:2.9G

    kafka-service-interface:公开Kafka生产者和消费者API的Docker服务

    实施细节: 公开Kafka发布回调网址 公开一个或多个Kafka消费者回调网址 包括失败的消息重试 包含无效的主题和回调网址 Docker撰写 回调格式 卡夫卡出版 { topic: 'topic.name', key: 'unique to spread evenly ...

    POC-kafka-messaging:使用Kafka消息代理进行异步消息传递的概念证明

    卡夫卡及其好处的简要介绍: : 安装和设置过程 为了运行此POC,需要安装Python3.7运行时。 还需要安装docker才能在本地运行kafka broker,以进行测试。 py -m pip install -r requirements.txt docker-compose ...

    大数据教程-Kafka的安装与配置.pdf

    大数据教程-Kafka的安装与配置,安装、部署细节详细步骤

    Confluent的Apache Kafka Golang客户端-Golang开发

    Confluent用于Apache ...可靠性-编写Apache Kafka客户端时,有很多细节需要正确处理。 我们将它们放在一个地方(librdkafka),并在所有客户中利用这项工作(还有confluent-kafka-python和confluent-kafka-dotnet)。

    一文带你吃透 Kafka 这些原理

    如果只是为了开发 Kafka 应用程序,或者只是在生产环境使用 Kafka,那么了解 Kafka 的内部工作原理不是必须的。...Kafka 是如何进行复制的Kafka 是如何处理来自生产者和消费者的请求的Kafka 的存储细节是怎样的 如

    Storm流计算项目:1号店电商实时数据分析系统-07.Kafka Java API 简单开发测试.pptx

    20.项目1-地区销售额-Web端完善和细节优化 21.项目1-地区销售额-项目发布及总结 22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码...

    Storm流计算项目:1号店电商实时数据分析系统-08.storm-kafka 详解和实战案例.pptx

    20.项目1-地区销售额-Web端完善和细节优化 21.项目1-地区销售额-项目发布及总结 22.项目1-地区销售额-项目需求分析和分区Trident Spout开发 23.项目1-地区销售额-Trident代码开发一 24.项目1-地区销售额-Trident代码...

    DoctorK:DoctorK是Kafka群集自动修复和工作负载平衡的服务

    Pinterest DoctorK 开放采购猎户座 根据DoctorK的经验,我们创建并开放了 ,这是一个功能更强大的系统,用于管理Kafka和其他分布式系统。 Orion解决了DoctorK的,并增加...设计细节可在。 设定指南 获取DoctorK代码 gi

    DeeperRenameField:Kafka connect Transform可以重命名架构中的深层字段

    DeeperRenameField Kafka connect Transform可以重命名架构中的深层字段细节它具有两个要配置的属性 1. rename.fieldname -> A dotted String representing full path to field whose name to be changed 2. rename....

    腾讯云Kafka海量服务自动化运营实践

    与用户自己部署Kafka相比,腾讯云CKafka无需用户关心Kafka集群细节,用户无需维护Kafka集群直接使用,同时为用户提供丰富的监控指标。由于腾讯云CKafka与社区Kafka的协议一致,用户只需要够买实例后便可无缝接入。...

    counters:Kafka&RocksDB提供准确的计数器

    用C ++编写的计数数据库,它使用Redis协议并通过Kafka复制。 从源头建造 确保已安装 查看库 确保您的子模块是最新的: git submodule update 构建项目: bazel build -c opt counters 运行它 请参阅./bazel-bin/...

Global site tag (gtag.js) - Google Analytics