竹笋

注册

 

发新话题 回复该主题

Kafka源码的学习框架覆盖Kafka核 [复制链接]

1#
中科助力健康中国 http://baidianfeng.39.net/a_yqhg/180119/6010261.html

一、Kafka总览

1)kafka集群是由broker组成,每个borker拥有一个controller,基于zookeeper做集群controllerleader选举,以及存储集群核心元数据,leadercontroller负责管理整个集群;

2)以Topic-partition-replication来存储生产者数据,每个partition为一个Log,log分段存储于文件中;

3)kafka集群管理消费者信息和消费者消费记录,这些信息也以内部topic形式存储;

4)KafkaBroker结构。

二、Broker结构

1)

2)每个borker进程,都包含各个管理器,如socketServer网络处理,replicaManager副本管理器,kafkaController集群管理器,groupCoordinator消息者数据管理器,LogManager日志数据管理器,kafkaScheduler定时器,zkClient与zookeeper通信管理器,transactionCoordinator事务协调器。

三、通信框架

1)

2)socketserver会启动一个acceptor线程,用于接收和创建新socket,并轮询安排给processorthread来处理后续的数据io;

3)processor接收到数据后包装成request请求放入单个requestQueue队列,并有多个io逻辑处理thread从requestQueue中取request处理;

4)根据request类型调用kafkaapi完成处理;

5)

6)处理完请求后,封装成reponse,根据ProcessorID放入对应的responseQueue由对应的processor线程完成回复。

四、log结构

1)Topic、partition和replica关系

2)

3)每个topic有很多个partition组成,由keyhash值分配到不同的partition,每个partition拥有多个副本replica做主从,确保数据的安全性。

4)每个partition或者replica由log存储数据,log由logsegment组成,每个logsegment由索引文件和数据文件组成。

5)

6)

7)现在Log中需要查找获取一条消息时,会根据偏移首先定位到处于哪个logsegment文件,再根据索引文件定位,Logsegment是由跳跃表组成的,便于搜索,再从数据文件读取消息;

8)

9)索引文件由K,V组成,K是相对文件中第几条消息,V是文件中的绝对位置,索引文件可以用来做二分查找,从索引文件中找到位置之后,再从数据文件中顺序查找,具体那条消息数据,为了避免索引文件太大,会相隔一定字节才写入一条索引;

10)每个partition会有多个replica进行同步,一个Leader多个follower,这些副本主从地位是由leadercontroller负责处理,只有leaderreplica才能处理请求,其它follower同步数据。

五、Controller

1)每个broker都拥有一个kafkacontroller,controller主要负责管理整个集群,但是每个集群中都只有一个leadercontroller有资格来管理集群;

2)Leadercontroller是借助zookeeper来选择的,每个controller初始化时都会向zookeeper注册竞争成为leader的路径的监听,第一个成功写入zookeeper的controller将会成为leader,其它controller就会收到新leader的通知,将自己设为follower;

3)当controller成为leader时,会向zookeeper注册相关监听;4)

5)这些监听集群数据状态的变化,如增加topicpartitionreplica等,当监听到数据发生变化,leaderController就会得到通知并处理,处理完成后会同步相关数据给其它followerController;

6)controller是以单工作线程形式运行的,其它请求通过封装为job投递到controller处理线程;7)

8)borker上下线、副本增加重分配、topic增加等,通过zookeeper通知并创建job投入job队列等待工作线程处理;

9)集群所有的元数据是存放在zookeeper上,当zookeeper数据发生变化时,通过通知到leaderController,controller处理数据,并在内存中保存一份副本,做差值处理。

六、replica管理

1)所有partition都有多个replica来管理,这样使数据更安全,不容易丢失;

2)replica的leaderfollower地位是由leaderController来管理的;

3)replica有三种类型:无效的、已分配的(正在同步但是还没达到一致状态)和在线副本(正常同步的);

4)replica数据的同步是由replicaManager副本管理器来处理的,管理器会开启副本同步线程去leaderreplica抓取数据;

5)replica下线时,leaderController会收到zookeeper通知后会处理,如果是leaderreplica下线,则会重新选举,根据不同状态用不同选举策略选出新Leader;

6)选leader有可能来自replica下线、需要改变leader或者为了负载均衡进行重分配。

七、groupCoordinator消费数据管理

1)

2)GroupCoordinator提供访问消费者数据的接口,GroupMetadataManager负责管理消费者组的数据,GroupMetadata保存消费者组的数据,MemberMetadata保存组里每个成员的数据;

3)Kafka提供了两种存储消费者数据方式,一种是保存在zookeeper上,另一种是保存在kafkalog系统中,由于zookeeper的频繁写性能不是很好,所以kafka提供保存的选择,也是默认选择;

4)用户需要访问消费者数据时,会通过kafkaclient,随便找到一个比较空闲的borker通过其GroupCoordinator,找到其leader副本所以在的地址,并返回给client去连接,只有leaderreplica才提供服务;

5)消费者数据是通过内置的一个写死的topic来管理,通过用户的(topic,partition,消费者组)作为内置的topic分区hash来保存到log中;

6)如用户加入、新增、删除消费者组信息时,会将创建消息保存至Log中,并在内存中运行生成数据存放于2)中的数据结构。

八、生产者发送数据

1)生产者通过topic和key决定往哪个partition写入数据;

2)生产者需要携带ack用来决定应该什么时候回复,分别有0,1,-1,当为0时说明不需要回复,当为1时表示集群接收了就回复,当为-1时需要所有isr(正常同步的)都接收确认了才能回复,接收数据后,会将这条消息存入延迟执行队列,当检测其它isr来抓取数据时,会更新并检查是否可以回复生产者。

九、transactionCoordinator事务处理

1)kafka支持事务操作,并支持消费者设定read_

分享 转发
TOP
发新话题 回复该主题