澳门美高梅手机网站Kafka详细原理总结

Kafka

在Kafak中国社区的qq群中,这个问题为提及的百分比是相当高之,这为是Kafka用户最常碰到的题目之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。

Kafka是初由Linkedin公司出,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息网,它的极其特别的特点即是得实时的处理大量数目因满足各种求状况:比如根据hadoop的批处理体系、低顺延的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年奉献为了Apache基金会并变成世界级开源
项目。

 

 

怎规定分区数?

1.前言

   
“我应当选几独分区?”——如果你以Kafka中国社区的群里,这样的问题你会不时遇到的。不过有点遗憾的凡,我们像并没死权威的答案会解答这样的题材。其实就为非奇怪,毕竟这样的问题便还是从未稳定答案的。Kafka官网上表现自己是”high-throughput
distributed messaging
system”,即一个高吞吐量的分布式消息引擎。那么怎么上高吞吐量呢?Kafka在脚摒弃了Java堆放缓存机制,采用了操作系统级别的页缓存,同时以随意写操作改呢顺序写,再做Zero-Copy的特点极大地改善了IO性能。但是,这才是一个面,毕竟单机优化的力量是发出上限的。如何通过水平扩展甚至是线性扩展来一发提升吞吐量为? Kafka就是利用了分割区(partition),通过以topic的音信打散到几近个分区并散布保存在不同的broker上实现了信息处理(不管是producer还是consumer)的大吞吐量。

信息队列的特性好坏,其文件存储机制设计是权一个音队列服务技术水平和极端紧要指标有。下面将从今Kafka文件存储机制与情理结构角度,分析Kafka是如何落实高效文件存储,及实际利用功能。

 
  Kafka的劳动者和消费者还足以多线程地并行操作,而每个线程处理的凡一个分区的数量。因此分区实际上是调整优Kafka并行度的不过小单元。对于producer而言,它实在是为此几近单线程并发地向不同分区所在的broker发起Socket连接而给这些分区发送信息;而consumer呢,同一个消费组内的具有consumer线程都被指定topic的某个一个分区进行消费(具体怎么着规定consumer线程数目我们后会详细说明)。所以说,如果一个topic分区越多,理论及整集群所能够达的吞吐量就越是充分。

 

   
但分区是否越多越好呢?显然也不是,因为每个分区都发生友好之支出:

 1.1  Kafka的特性:

一样、客户端/服务器端需要运用的内存就进一步多


高吞吐量、低顺延:kafka每秒可以处理几十万长达信息,它的推移最低仅生几乎毫秒,每个topic可以分多只partition,
consumer group 对partition进行consume操作。

    先说说客户端的状况。Kafka
0.8.2从此推出了Java版的崭新的producer,这个producer有个参数batch.size,默认是16KB。它见面吗每个分区缓存消息,一旦满了就是打包将消息批量出。看上去就是只能够晋级性的统筹。不过好明确,因为此参数是分区级别之,如果分区数更是多,这部分缓存所要的内存占用呢会还多。假设你生出10000个分区,按照默认设置,这有缓存需要占用约157MB的内存。而consumer端呢?我们抛开获取数据所需要的内存不说,只说线程的开发。如果要如来10000单分区,同时consumer线程数要配合配分区数(大部分动静下是最佳的费吞吐量配置)的话,那么以consumer
client就使创10000单线程,也欲创造大约10000只Socket去得分区数据。这其间的线程切换的开发本身已不容轻视了。

– 可扩展性:kafka集群支持热扩展

   
服务器端的支付也不聊,如果看Kafka源码的言语可窥见,服务器端的不在少数组件都当内存中维护了分区级别之缓存,比如controller,FetcherManager等,因此分区数更是多,这种缓存的资产更老越怪。

– 持久性、可靠性:消息给持久化到地头磁盘,并且支持数据备份防止数据丢失

老二、文件句柄的付出

– 容错性:允许集众多被节点失败(若副本数量为n,则允许n-1只节点失败)

   
每个分区在脚文件系统都发生属自己之一个目。该目录下一般会来三三两两个文件:
base_offset.log和base_offset.index。Kafak的controller和ReplicaManager会为每个broker都封存这点儿个公文句柄(file
handler)。很显著,如果分区数更是多,所待保持开拓状态的公文句柄数也不怕越是多,最终或会见突破你的ulimit
-n的克。

– 高并发:支持数千独客户端同时读写

其三、降低高可用性

 

   
Kafka通过副本(replica)机制来保管高可用。具体做法就是为每个分区保存若干单副本(replica_factor指定副本数)。每个副本保存在不同的broker上。期中的一个副本充当leader
副本,负责处理producer和consumer请求。其他副本充当follower角色,由Kafka
controller负责保证与leader的一道。如果leader所在的broker挂掉了,contorller会检测及接下来于zookeeper的相助下重选出新的leader——这当中会来浅的不可用时窗口,虽然大部分情形下或一味是几毫秒级别。但假如您生10000个分区,10单broker,也就是说平均每个broker上闹1000只分区。此时这broker挂掉了,那么zookeeper和controller需要马上对当下1000个分区进行leader选举。比起很少之分区leader选举而言,这得使费还增长的时空,并且普通不是线性累加的。如果这个broker还而是controller情况就再度不好了。

1.2   Kafka的应用状况:

  说了如此多“废话”,很多口得曾不耐烦了。那你究竟要怎么规定分区数也?答案就是:视情况而一定。基本上你要待经过平等多元试验跟测试来规定。当然测试的依据该是吞吐量。虽然LinkedIn这首文章做了Kafka的极测试,但它的结果其实对您意义不生,因为不同的硬件、软件、负载情况测试出的结果一定不等同。我每每碰到的问题类似于,官网说各级秒能到10MB,为什么自己的producer每秒才1MB?
——
且不说硬件条件,最后发现他采用的消息体有1KB,而官网的口径测试是用100B测出来的,因此素有无可比性。不过你照样可以依照一定的步骤来尝试确定分区数:创建一个一味出1独分区的topic,然后测试者topic的producer吞吐量和consumer吞吐量。假设它们的价分别是Tp和Tc,单位可是MB/s。然后假要总的对象吞吐量是Tt,那么分区数
=  Tt / max(Tp, Tc)


日志收集:一个店得以为此Kafka可以收集各种服务之log,通过kafka以合接口服务的点子开为各种consumer,例如hadoop、Hbase、Solr等。

   
Tp表示producer的吞吐量。测试producer通常是颇爱的,因为它们的逻辑非常简单,就是一直发送信息及Kafka就好了。Tc表示consumer的吞吐量。测试Tc通常和下的干再要命,
因为Tc的值在你将到消息之后执行什么操作,因此Tc的测试通常也要麻烦一些。

– 消息网:解耦和劳动者和消费者、缓存消息等。

   
另外,Kafka并无可知确实地好线性扩展(其实任何系统都非克),所以您当计划你的分区数之时节最好广大统筹一下,这样未来扩大时候吧越加便利。


用户活动跟踪:Kafka经常于用来记录web用户要app用户的各种运动,如浏览网页、搜索、点击等倒,这些倒消息被逐个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来开实时的监察分析,或者装载至hadoop、数据仓库中做离线分析和扒。

 


运营指标:Kafka也常用来记录运营监控数据。包括收集各种分布式应用的数量,生产各种操作的汇总反馈,比如报警及报。

消息-分区的分红

– 流式处理:比如spark streaming和storm

默认情况下,Kafka根据传递信息之key来拓展分区的分红,即hash(key)
% numPartitions,如下图所示:

– 事件源

def partition(key: Any, numPartitions: Int): Int = {
    Utils.abs(key.hashCode) % numPartitions
}

 

  这就是确保了同样key的消息一定会为路由于至平的分区。如果你莫点名key,那么Kafka是何许确定就条消息去为哪个分区的啊?

1.3  Kakfa的设计思想

if(key == null) {  // 如果没有指定key
        val id = sendPartitionPerTopicCache.get(topic)  // 先看看Kafka有没有缓存的现成的分区Id
        id match {
          case Some(partitionId) =>  
            partitionId  // 如果有的话直接使用这个分区Id就好了
          case None => // 如果没有的话,
            val availablePartitions = topicPartitionList.filter(_.leaderBrokerIdOpt.isDefined)  //找出所有可用分区的leader所在的broker
            if (availablePartitions.isEmpty)
              throw new LeaderNotAvailableException("No leader for any partition in topic " + topic)
            val index = Utils.abs(Random.nextInt) % availablePartitions.size  // 从中随机挑一个
            val partitionId = availablePartitions(index).partitionId
            sendPartitionPerTopicCache.put(topic, partitionId) // 更新缓存以备下一次直接使用
            partitionId
        }
      }

