kafka系统设计开篇

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg

来源 | 靳刚同学

MQ(消息队列)是跨进程通信的方式之一,可理解为异步rpc,上游系统对调用结果的态度往往是重要不紧急。使用消息队列有以下好处:业务解耦、流量削峰、灵活扩展。接下来介绍消息中间件Kafka。

Kafka是什么?

Kafka是一个分布式的消息引擎。具有以下特征

  1. 能够发布和订阅消息流(类似于消息队列)

  2. 以容错的、持久的方式存储消息流

  3. 多分区概念,提高了并行能力

Kafka架构总览

640?wx_fmt=png

Topic

消息的主题、队列,每一个消息都有它的topic,Kafka通过topic对消息进行归类。Kafka中可以将Topic从物理上划分成一个或多个分区(Partition),每个分区在物理上对应一个文件夹,以”topicName_partitionIndex”的命名方式命名,该dir包含了这个分区的所有消息(.log)和索引文件(.index),这使得Kafka的吞吐率可以水平扩展。

Partition

每个分区都是一个 顺序的、不可变的消息队列, 并且可以持续的添加;分区中的消息都被分了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是唯一的。

producer在发布消息的时候,可以为每条消息指定Key,这样消息被发送到broker时,会根据分区算法把消息存储到对应的分区中(一个分区存储多个消息),如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡。

640?wx_fmt=jpeg


Broker

Kafka server,用来存储消息,Kafka集群中的每一个服务器都是一个Broker,消费者将从broker拉取订阅的消息

Producer

向Kafka发送消息,生产者会根据topic分发消息。生产者也负责把消息关联到Topic上的哪一个分区。最简单的方式从分区列表中轮流选择。也可以根据某种算法依照权重选择分区。算法可由开发者定义。

Cousumer

Consermer实例可以是独立的进程,负责订阅和消费消息。消费者用consumerGroup来标识自己。同一个消费组可以并发地消费多个分区的消息,同一个partition也可以由多个consumerGroup并发消费,但是在consumerGroup中一个partition只能由一个consumer消费

CousumerGroup

Consumer Group:同一个Consumer Group中的Consumers,Kafka将相应Topic中的每个消息只发送给其中一个Consumer

Kafka producer 设计原理

一、发送消息的流程

640?wx_fmt=png

1.序列化消息&&.计算partition

根据key和value的配置对消息进行序列化,然后计算partition:

ProducerRecord对象中如果指定了partition,就使用这个partition。否则根据key和topic的partition数目取余,如果key也没有的话就随机生成一个counter,使用这个counter来和partition数目取余。这个counter每次使用的时候递增。

2发送到batch&&唤醒Sender 线程

根据topic-partition获取对应的batchs(Dueue<ProducerBatch>),然后将消息append到batch中.如果有batch满了则唤醒Sender 线程。队列的操作是加锁执行,所以batch内消息时有序的。后续的Sender操作当前方法异步操作。

640?wx_fmt=png

640?wx_fmt=png

3.Sender把消息有序发到 broker(tp replia leader)

