赞
踩
Kafka是一个支持千亿级的分布式消息传递组件,尤其是在分布式架构中被广泛应用,所以在这里也整理了一下。
想了一会,,也没想好从哪个部位开撕,,哈哈,还是随便聊聊吧。。
先上个基本的图吧,
如上图,produce将消息发送到kafka-cluster,假如有三个broker,三个分区。同时我们有个消费组中也有三个consumer再去从对应的分区中pull取数据来进行消费处理。这里我没有画单个broker跟单个consumer哈,这种没有可讲的逻辑。我们就从上图开始讲吧,首先我们想下这几个问题,,他为什么要分区?consumer消费时怎样找到对应的分区的?还有这三部分是怎样保证数据的可靠性的?(produce、cluster、consumer)。想到这些问题,,那我感觉前戏已经来了,,我们慢慢的开始。。一步步来
我们开始就讲到,kafka是能够支持千亿级的数据的,,那我们动动脚趾头也知道他为什么分区了,就是为了提高数据的吞吐量嘛,,不管存储还是查询都能够提升效率对吧,跟我们的分库分表一个道理,,都是减少单个数据节点的压力提高其性能。
好,那我们知道他问什么分区了,,那consumer是怎样去找寻对应的分区跟消费的呢?肯定有小伙伴们提出了疑问,上图是三个分区正好对应三个consumer,,那如果在数量不对等的情况下呢?别急,这会感觉来了,首先在多个consumer时,,他们会首先去任意请求一个broker,然后该broker会选举出一个consumer的leader,然后计算每个consumer消费的分区数量,具体的计算公式是这样的:m=partition/consumer ; n=partition%consumer,第一个consumer消费分区的数量就是m+n,然后将这些信息返回给consumer_leader,由leader将信息在传递给其它成员,这样每个consumer就知道各自要消费的分区了。。现在进来了吗小伙伴们??
这块才是高潮部分哈,首先我们先从produce说起,,他怎样保证所有的消息都发送到了kafka_cluster的?这里其实他有个ack机制,并且ack的参数是可以配置的,0/1/-1,0:直管发送不需要等待ack;1只要topic_leader副本响应就可以;-1所有topic副本必须同步到数据后才认为这条数据是发送成功了。。
接着来搞kafka_cluster,,她这里主要是通过topic副本机制来保证数据的可靠性的,她在每个分区中都做了副本机制,这里我们来画下图看看:
这个图就是说我们创建了一个topic_test,然后kafka_cluster其实同时在每个分区都创建了一个副本,并且将其同步给其它两个分区。这样其实每个分区就有三个副本,然后每个分区都有一个topic_leader,来负责读写数据,注意此处不是读写分离哈,大家想想她为什么这样做?其实想下,分区是分布在各个broker上的,,也就是不同的机器服务上的,假如其中一个broker宕机了,我们是不是就可以通过在其它broker上的副本来恢复其数据呢?主要这个副本同步,是跟其它分区的同步哈,,副本pull leader模式。通常建议一个broker上有一个副本,,但是实际你查看时发现,副本都是存在于分区上的。副本的同步具体有三个参数,HW、leo、remoteLeo,看下图:
在leader与副本中维护了自己的几个参数,记录当前同步的数据最高水位及各自的低水位,leader中还维护了副本的最低leo,通常情况副本pull leader后,,会将leader的信息包含数据更新到自己参数上,然后更改hw跟leo。这里有个问题,比如上图,,副本去pull leader的时候,leader挂了,那这样新选举出的leader数据就是缺失的,这个在kafka新版本中优化了这个问题,zk中会维护历任leader的offset值,新leader会从zk上同步这个信息,读取数据,这样就解决了数据丢失的问题。
这个在kafka中为了不让消息丢失,leader维护了一个跟自己同步的isr集合,新的leader就是从这个集合中诞生的。那么这个集合中的副本是怎么维护的呢?两个条件:1.zk中必须有这个副本borker的心跳 2.follower与leader间的同步不能延时太久。上述两个条件同时满足 leader才认为其ISR。具体的延时她会将lastPullTime与now跟replica.log.time.max.ms比较,超过这个时间他就会认为超时了,,会将其提出ISR。。
至此活动终于结束了,,重点特性基本就是这些了,大家如果觉得有帮助动动发财的小手点赞加关注哦,,,打赏也可以哦!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。