– Kakfa Broker Leader的选举:Kakfa
Broker集群受Zookeeper管理。所有的Kafka
Broker节点一起去Zookeeper上登记一个临时节点,因为光来一个Kafka
Broker会注册成功,其他的都见面砸,所以是成功在Zookeeper上登记临时节点的这个Kafka
Broker会成为Kafka Broker Controller,其他的Kafka broker叫Kafka Broker
follower。(这个历程让Controller以ZooKeeper注册Watch)。这个Controller会监听其他的Kafka
Broker的持有信息,如果这个kafka broker
controller宕机了,在zookeeper上面的慌临时节点就会破灭,此时备的kafka
broker又会一起去Zookeeper上注册一个现节点,因为只有出一个Kafka
Broker会注册成功,其他的还见面破产,所以这个成功在Zookeeper上登记临时节点的之Kafka
Broker会成为Kafka Broker Controller,其他的Kafka broker叫Kafka Broker
follower。例如:一旦闹一个broker宕机了,这个kafka broker
controller会读取该宕机broker上有的partition在zookeeper上的状态,并选取ISR列表中之一个replica作为partition
leader(如果ISR列表中的replica全挂,选一个共处的replica作为leader;
如果该partition的有所的replica都宕机了,则将新的leader设置为-1,等待回复,等待ISR中之无论一个Replica“活”过来,并且选择其当作Leader;或选择第一单“活”过来的Replica(不自然是ISR中的)作为Leader),这个broker宕机的事体,kafka
controller也会见通报zookeeper,zookeeper就会通知其他的kafka broker。

  可以视,Kafka几乎就是是自由找一个分区发送无key的信息,然后将这分区号进入到缓存中盖备后面一直用——当然了,Kafka本身吗会见清空该缓存(默认每10分钟或每次要topic元数据经常)

这里已经发生过一个bug,TalkingData使用Kafka0.8.1之时段,kafka
controller在Zookeeper上登记成功后,它跟Zookeeper通信的timeout时间是6s,也就是是要kafka
controller如果有6s中无同Zookeeper做心跳,那么Zookeeper就觉着这kafka
controller已经老了,就见面当Zookeeper上管这临时节点删掉,那么任何Kafka就会以为controller已经远非了,就见面另行抢在注册临时节点,注册成功之深kafka
broker成为controller,然后,之前的良kafka controller就需要各种shut
down去关各种节点和波的监听。但是当kafka的读写流量都格外伟大的早晚,TalkingData的一个bug是,由于网络等由,kafka
controller和Zookeeper有6s中并未通信,于是复选举产生了一个初的kafka
controller,但是本的controller在shut
down的下总是不成事,这个时producer进来的message由于Kafka集众多被留存个别独kafka
controller而望洋兴叹落地。导致数据淤积。

怎样设定consumer线程数

此已还有一个bug,TalkingData使用Kafka0.8.1之时段,当ack=0的时段,表示producer发送出去message,只要对应的kafka
broker topic partition
leader接收到之就漫漫message,producer就回成功,不管partition leader
是否真成功将message真正存到kafka。当ack=1的当儿,表示producer发送出去message,同步的将message存到对应topic的partition的leader上,然后producer就回来成功,partition
leader异步的拿message同步到另外partition
replica上。当ack=all或-1,表示producer发送出去message,同步的将message存到对应topic的partition的leader和呼应的replica上从此,才回来成功。但是如果有kafka
controller
 切换的早晚,会促成partition leader的切换(老的 kafka
controller上面的partition leader会选举及其它的kafka
broker上),但是这样即使会见招丢数据。

   
我个人的眼光,如果你的分区数是N,那么极端好线程数也保持为N,这样便会达到最特别的吞吐量。超过N的布局才是浪费系统资源,因为多生之线程不见面给分配至其它分区。让咱来探现实Kafka是何许分配的。

–  Consumergroup:梯次consumer(consumer
线程)可以组合一个组(Consumer
group ),partition中的每个message只能为组(Consumer
group )中之一个consumer(consumer
线程)消费,如果一个message可以为多独consumer(consumer
线程)消费以来,那么这些consumer必须以不同的组。Kafka不支持一个partition中之message由片只或少独以上的与一个consumer
group下的consumer thread来处理,除非又开行一个新的consumer
group。所以只要想以对一个topic做消费的话,启动多独consumer
group就可了,但是一旦留意的凡,这里的几近单consumer的花都得是各个读取partition里面的message,新开行的consumer默认从partition队列最头端最新的地方开阻塞的朗读message。它不能够像AMQ那样好基本上只BET作为consumer去互斥的(for
update悲观锁)并发处理message,这是以大多个BET去花一个Queue中的数额的时段,由于要保证不能够多独线程拿和同条message,所以就是需履行级别悲观所(for
update),这即导致了consume的属性降低,吞吐量不够。而kafka为了确保吞吐量,只允许和一个consumer
group下的一个consumer线程去顾一个partition。如果以为效率不赛之上,可以加partition的多少来横向扩张,那么重加新的consumer
thread去消费。如果想多单不等的事体还得以此topic的数,起多只consumer
group就哼了,大家还是各个的读取message,offsite的值互不影响。这样没沿竞争,充分发挥了横向的扩展性,吞吐量极高。这为即形成了分布式消费之概念。

   
topic下的一个分区只能吃和一个consumer
group下的一个consumer线程来花,但相反的并无立,即一个consumer线程可以费多独分区的多寡,比如Kafka提供的ConsoleConsumer,默认就惟有是一个线程来消费享分区的数。——其实ConsoleConsumer可以使通配符的效力实现又花费多个topic数据,但眼看跟本文无关。

    当启动一个consumer
group去消费一个topic的时光,无论topic里面有多独少个partition,无论我们consumer
group里面配备了有些只consumer thread,这个consumer
group下面的装有consumer
thread一定会花满的partition;即便这consumer
group下独自发生一个consumer thread,那么是consumer
thread也会错过消费有的partition。因此,最精彩的统筹虽,consumer
group下的consumer thread的数等partition数量,这样效率是高的。

   
再讨论分配政策之前,先说说KafkaStream——它是consumer的严重性类,提供了遍历方法用于consumer程序调用实现多少的消费。其底层维护了一个梗队列,所以在没初信息赶到时,consumer是居于阻塞状态的,表现出的状态就是consumer程序一直以等新消息的赶到。——你本来好安排成带过时之consumer,具体参看参数consumer.timeout.ms的用法。

    同一partition的同等漫漫message只能吃和一个Consumer
Group内的一个Consumer消费。不克一个consumer
group的大都个consumer同时花费一个partition。

    下面说说Kafka提供的星星点点种植分配政策:
range和roundrobin,由参数partition.assignment.strategy指定,默认是range策略。本文就谈谈range策略。所谓的range其实就是遵循等级平均分配。举个例子就是知道了,假而你闹10单分区,P0
~ P9,consumer线程数是3, C0 ~ C2,那么每个线程都分配哪些分区为?

    一个consumer group下,无论有多少个consumer,这个consumer
group一定返回把此topic下拥有的partition都花了。当consumer
group里面的consumer数量小于这个topic下的partition数量的时段,如下图groupA,groupB,就见面出现一个conusmer
thread消费多只partition的情事,总的是是topic下的partition都见面为消费。如果consumer
group里面的consumer数量等于是topic下的partition数量之时光,如下图groupC,此时效率是高的,每个partition都产生一个consumer
thread去消费。当consumer
group里面的consumer数量大于此topic下的partition数量之时段,如下图GroupD,就会见起一个consumer
thread空闲。因此,我们以设定consumer
group的时节,只待指明里面有几乎单consumer数量即可,无需指定相应之花partition序号,consumer会自动进行rebalance。

 

    多只Consumer
Group下的consumer可以花费一样修message,但是这种消费也是盖o(1)的法门挨个的读取message去消费,,所以自然会再度消费就批message的,不可知往AMQ那样多个BET作为consumer消费(对message加锁,消费的时光不克重新消费message)

C0 消费分区 0, 1, 2, 3

– Consumer Rebalance的触发条件:(1)Consumer增加还是去会触发
Consumer Group的Rebalance(2)Broker的加或缩减都见面触发 Consumer
Rebalance

C1 消费分区 4, 5, 6

– Consumer: Consumer处理partition里面的message的下是o(1)顺序读取的。所以要保护在上同坏读到哪的offsite信息。high
level API,offset存于Zookeeper中,low level
API的offset由友好维护。一般的话都是动high level
api的。Consumer的delivery
gurarantee,默认是读了message先commmit再处理message,autocommit默认是true,这时候先commit就会见更新offsite+1,一旦处理失败,offsite已经+1,这个时段便见面丢弃message;也可以配备成读了信息处理还commit,这种状况下consumer端的响应就会于缓慢的,需要等处理完毕才实施。

C2 消费分区 7, 8, 9

相似景象下,一定是一个consumer group处理一个topic的message。Best
Practice是者consumer
group里面consumer的数码相当于topic里面partition的数码,这样效率是最高的,一个consumer
thread处理一个partition。如果此consumer
group里面consumer的多寡低于topic里面partition的数据,就会发生consumer
thread同时处理多单partition(这个是kafka自动的建制,我们绝不指定),但是总之这topic里面的兼具partition都见面为处理及的。。如果这个consumer
group里面consumer的多少超出topic里面partition的多少,多发生的consumer
thread就见面没事在啥也未干,剩下的凡一个consumer
thread处理一个partition,这即招致了资源的荒废,因为一个partition不容许受简单独consumer
thread去处理。所以我们线及之分布式多单service服务,每个service里面的kafka
consumer数量都自愧不如对应之topic的partition数量,但是所有服务之consumer数量只与齐partition的数据,这是坐分布式service服务的装有consumer都出自一个consumer
group,如果来不同的consumer
group就见面处理又的message了(同一个consumer
group下的consumer不可知处理与一个partition,不同之consumer
group可以处理及一个topic,那么还是逐一处理message,一定会处理还的。一般这种情况尚且是少单不同之工作逻辑,才会启动两独consumer
group来处理一个topic)。

  

 

切切实实算法就是:

设若producer的流量叠加,当前的topic的parition数量=consumer数量,这时候的作答法就是老大怀念扩大:增加topic下之partition,同时多这consumer
group下的consumer。