3.1 确定tp relica leader 所在的broker 

  • Kafka中 每台broker都保存了kafka集群的metadata信息,metadata信息里包括了每个topic的所有partition的信息: leader, leader_epoch, controller_epoch, isr, replicas等;Kafka客户端从任一broker都可以获取到需要的metadata信息;sender线程通过metadata信息可以知道tp leader的brokerId

  • producer也保存了metada信息,同时根据metadata更新策略(定期更新metadata.max.age.ms、失效检测,强制更新:检查到metadata失效以后,调用metadata.requestUpdate()强制更新

public class PartitionInfo {	
private final String topic;	
private final int partition;	
private final Node leader;	
private final Node[] replicas;	
private final Node[] inSyncReplicas;	
private final Node[] offlineReplicas;	
}

3.2 幂等性发送

为实现Producer的幂等性,Kafka增加了pid和seq。Producer中每个RecordBatch都有一个单调递增的seq; Broker上每个tp也会维护pid-seq的映射,并且每Commit都会更新lastSeq。这样recordBatch到来时,broker会先检查RecordBatch再保存数据:如果batch中 baseSeq(第一条消息的seq)比Broker维护的序号(lastSeq)大1,则保存数据,否则不保存(inSequence方法)。

4. Sender处理broker发来的produce response

一旦broker处理完Sender的produce请求,就会发送produce response给Sender,此时producer将执行我们为send()设置的回调函数。至此producer的send执行完毕。

二、吞吐性&&延时

  •  buffer.memory:buffer设置大了有助于提升吞吐性,但是batch太大会增大延迟,可搭配linger_ms参数使用

  • linger_ms:如果batch太大,或者producer qps不高,batch添加的会很慢,我们可以强制在linger_ms时间后发送batch数据

  • ack:producer收到多少broker的答复才算真的发送成功

    • 0表示producer无需等待leader的确认(吞吐最高、数据可靠性最差)

    • 1代表需要leader确认写入它的本地log并立即确认

    • -1/all 代表所有的ISR都完成后确认(吞吐最低、数据可靠性最高)

三、Sender线程和长连接

每初始化一个producer实例,都会初始化一个Sender实例,新增到broker的长连接。

代码角度:每初始化一次KafkaProducer,都赋一个空的client

    public KafkaProducer(final Map&lt;String, Object&gt; configs) {	
this(configs, null, null, null, null, null, Time.SYSTEM);	}

   

640?wx_fmt=png

终端查看TCP连接数:lsof -p portNum -np | grep TCP

640?wx_fmt=png

640?wx_fmt=png

由此可见,适当增加producer可提升系统吞吐型

Consumer设计原理

一、poll消息

640?wx_fmt=png

  • 消费者通过fetch线程拉消息(单线程)

  • 消费者通过心跳线程来与broker发送心跳。超时会认为挂掉

  • 每个consumer group在broker上都有一个coordnator来管理,消费者加入和退出,以及消费消息的位移都由coordnator处理。

二、位移管理

consumer的消息位移代表了当前group对topic-partition的消费进度,consumer宕机重启后可以继续从该offset开始消费。

在kafka0.8之前,位移信息存放在zookeeper上,由于zookeeper不适合高并发的读写,新版本Kafka把位移信息当成消息,发往__consumers_offsets 这个topic所在的broker,__consumers_offsets默认有50个分区。

消息的key 是groupId+topic_partition,value 是offset.

640?wx_fmt=png

640?wx_fmt=png

Kafka Group 状态

640?wx_fmt=png

  • Empty:初始状态,Group 没有任何成员,如果所有的 offsets 都过期的话就会变成 Dead

  • PreparingRebalance:Group 正在准备进行 Rebalance

  • AwaitingSync:Group 正在等待来 group leader 的 分配方案

  • Stable:稳定的状态(Group is stable);

  • Dead:Group 内已经没有成员,并且它的 Metadata 已经被移除注意

三、重平衡reblance

当一些原因导致consumer对partition消费不再均匀时,kafka会自动执行reblance,使得consumer对partition的消费再次平衡。

什么时候发生rebalance?

  • 组订阅topic数变更

  • topic partition数变更

  • consumer成员变更

  • consumer 加入群组或者离开群组的时候

  • consumer被检测为崩溃的时候

reblance过程

举例1 consumer被检测为崩溃引起的reblance

比如心跳线程在timeout时间内没和broker发送心跳,此时coordnator认为该group应该进行reblance。接下来其他consumer发来fetch请求后,coordnator将回复他们进行reblance通知。当consumer成员收到请求后,只有leader会根据分配策略进行分配,然后把各自的分配结果返回给coordnator。这个时候只有consumer leader返回的是实质数据,其他返回的都为空。收到分配方法后,consumer将会把分配策略同步给各consumer

举例2 consumer加入引起的reblance

  1. 使用join协议,表示有consumer 要加入到group中

  2. 使用sync 协议,根据分配规则进行分配

640?wx_fmt=png

640?wx_fmt=png

(上图摘自网络)

引申:以上reblance机制存在的问题

在大型系统中,一个topic可能对应数百个consumer实例。这些consumer陆续加入到一个空消费组将导致多次的rebalance;此外consumer 实例启动的时间不可控,很有可能超出coordinator确定的rebalance timeout(即max.poll.interval.ms),将会再次触发rebalance,而每次rebalance的代价又相当地大,因为很多状态都需要在rebalance前被持久化,而在rebalance后被重新初始化。

新版本改进

通过延迟进入PreparingRebalance状态减少reblance次数

640?wx_fmt=png


新版本新增了group.initial.rebalance.delay.ms参数。空消费组接受到成员加入请求时,不立即转化到PreparingRebalance状态来开启reblance。当时间超过group.initial.rebalance.delay.ms后,再把group状态改为PreparingRebalance(开启reblance)。实现机制是在coordinator底层新增一个group状态:InitialReblance。假设此时有多个consumer陆续启动,那么group状态先转化为InitialReblance,待group.initial.rebalance.delay.ms时间后,再转换为PreparingRebalance(开启reblance)


Broker设计原理

Broker 是Kafka 集群中的节点。负责处理生产者发送过来的消息,消费者消费的请求。以及集群节点的管理等。由于涉及内容较多,先简单介绍,后续专门抽出一篇文章分享 

一、broker zk注册

640?wx_fmt=png


二、broker消息存储

  • Kafka的消息以二进制的方式紧凑地存储,节省了很大空间

  • 此外消息存在ByteBuffer而不是堆,这样broker进程挂掉时,数据不会丢失,同时避免了gc问题

  • 通过零拷贝和顺序寻址,让消息存储和读取速度都非常快

  • 处理fetch请求的时候通过zero-copy 加快速度

三、broker状态数据

broker设计中,每台机器都保存了相同的状态数据。主要包括以下:

  • controller所在的broker ID,即保存了当前集群中controller是哪台broker

  • 集群中所有broker的信息:比如每台broker的ID、机架信息以及配置的若干组连接信息

  • 集群中所有节点的信息:严格来说,它和上一个有些重复,不过此项是按照broker ID和监听器类型进行分组的。对于超大集群来说,使用这一项缓存可以快速地定位和查找给定节点信息,而无需遍历上一项中的内容,算是一个优化吧

  • 集群中所有分区的信息:所谓分区信息指的是分区的leader、ISR和AR信息以及当前处于offline状态的副本集合。这部分数据按照topic-partitionID进行分组,可以快速地查找到每个分区的当前状态。(注:AR表示assigned replicas,即创建topic时为该分区分配的副本集合)

四、broker负载均衡

分区数量负载:各台broker的partition数量应该均匀

partition Replica分配算法如下:

  1. 将所有Broker(假设共n个Broker)和待分配的Partition排序

  2. 将第i个Partition分配到第(i mod n)个Broker上

  3. 将第i个Partition的第j个Replica分配到第((i + j) mod n)个Broker上

存在的问题

在kafka1.1之前,Kafka能够保证各台broker上partition数量均匀,但由于每个partition内的消息数不同,可能存在不同硬盘之间内存占用差异大的情况。
新版本改进

增加容量大小负载:每台broker的硬盘占用大小应该均匀

Kafka1.1中增加了副本跨路径迁移功能kafka-reassign-partitions.sh,我们可以结合它跟监控系统,实现自动化的负载均衡

Kafka高可用

在介绍kafka高可用之前先介绍几个概念

  • 同步复制:要求所有能工作的Follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率

  • 异步复制:Follower异步的从Leader pull数据,data只要被Leader写入log认为已经commit,这种情况下如果Follower落后于Leader的比较多,如果Leader突然宕机,会丢失数据

Isr

Kafka结合同步复制和异步复制,使用ISR(与Partition Leader保持同步的Replica列表)的方式在确保数据不丢失和吞吐率之间做了平衡。Producer只需把消息发送到Partition Leader,Leader将消息写入本地Log。Follower则从Leader pull数据。Follower在收到该消息向Leader发送ACK。一旦Leader收到了ISR中所有Replica的ACK,该消息就被认为已经commit了,Leader将增加HW并且向Producer发送ACK。这样如果leader挂了,只要Isr中有一个replica存活,就不会丢数据。

Isr动态更新

Leader会跟踪ISR,如果ISR中一个Follower宕机,或者落后太多,Leader将把它从ISR中移除。这里所描述的“落后太多”指Follower复制的消息落后于Leader后的条数超过预定值(replica.lag.max.messages)或者Follower超过一定时间(replica.lag.time.max.ms)未向Leader发送fetch请求。

broker Nodes In Zookeeper 

/brokers/topics/[topic]/partitions/[partition]/state 保存了topic-partition的leader和Isr等信息

640?wx_fmt=png

Controller负责broker故障检查&&故障转移(fail/recover)

 1. Controller在Zookeeper上注册Watch,一旦有Broker宕机,其在Zookeeper对应的znode会自动被删除,Zookeeper会触发 Controller注册的watch,Controller读取最新的Broker信息

 2. Controller确定set_p,该集合包含了宕机的所有Broker上的所有Partition

 3. 对set_p中的每一个Partition,选举出新的leader、Isr,并更新结果。

 3.1 从/brokers/topics/[topic]/partitions/[partition]/state读取该Parti       tion 当前的ISR  

3.2 决定该Partition的新Leader和Isr。如果当前ISR中有至少一个Replica还幸存,则选择其中一个作为新Leader,新的ISR则包含当前ISR中所有幸存的Replica。否则选择该Partition中任意一个幸存的Replica作为新的Leader以及ISR(该场景下可能会有潜在的数据丢失)  

    640?wx_fmt=png

3.3更新Leader、ISR、leader_epoch、controller_epoch:写入/brokers/topics/[topic]/partitions/[partition]/state

4. 直接通过RPC向set_p相关的Broker发送LeaderAndISRRequest命令。Controller可以在一个RPC操作中发送多个命令从而提高效率。


Controller挂掉

每个 broker 都会在 zookeeper 的临时节点 "/controller" 注册 watcher,当 controller 宕机时 "/controller" 会消失,触发broker的watch,每个 broker 都尝试创建新的 controller path,只有一个竞选成功并当选为 controller。

使用Kafka如何保证幂等性

不丢消息

  • 首先kafka保证了对已提交消息的at least保证

  • Sender有重试机制

  • producer业务方在使用producer发送消息时,注册回调函数。在onError方法中重发消息

  • consumer 拉取到消息后,处理完毕再commit,保证commit的消息一定被处理完毕

不重复

  • consumer拉取到消息先保存,commit成功后删除缓存数据

Kafka高性能

Kafka本身高具有的性能

  • partition提升了并发

  • zero-copy

  • 顺序写入

  • 消息聚集batch

  • 页缓存

业务方可对 Kafka producer的优化

  • 增大producer数量

  • ack配置

  • batch

640?wx_fmt=png

640?wx_fmt=jpeg

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg

推荐阅读:

  • 做了中台就不会死吗?每年至少40%开发资源是被浪费的!

  • 美女主播变大妈:在bug翻车现场说测试策略

  • 漫画高手、小说家、滑板专家……解锁程序员的另一面!

  • 手把手教你如何用Python模拟登录淘宝

  • 鸿蒙霸榜 GitHub,从最初的 Plan B 到“取代 Android”?

  • 每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作流实战_04_flowable 流程的模板的图片和xml显示

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…

成功使用机器学习技术的3个技巧

摘要&#xff1a; 本文讲述了3个针对机器学习的小技巧&#xff0c;相信对正在学习机器学习的朋友有所帮助机器学习、自然语言处理(NLP)和认知搜索技术正以高速率被采用&#xff0c;这并不稀奇。随着组织努力创造价值&#xff0c;增强客户体验&#xff0c;遵守严格的规定并使自己…

Spring精华问答 | 如何集成Spring Boot?

Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持。今天就让我们一起来看看关于Spring的精华问答吧。1Q&#xff1a;如何在自定义端口上运行Spring Boot应用程序&#xff1f;A&#xff1a;为了在自定义端口上运行Spring…

Andrew Ng深度学习课程笔记

摘要&#xff1a; 本文对Andrew Ng深度学习课程进行了大体的介绍与总结&#xff0c;共包括21个课程。我最近在Coursera上完成了Andrew Ng导师关于新深度学习的所有课程。Ng在解释术语和概念方面做得非常出色。例如&#xff0c;Ng指出&#xff0c;监督深度学习只不过是一种多维曲…

工作流实战_05_flowable 流程定义的挂起与激活

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…

技嘉注入usb 3.0工具_技嘉怎么安装win10系统 技嘉安装win10系统步骤【图文介绍】...

技嘉笔记本性能配置高端&#xff0c;质量一流&#xff0c;技嘉科技在主板方面也及其出色&#xff0c;因此自身生产的电脑配置也相当专业。若要用技嘉 安装win10系统 要怎么做比较快呢?最简单的方法便是用u盘装系统了&#xff0c;u盘装系统可谓是傻瓜式一键装机&#xff0c;让装…

为什么深度学习没有取代传统的计算机视觉?

摘要&#xff1a; 深度学习大潮为什么淹没传统的计算机视觉技术&#xff1f;听听大牛怎么说~这篇文章是受到论坛中经常出现的问题所创作的&#xff1a;深度学习是否可以取代传统的计算机视觉&#xff1f;这明显是一个很好的问题&#xff0c;深度学习&#xff08;DL&#xff09;…

赋能网安生态通信服务器操作系统,紫光展锐打造操作系统生态,赋能万物互联智能时代...

本周&#xff0c;以“象由芯生科技服务人民”为主题的2020紫光展锐市场峰会重磅开启&#xff0c;广大生态合作伙伴共聚一堂&#xff0c;共话数字世界新未来。在今天举办的“操作系统OS研讨会”上&#xff0c;来自紫光展锐工程一线的架构师带来了一场整个操作系统领域的饕餮盛宴…

如何利用秒级监控进行mongodb故障排查

摘要&#xff1a; 在我们平时的数据库使用当中&#xff0c;监控系统&#xff0c;作为排查故障&#xff0c;告警故障的重要辅助系统&#xff0c;对dba、运维、业务开发同学进行问题诊断、排查、分析有着重要的作用。并且一个监控系统的好坏&#xff0c;也很大程度上影响了能否精…

工作流实战_06_flowable 流程定义的删除

List item 由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;我师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;63316…

百度Q2智能云增长强劲;据悉史上最大 AI 芯片诞生!中兴与奇瑞成立合资公司一起加快开发5G汽车……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 华为推出旗下第一款可穿戴智…

python的简单程序代码_小白学编程?从一个简单的程序开始学习Python编程

笔者思虑再三还是决定选择图文&#xff08;因为百家的视频发布画质真不怎么样【囧】&#xff09;。 笔者学习编程的时间也挺长的&#xff0c;因为业余&#xff0c;因为时间不多&#xff0c;各种原因&#xff0c;自学编程的路特别难走。然后笔者发现&#xff0c;自己能为小白贡献…

从事数据科学前必须知道的五件事儿

摘要&#xff1a; 本文讲解了从事数据科学前应该了解的五件事情&#xff0c;主要是关于学习数据科学时候应该注意的一些事项。目前&#xff0c;人工智能行业非常火热&#xff0c;对应的数据科学分析岗位需求也非常大。很多程序员纷纷转行从事人工智能相关岗位&#xff0c;那么对…

工作流实战_07_flowable 流程定义查看流程图和xml

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;我师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都…

这项技术:华为、BAT要力捧!程序员:我彻底慌了... ​

人工智能离我们还遥远吗&#xff1f;海底捞斥资1.5亿打造了中国首家火锅无人餐厅&#xff1b;阿里酝酿了两年之久的全球首家无人酒店也正式开始运营&#xff0c;百度无人车彻底量产。李彦宏称&#xff0c;这是中国第一款能够量产的无人驾驶乘用车。而阿里的这家无人酒店&#x…

手把手教你理解卷积神经网络

摘要&#xff1a; 卷积神经网络是一种识别和理解图像的神经网络。本文将从不同的层次来介绍卷积神经网络。手把手教你理解卷积神经网络&#xff08;一&#xff09;本文将继续为你介绍关于卷积神经网络的知识。为了保持文章的简洁性和全面性我将为你提供研究论文的链接&#xff…

工作流实战_09_flowable 流程实例挂起与激活

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;我师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都…

2018深圳云栖拉开帷幕,飞天技术汇五大专场邀你参加~

摘要&#xff1a; 感受万物互联的智能时代&#xff0c;洞察数字化转型的全新未来。云栖大会将情景化展示智能城市、智能生活、智能制造、智慧门店等阿里云IoT生态全景&#xff0c;20专场&#xff0c;覆盖AI、新零售等全行业数字化转型解决方案。 飞天技术汇作为阿里云的技术传播…

学了阿里中台,却依然做不好系统? 聊聊阿里的项目管理

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 墨玖来源| 阿里技术导读&#xff1a;在技术公司、尤其是互联网公司&#xff0c;技术人员作为PM(项目经理)是非常常见的。有些同学得心应手&#xff0c;有条不紊&#xff0c;能得到清晰稳定的预期结果&#xff1b;有些同学则…

视频直播常见问题与解决办法汇总【系列三—直播推流】

摘要&#xff1a; 直播推流初始化设置 要进行直播推流&#xff0c;您必须开启直播加速 > 配置直播域名 > 直播推流&#xff0c;详情参考 快速开始。 如何获取推流地址 直播加速配置成功后&#xff0c;您可以通过以下方式获取对应的推流地址。 登录 视频直播控制台。 直播…