val nPartsPerConsumer = curPartitions.size / curConsumers.size // 每个consumer至少保证消费的分区数
val nConsumersWithExtraPart = curPartitions.size % curConsumers.size // 还剩下多少个分区需要单独分配给开头的线程们
...
for (consumerThreadId <- consumerThreadIdSet) {   // 对于每一个consumer线程
        val myConsumerPosition = curConsumers.indexOf(consumerThreadId)  //算出该线程在所有线程中的位置,介于[0, n-1]
        assert(myConsumerPosition >= 0)
// startPart 就是这个线程要消费的起始分区数
        val startPart = nPartsPerConsumer * myConsumerPosition + myConsumerPosition.min(nConsumersWithExtraPart)
// nParts 就是这个线程总共要消费多少个分区
        val nParts = nPartsPerConsumer + (if (myConsumerPosition + 1 > nConsumersWithExtraPart) 0 else 1)
...
}

  澳门美高梅手机网站 1              

对让之事例,nPartsPerConsumer就是10/3=3,nConsumersWithExtraPart为10%3=1,说明每个线程至少保证3单分区,还剩余1单分区需要单独分配受开的若干独线程。这就算是怎么C0消费4个分区,后面的2单线程每个消费3单分区,具体经过详见下的Debug截图信息:

– Delivery Mode : Kafka producer
发送message不用维护message的offsite信息,因为此上,offsite就相当给一个自增id,producer就尽管发送message就哼了。而且Kafka与AMQ不同,AMQ大都用当处理业务逻辑上,而Kafka大都是日记,所以Kafka的producer一般都是大批量之batch发送message,向这个topic一次性发送一深批判message,load
balance到一个partition上,一起插进去,offsite作为自增id自己搭便吓。但是Consumer端是内需维护这partition当前花及哪个message的offsite信息的,这个offsite信息,high
level api是维护以Zookeeper上,low level
api是团结的先后维护。(Kafka管理界面及不得不显示high level
api的consumer部分,因为low level api的partition
offsite信息是先后自己维护,kafka是匪亮堂之,无法在保管界面上亮
)当以high level api的时段,先用message处理,再定时自动commit
offsite+1(也可以转化手动),
并且kakfa处理message是没有锁操作的。因此要拍卖message失败,此时尚无commit
offsite+1,当consumer
thread重开后会见再次消费是message。但是当高吞吐量高并发的实时处理系统,at
least
once的情下,至少一软会见于处理及,是好忍受的。如果无法耐受,就得使low
level api来协调程序维护这个offsite信息,那么想什么时commit
offsite+1就融洽搞定了。

 ctx.myTopicThreadIds

 

澳门美高梅手机网站 2

– Topic &
Partition:
Topic相当给传统消息网MQ中的一个序列queue,producer端发送的message必须指定是殡葬到谁topic,但是不需指定topic下之哪个partition,因为kafka会管收的message进行load
balance,均匀的分布于这topic下的差的partition上( hash(message) %
[broker数量]
 )。物理上囤积上,这个topic会分成一个还是多只partition,每个partiton相当给是一个子queue。在大体构造及,每个partition对应一个大体的目录(文件夹),文件夹命名是[topicname]_[partition]_[序号],一个topic可以产生过多差不多的partition,根据业务需求和数据量来安。在kafka配置文件被而天天再次高num.partitions参数来安排更改topic的partition数量,在创造Topic时经参数指定parittion数量。Topic创建之后经过Kafka提供的工具为堪修改partiton数量。

澳门美高梅手机网站 3

 
 一般的话,(1)一个Topic的Partition数量超越等于Broker的数目,可以增长吞吐率。(2)同一个Partition的Replica尽量分散到不同的机,高可用。

澳门美高梅手机网站 4

  当add a new
partition的时候
,partition里面的message不会重新展开分红,原来的partition里面的message数据未会见换,新加的是partition刚起是空的,随后上者topic的message就见面又介入有partition的load
balance

nPartsPerConsumer = 10 / 3  = 3

– Partition Replica:每个partition可以以其他的kafka
broker节点上存副本,以便某个kafka
broker节点宕机不会见潜移默化者kafka集群。存replica副本的方法是以kafka
broker的相继存。例如有5个kafka
broker节点,某个topic有3单partition,每个partition存2只副本,那么partition1存broker1,broker2,partition2存broker2,broker3。。。以此类推(replica副本数目不克超出kafka
broker节点的数,否则报错。这里的replica数实际就是partition的副本总数,其中包括一个leader,其他的即使是copy副本)
。这样一旦某broker宕机,其实任何kafka内数据还是完好的。但是,replica副本数越强,系统虽然越来越稳定,但是返带资源与总体性及之退;replica副本少的话,也会见促成系统丢数据的高风险。

nConsumersWithExtraPart = 10 % 3 =
1

  (1)怎样传送信息:producer先把message发送至partition
leader,再由leader发送给其他partition
follower。(如果给producer发送给每个replica那便尽慢了)

澳门美高梅手机网站 5

 
(2)在朝着Producer发送ACK前需确保有稍许个Replica已经收到该消息:根据ack配的个数而一定

澳门美高梅手机网站 6

  (3)怎样处理某个Replica不做事的景况:如果是部工作之partition
replica不在ack列表中,就是producer在殡葬信息及partition
leader上,partition leader向partition
follower发送message没有响应而已,这个不见面影响整系统,也无会见生啊问题。如果这个不办事的partition
replica在ack列表中的话,producer发送的message的当儿会等待这个不工作之partition
replca写message成功,但是会当及time
out,然后返回失败为有ack列表中之partition
replica没有响应,此时kafka会自动的管这个部工作之partition
replica从ack列表中移除,以后的producer发送message的时候就是非会见生出是ack列表下的是部工作的partition
replica了。 

第一次:

  (4)怎样处理Failed Replica恢复回来的图景:如果这partition
replica之前不在ack列表中,那么启动后再度为Zookeeper管理即可,之后producer发送message的时刻,partition
leader会继续发送message到此partition follower上。如果这partition
replica之前以ack列表中,此时还开后,需要拿此partition
replica再手动加到ack列表中。(ack列表是手动添加的,出现有部工作的partition
replica的下自动从ack列表中移除的)

myConsumerPosition = 1

– Partition
leader与follower:
partition也发出leader和follower之分。leader是主partition,producer写kafka的早晚先勾勒partition
leader,再由partition leader push给其他的partition follower。partition
leader与follower的信息被Zookeeper控制,一旦partition
leader所在的broker节点宕机,zookeeper会冲其他的broker的partition
follower上摘follower变为parition leader。

startPart = 1 * 3 + min(1, 1) = 4
—也不怕是打分区4起来读

– Topic分配partition和partition
replica的算法:
(1)将Broker(size=n)和用分配的Partition排序。(2)将第i只Partition分配至第(i%n)个Broker上。(3)将第i独Partition的第j个Replica分配至第((i

nParts = 3 + (if (1 + 1 > 1) 0 else
1) = 3 读取3个分区, 即4,5,6

  • j) % n)个Broker上

第二次:

 

myConsumerPosition = 0

– 消息投递可靠性

startPart = 3 * 0 + min(1, 0) =0  —
从分区0开始读

一个信息如何终究投递成功,Kafka提供了三种模式:

nParts = 3 + (if (0 + 1 > 1) 0 else
1) = 4 读取4个分区,即0,1,2,3


第一种植是何还非任,发送出就当作成功,这种气象当然不可知担保信息成功投递到broker;

第三次:


第二栽是Master-Slave模型,只有当Master和具备Slave都吸纳至信息时,才好不容易投递成功,这种模型提供了高的送可靠性,但是损害了性;

myConsumerPosition = 2


第三栽模型,即如果Master确认收到信息就是投递成功;实际用时,根据使用特性选择,绝大多数状下都见面受以及可靠性和性能选择第三种模型

startPart = 3 * 2 + min(2, 1) = 7 —
从分区7开始读

 
消息在broker上之可靠性,因为消息会持久化到磁盘上,所以一旦正常stop一个broker,其及之数码未会见丢掉;但是若不正常stop,可能会见要有页面缓存来不及写副磁盘的消息丢失,这得经部署flush页面缓存的周期、阈值缓解,但是同会一再之刻画磁盘会潜移默化性,又是一个挑题,根据实际情形部署。

nParts = 3 + if (2 + 1 > 1) 0 else
1) = 3 读取3个分区,即7, 8, 9

  消息消费的可靠性,Kafka提供的是“At least
once”模型,因为消息的读取进度由offset提供,offset可以由消费者自己维护为堪保障以zookeeper里,但是当消息消费后consumer挂掉,offset没有就经常写回,就有或产生更读的景,这种情况一致可以通过调整commit
offset周期、阈值缓解,甚至消费者自己拿消费以及commit
offset做成一个政工解决,但是只要你的应用不在乎重复消费,那便干脆无苟缓解,以换取最充分之属性。

由来10单分区都已分配殆尽

 

澳门美高梅手机网站 7

– Partition ack:当ack=1,表示producer写partition
leader成功后,broker就回来成功,无论任何的partition
follower是否刻画成功。当ack=2,表示producer写partition
leader和另外一个follower成功的时候,broker就回成功,无论任何的partition
follower是否刻画成功。当ack=-1[parition的数量]的早晚,表示除非producer全部写成功的当儿,才总算成,kafka
broker才返回成功信息。这边要专注的凡,如果ack=1的下,一旦出个broker宕机导致partition的follower和leader切换,会导致丢数据。

 澳门美高梅手机网站 8

  澳门美高梅手机网站 9

说到这里,经常闹个需要就是自家想吃有consumer线程消费指定的分区而未费其他的分区。坦率来说,目前Kafka并从未供从定义分配政策。做到及时点老不便,但仔细思量同一想,也许我们想Kafka做的政工太多了,毕竟它只是只信息引擎,在Kafka中进入消息消费的逻辑也许并无是Kafka该做的事情。

澳门美高梅手机网站 10

– message状态:在Kafka中,消息的状态为保留于consumer中,broker不会见关心谁消息于消费了为谁消费了,只记录一个offset值(指向partition中生一个一旦于消费之音讯位置),这即代表一旦consumer处理不好吧,broker上之一个音可能会见被消费屡次。

– message持久化:Kafka中会把消息持久化到地面文件系统中,并且维持o(1)极高之频率。我们众所周知IO读取是非常耗资源的属性也是不过缓慢的,这便是为着数据库的瓶颈时在IO上,需要换SSD硬盘的缘故。但是Kafka作为吞吐量极高的MQ,却可以好高效之message持久化到文件。这是坐Kafka是逐一写入o(1)的时空复杂度,速度非常快。也是赛吞吐量的来由。由于message的写照副持久化是逐一写副的,因此message在吃消费之早晚也是随顺序为消费之,保证partition的message是各个消费的。一般的机器,单机每秒100k条数据。

– message有效期:Kafka会长久保留其中的信,以便consumer可以频繁消费,当然其中不少细节是只是部署的。

– Produer
:
 Producer向Topic发送message,不需要指定partition,直接发送就好了。kafka通过partition
ack来支配是否发送成功并将信息返回给producer,producer可以产生自由多之thread,这些kafka服务器端是匪care的。Producer端的delivery
guarantee默认是At least once的。也可装Producer异步发送实现At most
once。Producer可以用主键幂等性实现Exactly once

– Kafka高吞吐量
Kafka的过人吞吐量体现于朗诵写及,分布式并发的朗读与描写都好抢,写的特性体现在为o(1)的工夫复杂度进行逐写入。读之性能体现在坐o(1)的光阴复杂度进行依次读取, 对topic进行partition分区,consume
group中的consume线程可以为老高能性能开展逐个读。

– Kafka delivery guarantee(message传送保证):(1)At most
once消息可能会见丢弃,绝对不见面重新传输;(2)At least once
消息纯属不见面丢掉,但是可能会见再也传输;(3)Exactly
once每条消息一定会让传相同不好都只有传输相同不良,这是用户想要之。

– 批量发送:Kafka支持因信集合为单位开展批量殡葬,以提高push效率。

– push-and-pull :
Kafka中之Producer和consumer采用的是push-and-pull模式,即Producer只管向broker
push信息,consumer只管从broker
pull消息,两者对信息的产及花是异步的。

– Kafka集众多被broker之间的涉及:不是主从关系,各个broker在聚集众多中地位平等,我们可肆意的增或去任何一个broker节点。

– 负载均衡方面: Kafka提供了一个 metadata
API来治本broker之间的负荷(对Kafka0.8.x而言,对于0.7.x主要依赖zookeeper来实现负载均衡)。

– 旅异步:Producer采用异步push方式,极大增强Kafka系统的吞吐率(可以透过参数控制是运一块还是异步方式)。

– 分区机制partition:Kafka的broker端支持信息分区partition,Producer可以决定将信息发到谁partition,在一个partition 中message的逐条就是Producer发送消息的依次,一个topic中可以生出差不多只partition,具体partition的数目是可配备的。partition的概念令kafka作为MQ可以横向扩张,吞吐量巨大。partition可以装replica副本,replica副本是不同的kafka
broker节点上,第一独partition是leader,其他的是follower,message先写到partition
leader上,再由partition leader push到parition
follower上。所以说kafka可以水平扩展,也即是扩大partition。

– 离线数据装载:Kafka由于针对而进展之多少持久化的支撑,它为非常适合向Hadoop或者数据仓库中展开数量装载。

– 实时数量和离线数据:kafka既支持离线数据也支撑实时数据,因为kafka的message持久化到文件,并得以设置有效期,因此可拿kafka作为一个快速的储存来使用,可以当做离线数据供后面的辨析。当然作为分布式实时信息网,大多数状下要用来实时的数码处理的,但是当cosumer消费能力降低之早晚可透过message的持久化在淤积数据在kafka。

– 插件支持:现在成千上万生动活泼的社区已出有许多插件来展开Kafka的意义,如用来配合Storm、Hadoop、flume相关的插件。

– 解耦:
 相当给一个MQ,使得Producer和Consumer之间异步的操作,系统里头解耦

– 冗余:  replica有差不多只副本,保证一个broker
node宕机后无见面影响整服务

– 扩展性:
 broker节点可以水平扩展,partition也足以水平日增,partition
replica也得水平日增

– 峰值:  在访问量剧增的状态下,kafka水平扩展,
应用依然要连续发挥作用

– 唯独恢复性:
 系统的同一局部零件失效时,由于起partition的replica副本,不会见影响到全系统。

– 依次保证性:由于kafka的producer的形容message与consumer去读message都是各个的读写,保证了高效的习性。

– 缓冲:由于producer那面可能工作好简短,而后端consumer业务会老复杂并起数据库的操作,因此一定是producer会比consumer处理速度快,如果没有kafka,producer直接调用consumer,那么就算会招整个体系的处理速度慢,加同交汇kafka作为MQ,可以起至缓冲的企图。

– 异步通信:作为MQ,Producer与Consumer异步通信

2.Kafka文书存储机制

2.1 Kafka部分名词解释如下:

 

     Kafka中发布订阅的对象是topic。我们得啊每类数据创建一个topic,把往topic发布消息的客户端称作producer,从topic订阅消息之客户端称作consumer。Producers和consumers可以又自多独topic读写多少。一个kafka集群由一个还是多单broker服务器组成,它担负持久化和备份具体的kafka消息。

  • Broker:Kafka节点,一个Kafka节点就是一个broker,多单broker可以做一个Kafka集群。
  • Topic:一接近消息,消息存放的目就主题,例如page
    view日志、click日志等还足以因topic的花样在,Kafka集群能够同时肩负多独topic的散发。
  • Partition:topic物理上的分组,一个topic可以分成多只partition,每个partition是一个一成不变的排
  • Segment:partition物理及由于多单segment组成,每个Segment存正message信息
  • Producer : 生产message发送到topic
  • Consumer : 订阅topic消费message, consumer作为一个线程来花
  • Consumer Group:一个Consumer Group包含多独consumer,
    这个是预先在布局文件中安排好的。各个consumer(consumer
    线程)可以构成一个组(Consumer group
    ),partition中之每个message只能于组(Consumer group )
    中的一个consumer(consumer 线程
    )消费,如果一个message可以叫多单consumer(consumer 线程 )
    消费的话,那么这些consumer必须于不同之组。Kafka不支持一个partition中的message由个别个或有限个以上的consumer
    thread来拍卖,即便是来不同之consumer
    group的吗杀。它不能够如AMQ那样可以基本上个BET作为consumer去处理message,这是以差不多单BET去花一个Queue中之数的早晚,由于要管不克多独线程拿和同长条message,所以便需履行级别悲观所(for
    update),这就算招致了consume的习性降低,吞吐量不够。而kafka为了确保吞吐量,只同意一个consumer线程去做客一个partition。如果认为效率不赛的时节,可以加partition的数来横向扩张,那么重加新的consumer
    thread去消费。这样没有锁竞争,充分发挥了横向的扩展性,吞吐量极高。这吗尽管形成了分布式消费的定义。

  • 2.2 kafka一些原理概念

1.持久化

kafka使用文件存储消息(append only
log),这虽一直决定kafka在性质达到严重依赖文件系统的自特性.且无任何OS下,对文件系统本身的优化是挺艰难的.文件缓存/直接内存映射等是常用的手段.因为kafka是指向日记文件进行append操作,因此磁盘检索的开支是比小之;同时以削减磁盘写副的次数,broker会将消息暂buffer起来,当消息之个数(或尺寸)达到自然阀值时,再flush到磁盘,这样减少了磁盘IO调用的破数.于kafka而言,较高性能的磁盘,将会晤带更为直白的特性提升.

 

2.性能

除开磁盘IO之外,我们还用考虑网络IO,这一直关乎及kafka的吞吐量问题.kafka并没有供极多高明的技巧;对于producer端,可以拿消息buffer起来,当消息之条数达到一定阀值时,批量发送给broker;对于consumer端也是同样,批量fetch多长消息.不过消息量的尺寸可以经配备文件来乘定.对于kafka
broker端,似乎来个sendfile系统调用可以潜在的升级换代网络IO的性质:将文件之多少映射到网外存中,socket直接读取相应的内存区域即可,而随便需经过又copy和交换(这里涉及到”磁盘IO数据”/”内核内存”/”进程内存”/”网络缓冲区”,多者之间的数目copy).

实质上对producer/consumer/broker三者而言,CPU的出应还未特别,因此启用消息压缩机制是一个名特优的政策;压缩需要消耗少量底CPU资源,不过对于kafka而言,网络IO更应用考虑.可以以其他在网达到传的音都经过压缩.kafka支持gzip/snappy等又抽方式.

 

3.载荷均衡

kafka集众多被之另一个broker,都可通往producer提供metadata信息,这些metadata中富含”集众多中现有的servers列表”/”partitions
leader列表”等消息(请参见zookeeper中的节点信息).
当producer获取到metadata信息之后, producer将会和Topic下所有partition
leader保持socket连接;消息由producer直接通过socket发送到broker,中间不见面通过任何”路由于层”.

异步发送,将大半漫漫信息暂还以客户端buffer起来,并以他们批量殡葬至broker;小数码IO太多,会延宕慢整体的纱延迟,批量延发送事实上提升了网络效率;不过就为起得的隐患,比如当producer失效时,那些从没发送的音信将会少。

 

4.Topic模型

外JMS实现,消息消费的职是来prodiver保留,以便避免重复发送信息还是将从未费成功的消息重发等,同时还要控制消息之状态.这便要求JMS
broker需要极多额外的工作.在kafka中,partition中之音信就出一个consumer在花费,且未设有信息状态的操纵,也不曾复杂的消息确认机制,可见kafka
broker端是相当轻量级的.当消息于consumer接收后,consumer可以以当地保存最后消息之offset,并间歇性的向zookeeper注册offset.由此可见,consumer客户端也格外轻量级。

kafka中consumer负责维护消息之消费记录,而broker则非体贴这些,这种设计不仅增强了consumer端的油滑,也适宜的减轻了broker端设计的复杂度;这是和重重JMS
prodiver的区别.此外,kafka中消息ACK的筹划呢和JMS有深要命异,kafka中之音讯是批量(通常以信息的条数或者chunk的尺寸也单位)发送给consumer,当消息消费成功后,向zookeeper提交消息之offset,而非见面向broker交付ACK.或许你已经意识及,这种”宽松”的筹划,将见面发生”丢失”消息/”消息重发”的危险.

 

5.音讯传相同

Kafka提供3栽信息传一致性语义:最多1糟,最少1糟,恰好1赖。

起码1潮:可能会见重传数据,有或出现数给再次处理的状态;

太多1不行:可能会见面世数量丢失情况;

正1蹩脚:并无是靠真的只导1涂鸦,只不过有一个编制。确保不会见起“数据给再次处理”和“数据丢失”的情形。

 

at most once:
消费者fetch消息,然后保存offset,然后处理消息;当client保存offset之后,但是以信息处理过程中consumer进程失效(crash),导致有的信不能继续处理.那么下可能其他consumer会接管,但是盖offset已经提前保存,那么新的consumer将未可知fetch到offset之前的音信(尽管它还没被处理),这就是是”at
most once”.

at least once:
消费者fetch消息,然后处理消息,然后保存offset.如果消息处理成以后,但是当保存offset阶段zookeeper异常或者consumer失效,导致保存offset操作未能履行成功,这即导致接下去再fetch时可能赢得上次曾经处理了的信,这便是”at
least once”.

“Kafka
Cluster”到买主的场面被可以应用以下方案来博取“恰好1糟”的一致性语义:

至少1潮+消费者之出口中额外搭都处理消息太酷编号:由于都处理消息太特别编号的有,不见面并发还处理消息之图景。

 

6.副本

kafka中,replication策略是基于partition,而无是topic;kafka将每个partition数据复制到几近单server上,任何一个partition有一个leader和多只follower(可以无);备份的个数可以经过broker配置文件来设定。leader处理所有的read-write请求,follower需要跟leader保持同步.Follower就比如一个”consumer”,消费信息并保存在地面日志被;leader负责跟踪所有的follower状态,如果follower”落后”太多或者失效,leader将见面将她自从replicas同步列表中删除.当所有的follower都拿同长消息保存成功,此信息才为看是”committed”,那么这consumer才能够消费它,这种联合策略,就要求follower和leader之间必须怀有可以的大网环境.即使单纯发生一个replicas实例存活,仍然可以确保信息之健康发送和收取,只要zookeeper集群存活就可.

择follower时需要兼顾一个题材,就是初leader
server上所已经承载的partition
leader的个数,如果一个server上闹过多之partition
leader,意味着此server将受着还多的IO压力.在推新leader,需要考虑到”负载均衡”,partition
leader较少的broker将见面再发出或变成新的leader.

 

7.log

每个log entry格式为”4独字节的数字N表示消息之长短” +
“N个字节的音讯内容”;每个日志都发一个offset来唯一的符一漫长消息,offset的价为8个字节的数字,表示这个消息在此partition中所处之序幕位置..每个partition在物理存储层面,有多独log
file组成(称为segment).segment
file的命名吧”最小offset”.kafka.例如”00000000000.kafka”;其中”最小offset”表示这segment中开局消息之offset.

抱信息时,需要指定offset和太特别chunk尺寸,offset用来表示消息之开头位置,chunk
size用来代表最要命收获信息的究竟长度(间接的表示消息之条数).根据offset,可以找到这消息所在segment文件,然后因segment的最小offset取差值,得到其于file中的相对位置,直接读取输出即可.

 

澳门美高梅手机网站 11

8.分布式

kafka使用zookeeper来存储一些meta信息,并利用了zookeeper
watch机制来发现meta信息之改动并作出相应的动作(比如consumer失效,触发负载均衡等)

Broker node registry: 当一个kafka
broker启动后,首先会见向zookeeper注册自己的节点信息(临时znode),同时当broker和zookeeper断开连接时,此znode也会见被删除.

Broker Topic Registry:
当一个broker启动时,会于zookeeper注册自己抱有的topic和partitions信息,仍然是一个临时znode.

Consumer and Consumer group:
每个consumer客户端被创造时,会于zookeeper注册自己的信;此作用至关重要是以”负载均衡”.一个group中之差不多个consumer可以交错的花费一个topic的富有partitions;简而言之,保证这个topic的具备partitions都能叫这group所消费,且花费时为性考虑,让partition相对平衡的分散到每个consumer上.

Consumer id Registry:
每个consumer都发一个唯一的ID(host:uuid,可以通过部署文件指定,也堪由系统生成),此id用来号消费者信息.

Consumer offset Tracking:
用来跟每个consumer目前所花的partition中最老的offset.此znode为持久节点,可以视offset跟group_id有关,以表明当group中一个消费者失效,其他consumer可以继续消费.

Partition Owner registry:
用来号partition正在吃谁consumer消费.临时znode。此节点表达了”一个partition”只能被group下一个consumer消费,同时当group下某个consumer失效,那么将见面沾负载均衡(即:让partitions在差不多只consumer间均衡消费,接管那些”游离”的partitions)

当consumer启动时,所点的操作:

A) 首先进行”Consumer id Registry”;

B) 然后当”Consumer id
Registry”节点下报了名一个watch用来监听时group中另外consumer的”leave”和”join”;只要此znode
path下节点列表变更,都见面触发此group下consumer的负载均衡.(比如一个consumer失效,那么其它consumer接管partitions).

C) 在”Broker id
registry”节点下,注册一个watch用来监听broker的幸存情况;如果broker列表变更,将会晤触发所有的groups下的consumer重新balance.

 

总结:

1)
Producer端使用zookeeper用来”发现”broker列表,以及跟Topic下每个partition
leader建立socket连接并发送消息.

2) Broker端使用zookeeper用来报broker信息,已经监测partition
leader存活性.

3)
Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费之partition列表等,同时也用来发现broker列表,并与partition
leader建立socket连接,并赢得信息。

 

9.Leader的选择

Kafka的骨干是日记文件,日志文件在汇众多中之一块是分布式数据系统最基础的因素。

设leaders永远不见面down的语句我们便无待followers了!一旦leader
down掉了,需要以followers中选取一个新的leader.但是followers本身来或延时太久或crash,所以必须挑选高质量的follower作为leader.必须确保,一旦一个音被提交了,但是leader
down掉了,新选出的leader必须得供及时条消息。大部分之分布式系统采用了绝大多数投票法则选择新的leader,对于多数投票法则,就是根据所有副本节点的气象动态的抉择最可之当作leader.Kafka并无是运这种艺术。

Kafka动态维护了一个同状态的副本的聚合(a set of in-sync
replicas),简称ISR,在此集中的节点都是跟leader保持高度一致的,任何一样修信息必须被这集中的每个节点读取并增至日志中了,才回通知外部这个消息已让付了。因此是集中的别样一个节点随时都得于选为leader.ISR在ZooKeeper中保障。ISR中产生f+1独节点,就得允许以f个节点down掉的事态下不见面丢掉消息并正常提供服。ISR的分子是动态的,如果一个节点被裁了,当它们还上“同步中”的状态时,他得重新加入ISR.这种leader的选方式是充分快的,适合kafka的使用场景。

一个凶悍之想法:如果具有节点都down掉了怎么收拾?Kafka对于数据不见面丢掉的管,是依据至少一个节点是存活的,一旦有所节点都down了,这个就算未克保证了。

实则行使被,当有的副本都down掉时,必须立即作出反应。可以有以下简单栽选择:

  1. 等候ISR中的其他一个节点恢复并做leader。

  2. 选取有节点受到(不特是ISR)第一只恢复的节点作为leader.

立即是一个每当可用性和连续性之间的权。如果等待ISR中之节点恢复,一旦ISR中之节点打未起来还是数还是了,那集群就永远恢复不了了。如果等待ISR意外之节点恢复,这个节点的多寡就是会给当线达数,有或跟实事求是的数量有出入,因为有点数据它恐怕还从来不一起到。Kafka目前挑选了次种政策,在未来底版本中将要之方针的抉择而配置,可以根据气象灵活的选取。

这种困境不一味Kafka会逢,几乎有的分布式数据系统都见面遇到。

 

10.副本管制

如上就因为一个topic一个分区为例子进行了讨论,但骨子里一个Kafka将会晤管理成千上万的topic分区.Kafka尽量的如所有分区均匀的遍布到集群拥有的节点上一经非是汇集在好几节点上,另外主从关系也硬着头皮均衡这样每个几接触还见面当一定比例之分区的leader.

优化leader的选择过程吧是老重要之,它控制了网发出故障时的空窗期有多久。Kafka选择一个节点作为“controller”,当发现发节点down掉的时候它担负在游泳分区的有着节点受到甄选新的leader,这令Kafka可以批量的快速之军事管制有分区节点的主从关系。如果controller
down掉了,活在的节点受到之一个会备切换为新的controller.

 

11.Leader跟副本同步

于有分区来说,保存正分区的”broker”为该分区的”leader”,保存备份分区的”broker”为该分区的”follower”。备份分区会完全复制正分区的音讯,包括信息之号码等附加属性值。为了保持正分区和备份分区的情节同样,Kafka采取的方案是当保存备份分区的”broker”上开启一个客进程展开花费,从而使得刚刚分区的情节和备份分区的情保持一致。一般景象下,一个分区有一个“正分区”和零到多单“备份分区”。可以配备“正分区+备卖分区”的总数据,关于这个布局,不同主题可以发两样之配置值。注意,生产者,消费者只与保留正分区的”leader”进行通信。

 

Kafka允许topic的分区拥有多少副本,这个数是得安排的,你得啊每个topic配置副本的多寡。Kafka会自动在每个副本上备份数据,所以当一个节点down掉时数还是是可用的。

Kafka的副本功能不是必的,你可以安排才发生一个副本,这样实在就是相当给仅来一样卖数据。

创办副本的单位凡topic的分区,每个分区都发出一个leader和零或几近只followers.所有的读写操作都由leader处理,一般分区的数据都比broker的数据多的大都,各分区的leader均匀的分布于brokers中。所有的followers都复制leader的日志,日志被之音以及各个都跟leader中的相同。followers向一般的consumer那样从leader那里拉取消息并保存在投机之日记文件中。

众分布式的音信网自动的拍卖失败的呼吁,它们对一个节点是否正在(alive)”有着鲜明的概念。Kafka判断一个节点是否在在来少数独标准化:

1.
节点必须得保障与ZooKeeper的连续,Zookeeper通过心跳机制检查每个节点的连。

  1. 而节点是只follower,他必须能够这的同步leader的描写操作,延时不可知尽漫长。

切合上述口径的节点标准之游说该是“同步中的(in
sync)”,而休是模糊的就是“活在的”或是“失败的”。Leader会追踪所有“同步中”的节点,一旦一个down掉了,或是卡住了,或是延时最漫长,leader就会见将她移除。至于延时多久算是“太久”,是出于参数replica.lag.max.messages决定的,怎样算是卡住了,怎是由参数replica.lag.time.max.ms决定的。

惟有当消息被有的副本加入到日志中不时,才算是“committed”,只有committed的音才会发送给consumer,这样尽管不用担心一旦leader
down掉了音信会丢。Producer也得以择是否等消息给付的通,这个是由参数acks决定的。

Kafka保证只要来一个“同步中”的节点,“committed”的消息就是不见面丢。

 

 

  • 2.3  kafka拓扑结构

    澳门美高梅手机网站 12

     
 一个超人的Kafka集众多被寓几Producer(可以是web前端FET,或者是服务器日志等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越强),若干ConsumerGroup,以及一个Zookeeper集群。Kafka通过Zookeeper管理Kafka集群配置:选举Kafka
broker的leader,以及以Consumer
Group发生变化时进行rebalance,因为consumer消费kafka
topic的partition的offsite信息是是Zookeeper的。Producer使用push模式将信息宣布暨broker,Consumer用pull模式由broker订阅并花信息。

 

浅析过程分成以下4个步骤:

  • topic中partition存储分布
  • partiton中文件存储方
    (partition在linux服务器上就是是一个目(文件夹))
  • partiton中segment文件存储结构
  • 当partition中哪通过offset查找message

由此上述4进程详细分析,我们便可以掌握认识及kafka文件存储机制的深。

 

2.3 topic中partition存储分布

而实验环境面临Kafka集群只发一个broker,xxx/message-folder为数据文件存储根目录,在Kafka
broker中server.properties文件配置(参数log.dirs=xxx/message-folder),例如创建2只topic名
称分别吗report_push、launch_info, partitions数量还为partitions=4

存储路径和目录规则为:

xxx/message-folder

  |–report_push-0
  |–report_push-1
  |–report_push-2
  |–report_push-3
  |–launch_info-0
  |–launch_info-1
  |–launch_info-2
  |–launch_info-3

 

以Kafka文件存储着,同一个topic下发出多单例外partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一独partiton序号从0开始,序号最要命价值吗partitions数量减1。

信发送时犹让发送至一个topic,其庐山真面目就是一个目,而topic由是由局部Partition组成,其团伙结构要下图所示:

 

咱得以看到,Partition是一个Queue的构造,每个Partition中的信还是板上钉钉的,生产的音给不断增多到Partition上,其中的各一个消息都吃赋予了一个唯一的offset值。

 

Kafka集群会保存有的音,不管消息来无发让消费;咱们得设定消息的过时,只有过的多少才见面给机关清除为自由磁盘空间。依照我们安信息过期时吧2天,那么就2天外之持有信息都见面为封存至集结众多被,数据只有过了片天才见面给免除。

 

Kafka只保障以Partition中的offset值,因为此offsite标识在是partition的message消费及哪条了。Consumer每花一个音,offset就会见加1。其实消息的状态了是出于Consumer控制的,Consumer可以跟和重设这个offset值,这样的话Consumer就好读取任意位置的音。

 

将消息日志以Partition的款型存放有多更考虑,第一,方便于联谊众多被扩大,每个Partition可以经过调整以适应其所当的机械,而一个topic又得生差不多个Partition组成,因此所有集群就可以适应任意大小的多少了;第二不怕是得提高并发,因为好坐Partition为单位读写了。

 

由此地方介绍的我们可以掌握,kafka中的数据是持久化的而能够容错的。Kafka允许用户为每个topic设置副本数量,副本数量控制了生几乎独broker来存放写副的数码。如果您的副本数量设置为3,那么等同卖数据就是见面于寄放于3玉不同的机上,那么尽管许有2个机械失败。一般推荐副本数量最少为2,这样即便足以确保增减、重开机器时未见面影响及数码消费。如果对数据持久化有再度胜的渴求,可以把副本数量设置也3或者又多。

 

Kafka中的topic是因partition的形式存放的,每一个topic都可以安装它的partition数量,Partition的多少控制了咬合topic的message的多寡。Producer在生养数量时,会按一定规则(这个规则是足以起定义的)把信息公布暨topic的次第partition中。上面用的副本都是坐partition为单位之,不过仅仅发生一个partition的副本会被选举成leader作为读写用。

 

有关什么设置partition值需要考虑的素。一个partition只能让一个顾客花(一个主顾可以又花费基本上个partition),因此,如果安的partition的数仅次于consumer的数目,就会见来客花不交多少。所以,推荐partition的数额肯定要是过同时运转的consumer的多少。另外一端,建议partition的多寡超越集群broker的多寡,这样leader
partition就可均匀的分布在一一broker中,最终使得集群负载均衡。在Cloudera,每个topic都来成百上千独partition。需要专注的是,kafka需要也每个partition分配一些内存来缓存消息数据,如果partition数量进一步充分,就要为kafka分配更老的heap
space。

2.4 partiton中文件存储方

  • 每个partion(目录)相当给一个特大型文件给平均分配到多单轻重缓急相等segment(段)数据文件中。但每个段segment
    file消息数量不必然当,这种特征方便old segment file快速为删除。
  • 每个partiton只需要支持顺序读写就尽了,segment文件生命周期由服务端配置参数决定。

如此做的补就能快速去无用文件,有效提高磁盘利用率。

澳门美高梅手机网站 13

2.5 partiton中segment文件存储结构

producer发message到某topic,message会被全匀的布至差不多独partition上(随机或冲用户指定的回调函数进行分布),kafka
broker收到message往对应partition的末梢一个segment上上加该信息,当某个segment上的消息条数达到配置值或信息宣布时过阈值时,segment上的信会于flush到磁盘,只有flush到磁盘上的音信consumer才会消费,segment达到一定之分寸后以不见面再也为该segment写多少,broker会创建新的segment。

 

每个part在内存中对应一个index,记录每个segment中的首先条信息偏移。

  • segment file组成:由2大部分整合,分别吗index file和data
    file,此2只公文相继对应,成对出现,后缀”.index”和“.log”分别代表也segment索引文件、数据文件.
  • segment文件命名规则:partion全局的率先个segment从0开始,后续每个segment文件称吧达到一个大局partion的极度老offset(偏移message数)。数值最老啊64各类long大小,19各类数字字符长度,没有数字用0填充。

 

每个segment中存储很多修消息,消息id由该论理位置决定,即于信id可一直固定到信息之贮存位置,避免id到岗位的额外映射。

下面文件列表是作者在Kafka broker上开的一个试验,创建一个topicXXX包含1
partition,设置每个segment大小为500MB,并启动producer向Kafka
broker写副大量数据,如下图2所示segment文件列表形象说明了上述2个规则:

澳门美高梅手机网站 14

以上述图2面临平等对segment file文件也例,说明segment中index<—->data
file对许涉及物理结构如下:

澳门美高梅手机网站 15

上述图3受索引文件存储大量头条数据,数据文件存储大量消息,索引文件中元数据对对应数据文件中message的物理偏移地址。其中因索引文件中
元数据3,497呢例,依次以数据文件中意味第3独message(在大局partiton表示第368772单message)、以及该消息之物理偏移
地址也497。

从今上述图3了解及segment data
file由众message组成,下面详细说明message物理结构如下:

澳门美高梅手机网站 16

参数说明:

关键字 解释说明
8 byte offset 在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它可以唯一确定每条消息在parition(分区)内的位置。即offset表示partiion的第多少message
4 byte message size message大小
4 byte CRC32 用crc32校验message
1 byte “magic" 表示本次发布Kafka服务程序协议版本号
1 byte “attributes" 表示为独立版本、或标识压缩类型、或编码类型。
4 byte key length 表示key的长度,当key为-1时,K byte key字段不填
K byte key 可选
value bytes payload 表示实际消息数据。

 

2.6 在partition中什么通过offset查找message

诸如读取offset=368776底message,需要经下2只步骤查找。

  • 率先步查找segment file

    上述图2为例,其中00000000000000000000.index表示无比初步的文本,起始偏移量(offset)为0.次个文本
    00000000000000368769.index的消息量起始偏移量为368770 = 368769 +
    1.均等,第三只文件00000000000000737337.index的开端偏移量为737338=737337 +
    1,其他后续文件相继类推,以起始偏移量命名并排序这些文件,只要根据offset
    **亚划分查找**文本列表,就可以迅速稳定到实际文件。

    当offset=368776时不时一贯到00000000000000368769.index|log

  • 亚步通过segment file查找message通过第一步稳及segment
    file,当offset=368776时常,依次定位到00000000000000368769.index的正数据物理位置以及
    00000000000000368769.log的物理偏移地址,然后还经00000000000000368769.log顺序查找直到
    offset=368776收。

segment index
file采取稀疏索引存储方,它减少索引文件大小,通过mmap可以一直内存操作,稀疏索引起为数据文件的每个对应message设置一个正数据指针,它
比稠密索引节省了重多的仓储空间,但找起来用吃又多的年月。

 

kafka会记录offset到zk中。但是,zk client
api对zk的再三写副是一个不行的操作。0.8.2 kafka引入了native offset
storage,将offset管理于zk移有,并且可以完成水平扩展。其原理就是以了kafka的compacted
topic,offset因consumer
group,topic与partion的结缘作为key直接交给到compacted
topic中。同时Kafka又在内存中保护了的老三冠组来保障最新的offset信息,consumer来取最新offset信息之时节一直内存里拿即可。当然,kafka允许你速的checkpoint最新的offset信息到磁盘上。

 

3.Partition Replication原则

Kafka高效文件存储设计特征

  • Kafka把topic中一个parition大文件分为多独小文件段,通过多单稍文件段,就容易定期清除或去已经花完文件,减少磁盘占用。
  • 透过索引信息可以便捷稳定message和规定response的太特别尺寸。
  • 经过index元数据全照到memory,可以避免segment file的IO磁盘操作。
  • 由此索引文件稀疏存储,可以大幅下滑index文件首先数据占用空间大小。

 

 

  1. Kafka集群partition replication默认自动分配分析

下面为一个Kafka集众多被4个Broker举例,创建1个topic包含4单Partition,2
Replication;数据Producer流动如图所示:

(1)

澳门美高梅手机网站 17

 

(2)当集群被新加2节点,Partition增加到6个时分布状况如下:

澳门美高梅手机网站 18

副本分配逻辑规则如下:

  • 当Kafka集众多被,每个Broker都出咸等分配Partition的Leader机会。
  • 上述图Broker
    Partition中,箭头指向也副本,以Partition-0吗条例:broker1中parition-0呢Leader,Broker2中Partition-0呢副本。
  • 上述图种每个Broker(按照BrokerId有序)依次分配主Partition,下一个Broker为副本,如此循环迭代分配,多可本都遵循这规则。

 

副本分配算法如下:

  • 用具备N Broker和要分配的i个Partition排序.
  • 将第i单Partition分配到第(i mod n)个Broker上.
  • 用第i只Partition的第j独副本分配到第((i + j) mod n)个Broker上.

 

4.Kafka Broker组成部分表征

4.1 无状态的Kafka Broker :

  1. Broker没有副本机制,一旦broker宕机,该broker的信息将都未可用。

  2. Broker不保存订阅者的状态,由订阅者自己保留。

3.
任状态导致信息之勾成为难题(可能勾的消息在给订阅),kafka采用基于时间之SLA(服务水平保证),消息保存得时间(通常也7天)后会见吃去除。

  1. 信息订阅者可以rewind
    back到任意位置再度展开消费,当订阅者故障时,可以挑选最好小的offset进行重复读取消费信息。

 

4.2 message的付出及生命周期 :

  1. 免是从严的JMS,
    因此kafka对信息之更、丢失、错误和顺序型没有严格的渴求。(这是跟AMQ最要命的区分)

  2. kafka提供at-least-once
    delivery,即当consumer宕机后,有些信息可能会见让重复delivery。

  3. 坐每个partition只见面吃consumer
    group内的一个consumer消费,故kafka保证每个partition内的音信会给逐一的订阅。

4.
Kafka为各国条信息吧各级条消息计算CRC校验,用于错误检测,crc校验不经之音信会直接被抛弃掉。

 

4.3 压缩

 

Kafka支持以聚众(batch)为单位发送信息,在此基础及,Kafka还支持对信息集合进行压缩,Producer端可以通过GZIP或Snappy格式对信息集合进行压缩。Producer端进行压缩后,在Consumer端需进行解压。压缩的益处就是是减掉传输的数据量,减轻对网络传输的下压力,在针对充分数额处理及,瓶颈往往反映于网络直达要无是CPU。

 

那么什么样区分消息是减掉的尚是不减的吗,Kafka在消息头部添加了一个叙压缩属性字节,这个字节的后少位代表消息之削减采用的编码,如果后少号呢0,则表示消息未让抽。

 

4.4 消息可靠性

 

每当信息网面临,保证信息于养与消费过程被的可靠性是雅关键之,在实际消息传递过程中,可能会见并发如下三挨状态:

 

– 一个音发送失败

 

– 一个音讯于发送多次

 

– 最精彩的情状:exactly-once ,一个信息发送成功都仅发送了同不成

 

发出成千上万系宣称其贯彻了exactly-once,但是其其实忽略了劳动者或消费者于生产以及花过程遭到起或破产的情景。比如虽然一个Producer成功发送一个信息,但是消息在发送途中掉,或者成功发送至broker,也被consumer成功取走,但是这consumer在处理获过来的消息不时失败了。

 

自从Producer端看:Kafka是这般处理的,当一个消息给发送后,Producer会等待broker成功接收及信息之上报(可透过参数控制等时),如果消息于中途掉或内部一个broker挂掉,Producer会重新发送(我们清楚Kafka有备份机制,可以经参数控制是否等所有备份节点都接信)。

 

从Consumer端看:前面说到了partition,broker端记录了partition中的一个offset值,这个值指向Consumer下一个将消费message。当Consumer收到了信,但可于处理过程中挂掉,此时Consumer可以经者offset值更找到上一个信再度进行处理。Consumer还时有发生权力控制是offset值,对持久化到broker端的消息做任意处理。

 

4.5 备份机制

 

备份机制是Kafka0.8本子的初特点,备份机制的产出大大提高了Kafka集群的可靠性、稳定性。有矣备份机制后,Kafka允许集众多中之节点挂掉后如若无影响整集群工作。一个备份数据为n的集群允许n-1个节点失败。在备备份节点受到,有一个节点作为lead节点,这个节点保存了外备份节点列表,并维持各个备份间的状体同步。下面就幅图解释了Kafka的备份机制:

 

澳门美高梅手机网站 19

4.6 Kafka高效性相关规划

 

4.6.1 消息之持久化

Kafka高度依赖文件系统来储存和缓存消息(AMQ的nessage是持久化到mysql数据库中之),因为相似的人口认为磁盘是缓缓的,这造成人们对持久化结构有所竞争性持怀疑态度。其实,磁盘的赶紧或者慢性,这决定于我们什么样以磁盘。因为磁盘线性写的进度远超随机写。线性读写于大部分动场景下是足以预测的。

4.6.2 常数时间性能保证

每个Topic的Partition的凡一个异常文件夹,里面来为数不少只小文件夹segment,但partition是一个队列,队列中之素是segment,消费之时先从第0单segment开始消费,新来message存在最后一个信息队列中。对于segment也是对队列,队列元素是message,有照应的offsite标识是哪位message。消费之时节先打这segment的首先独message开始消费,新来之message存在segment的尾声。

 

信网的持久化队列可以构建以针对一个文件的宣读与充实上,就像相似景象下的日记解决方案。它起一个优点,所有的操作都是常数时间,并且读写之间未见面相阻塞。这种规划有着极大的习性优势:最终系统特性及数目大小完全无关,服务器可以充分利用廉价的硬盘来提供高效的信服务。

 

实质上还有一些,磁盘空间的最为叠加如无影响性这点,意味着我们可提供一般消息网无法提供的特色。比如说,消息让消费后无是立即被剔除,我们得将这些信息保留一截相对较丰富的流年(比如一个礼拜)。

 

5.Kafka 生产者-消费者

     消息网通常还见面由生产者,消费者,Broker三大部分组成,生产者会拿消息写副到Broker,消费者会起Broker中读取出消息,不同之MQ实现之Broker实现会晤迥然不同,不过Broker的本来面目都是一旦担将信息落地到劳动端的储存系统被。具体步骤如下:

  1. 生产者客户端应用程序产生信息:

    1. 客户端连接对象将信息包装至要被发送到服务端

    2. 服务端的入口为产生一个老是对象承担接请求,并拿消息因文件之款型储存起来

    3. 服务端返回响应结果被劳动者客户端

  2. 买主客户端应用程序消费信息:

    1. 客户端连接对象将花费信息为卷入至要被发送给服务端

    2. 服务端从文本存储系统受到取出消息

    3. 服务端返回响应结果被买主客户端

    4. 客户端将应结果还原成信息并开始拍卖消息

                                                                       
      图4-1 客户端和服务端交互

 

5.1  Producers

 

Producers直接发送信息及broker上的leader
partition,不需经过其他中介或其他路由转发。为了兑现此特点,kafka集众多中之每个broker都可以响应producer的恳求,并返回topic的一对正信息,这些元信息包括什么机器是存活的,topic的leader
partition都当啊,现阶段安leader partition是可一直给聘的。

 

Producer客户端自己支配正在信息让推送至怎么partition。兑现的章程得以是随意分配、实现平等近似随机负载均衡算法,或者指定一些分区算法。Kafka提供了接口供用户实现自定义之partition,用户可呢每个消息指定一个partitionKey,通过这个key来贯彻有hash分区算法。比如,把userid作为partitionkey的语句,相同userid的消息将会晤受推送至跟一个partition。

 

为Batch的法门推送数据足以大幅度的提高处理效率,kafka Producer
可以拿消息在内存中累计到早晚数额后当做一个batch发送请求。Batch的数量大小可以通过Producer的参数控制,参数值可以装为一起的信息之数码(如500修)、累计的辰距离(如100ms)或者累计的多少大小(64KB)。通过多batch的轻重缓急,可以抽网络要与磁盘IO的次数,当然具体参数设置需要在效率和时效性方面举行一个权衡。

 

Producers可以异步的彼此的通往kafka发送信息,但是日常producer在殡葬完信息后会赢得一个future响应,返回的是offset值或者发送过程被相遇的失实。这里面有个老重要的参数“acks”,这个参数决定了producer要求leader
partition
收到确认的副本个数,如果acks设置数量也0,表示producer不会等待broker的响应,所以,producer无法知道消息是否发送成功,这样有或会见导致数据丢失,但又,acks值为0会得到最深的系统吞吐量。

 

若acks设置为1,表示producer会在leader
partition收到信息时收获broker的一个认可,这样见面起重复好之可靠性,因为客户端会等待直到broker确认收到信息。若设置为-1,producer会在有着备份的partition收到信息不时获得broker的认可,这个设置好获最高的可靠性保证。

 

Kafka
消息发出一个定长的header和变长的字节数组组成。因为kafka消息支持字节数组,也就是叫kafka可以支持外用户从定义的序列号格式或其它都部分格式如Apache
Avro、protobuf等。Kafka没有限制单个消息之尺寸,但咱引进消息大小不要过1MB,通常一般消息大小都以1~10kB之前。

 

披露消息不时,kafka
client先构造一长信息,将信息在到信息集set中(kafka支持批量宣告,可以往消息集合中上加多修信息,一次于施行发布),send消息时,producer
client需点名消息所属之topic。

 

5.2  Consumers

Kafka提供了零星套consumer api,分为high-level api和sample-api。Sample-api
是一个底层的API,它维持了一个和单一broker的连接,并且这个API是截然无状态的,每次要都得指定offset值,因此,这套API也是绝灵敏的。

 

每当kafka中,当前读到哪条信息之offset值是由于consumer来保护的,因此,consumer可以团结控制如何读博kafka中之数码。依照,consumer可以透过重设offset值来又消费都花费过的数量。不管有没发出叫消费,kafka会保留数据一段时间,这个时刻周期是可安排的,只来到了晚点时,kafka才见面去除这些多少。(这或多或少以及AMQ不平等,AMQ的message一般的话还是持久化到mysql中之,消费完毕的message会被delete掉)

 

High-level
API封装了针对聚集众多中一样多重broker的走访,可以透明的花费一个topic。它和谐维持了已花信息的状态,即每次花之且是产一个音。

 

High-level
API还支持以组的款式消费topic,如果consumers有同一个组名,那么kafka就相当给一个列消息服务,而各个consumer均衡的费相应partition中的多寡。若consumers有异之组名,那么此时kafka就相当与一个播服务,会将topic中之享有信息广播及每个consumer。

 

High level api和Low level api是针对consumer而言的,和producer无关。

 

High level api是consumer读的partition的offsite是是zookeeper上。High
level
api 会启动另外一个线程去各隔一段时间,offsite自动同步到zookeeper上。换句话说,如果使用了High
level api,
每个message只能于读一次,一旦读了当下长达message之后,无论自己consumer的拍卖是否ok。High
level
api的另外一个线程会活动的管offiste+1同步到zookeeper上。如果consumer读取数据出了问题,offsite也会以zookeeper上同台。因此,如果consumer处理失败了,会继续执行下一条。这频繁是颠三倒四的一言一行。因此,Best
Practice是若consumer处理失败,直接为全conusmer
group抛Exception终止,但是最终念之这同长达数是不见了,因为当zookeeper里面的offsite已经+1了。等再启动conusmer
group的时候,已经由生同样修开始读取处理了。

 

Low level
api是consumer读的partition的offsite在consumer自己之先后中保障。不见面共同到zookeeper上。但是以kafka
manager能够好之督察,一般为会见手动的同台到zookeeper上。这样的好处是要是读取某个message的consumer失败了,这漫长message的offsite我们团结维护,我们无会见+1。下次重开行的时刻,还见面打者offsite开始念。这样好得exactly
once对于数据的准头有包。

 

 

对于Consumer group:

  1. 容consumer
    group(包含多单consumer,如一个集群又花费)对一个topic进行花费,不同的consumer
    group之间独立消费。

  2. 为对减弱多少一个consumer
    group中不同consumer之间的分布式协调出,指定partition为无限小之互相消费单位,即一个group内的consumer只能消费不同的partition。

澳门美高梅手机网站 20

 

Consumer与Partition的关系:


如果consumer比partition多,是浪费,因为kafka的宏图是以一个partition上是免允许出现的,所以consumer数不要超出partition数


如果consumer比partition少,一个consumer会对应于多单partitions,这里主要合理分配consumer数和partition数,否则会导致partition里面的多寡被取的莫全匀


如果consumer从多只partition读到数码,不保证数据间的顺序性,kafka只包在一个partition上多少是有序的,但大多单partition,根据你念之一一会来例外


增减consumer,broker,partition会导致rebalance,所以rebalance后consumer对应的partition会发生变化

– High-level接口中拿走不顶数码的下是会block的

 

负载低之情况下足每个线程消费多独partition。但负载高之情状下,Consumer
线程数最好及Partition数量保持一致。如果要花费不回复,应该更起 Consumer
进程,进程内线程数同样与分区数一模一样。

 

消费信息时,kafka client需点名topic以及partition
number(每个partition对应一个逻辑日志流,如topic代表之一产品线,partition代表产品线的日志按天切分的结果),consumer
client订阅后,就可迭代读取信息,如果没音讯,consumer
client会阻塞直到发生新的信发表。consumer可以积累确认接收及之音,当该承认了某个offset的音信,意味着前的音讯吧都曾经成接到及,此时broker会更新zookeeper上地offset
registry。

 

5.3  迅猛之数码传

1.  发布者每次可揭示多长达消息(将消息加到一个信息集合中宣告), consumer每次迭代消费一样长条消息。

2.  不创造单独的cache,使用系统的page
cache。发布者顺序发布,订阅者通常比发布者滞后一点点,直接运用Linux的page cache效果也正如后,同时抽了cache管理及废弃物收集之开。

3.  应用sendfile优化网络传输,减少一软外存拷贝。

 

6.Kafka 与 Zookeeper

 

6.1 Zookeeper 协调控制

1. 管制broker与consumer的动态加入和离开。(Producer不需管住,随便一光计算机都好看作Producer向Kakfa
Broker发消息)

2. 接触负载均衡,当broker或consumer加入或去时会见硌负载均衡算法,使得同一

   个consumer group内的基本上单consumer的花负载平衡。(因为一个comsumer消费一个或者多独partition,一个partition只能被一个consumer消费)

3.  护卫费关系和每个partition的花信息。

 

6.2 Zookeeper上的细节:

1. 每个broker启动后会见在zookeeper上登记一个现之broker
registry,包含broker的ip地址与端口号,所蕴藏的topics和partitions信息。

2. 每个consumer启动后会见在zookeeper上注册一个即之consumer
registry:包含consumer所属的consumer group以及订阅的topics。

3. 每个consumer
group关联一个临时之owner registry和一个持久的offset registry。对于被订阅的每个partition包含一个owner
registry,内容吧订阅者partition的consumer id;同时含有一个offset
registry,内容也达成同样次等订阅的offset。

 

 

转载:http://blog.csdn.net/YChenFeng/article/details/74980531

发表评论

电子邮件地址不会被公开。 必填项已用*标注