ITPub博客

首页 > 数据库 > 数据库开发技术 > Kafka学习笔记(九)

Kafka学习笔记(九)

原创 数据库开发技术 作者:DBA修行之路 时间:2021-08-15 18:40:44 0 删除 编辑




点击上方“蓝字”,发现更多精彩。





Kafka学习笔记(九)

第二阶段

之前系统全面的学习了kafka的一些基础概念,producer端,consumer端的知识点,属于比较基础的知识点,是第一阶段的学习,后面的篇章,会进行一些细化的学习,涉及kafka的一些设计原理,监控,优化方面的点。算是第二阶段的学习吧,可能会比较难一些,零散一些。可能会转换一种学习方法,不会像第一阶段那样全面学习,而是选择某个点学习,通过点滴积累,最终实现全局突破。先给自己鼓鼓气,一起加油干吧。

先从kafka的控制器(crontroller)上手吧,让我们从以下几个方面来攻克它吧。


controller概念

在kakfa集群中,会选出唯一一个broker来充当控制器的角色,即crontroller,crontroller的功能是用来管理和协调Kafka集群,管理集群中所有分区的状态并执行相应的管理操作。当集群启动时,集群中所有的broker都会参与controller的选举,最终只会有一个broker成为crontroller,当crontroller发生异常后,集群中剩下的broker将会进行新一轮的选举,选出新的crontroller进行后续的工作。




状态管理

crontroller会维护每台broker上的分区副本和每个分区的leader副本信息,即副本状态和分区状态,因此,controller引入了两个状态机,分别用来管理副本状态和分区状态。


副本状态机,Replica State Machine,有如下7种状态:

NewReplica:crontroller创建副本时的最初状态,在此状态下的副本只能成为follower副本。

OnlineReplica:启动副本后变更为该状态,处于该状态下的副本既可以成为follower副本,又可以成为leader副本。

OfflineReplica:当副本所在的broker发生异常奔溃后,该副本将会变更为该状态。

ReplicaDeletionStarted:如果开启了topic删除操作,topic下所有分区的所有副本都会被删除,此时副本进入该状态。

ReplicaDeletionSuccessful:如果副本成功响应了删除副本请求,便会进入该状态。

ReplicaDeletionIneligible:如果副本删除失败,则会进入该状态。

NotExistentReplica:如果副本被成功删除,则会进入该状态。


整体变更流程如下:

当创建某个topic后,最初该topic下所有分区的所有副本都是NonExistent状态,然后controller会加载副本信息到内存中,此时同步更新副本状态为NewReplica,然后controller会确定分区的leader和ISR并将这些信息发送到所有副本,同步到所有broker上。完成这些,副本状态会被修改为OnlineReplica,如果某个时刻开启了topic删除操作,controller会尝试停止所有副本,对于follower角色所在副本会停止向leader获取数据,对于leader角色所在副本会被设置为NO_LEADER,然后进入OfflineReplica状态,当删除任务开启后,状态会被变更为ReplicaDeletionStarted,当副本数据被成功删除后,副本状态会更新为ReplicaDeletionSuccessful,之后会自动更新为NonExistent终止状态,并且controller的上下文缓存会清除这些副本信息,如果部分副本删除失败,则会进入ReplicaDeletionIneligible状态,等待进行重试。


分区状态机,Partition State Machine,用来负责集群下所有分区的状态管理,含有4个分区状态:

NonExistent:不存在的分区或已删除的分区。

NewPartition:一旦被创建,分区便处于该状态。

OnlinePartition:当分区的leader被选出后,进入此状态。

OfflinePartition:当leader所在的broker宕机后,分区将进入该状态,此时无法正常工作。


整体变更流程如下:

当某个topic创建后,crontroller会创建分区对象,最初所有分区状态会被设置为NonExistent,然后Crotroller会读取副本分配方案,此时分区状态会进入NewPartition状态,然后controller会初始化leader和ISR信息,并设置分区状态为OnlinePartition。如果某时刻进行了删除topic或关闭broker操作,则会将分区状态变为OfflinePartition状态,删除成功后,最终会将分区状态设置为NonExistent,如果关闭的是leader副本所在的broker,则还需要开启新一轮的leader选举并调整分区状态为OnlinePartition。




controller职责

对集群状态的维护是crontroller保持运行状态一致性的基本要素,为了保持controller稳定地对外提供服务,controlller还需要承担以下职责。

1).更新集群员数据信息。kafka中要求clients能够通过集群中任意一台broker查询topic的分区信息等元数据,因此,controller实现了如下机制,当有分区信息发生变更时,controller将变更后的信息封装进UpdateMetatataRequests请求,然后广播发送给集群中的每个broker,使得clients在请求数据时总是能够获取到最新,最及时的分区信息。

2).创建topic。可以有3种方式创建topic。第1种,通过kafka-topics脚本的--create创建。第2种,构造CreateTopicsRequest请求创建。配置broker端参数auto.create.topics.enable为true,然后发送MetadataReRequest请求。创建topic后,会在Zookeeper的/brokers/topics下创建一个对应的znode节点,然后将该topic的分区以及副本列表信息写入znode中。

3).可以通过kafka-topics脚本的--delete方式或者构造构造DeleteTopicsRequest的方式来删除topic,进行删除时会在Zookeeper的/admin/delete_topics下新建一个znode节点,然后开启删除topic操作。删除完成后,会移除该znode节点。

4).分区重分配,由kafka集群的管理员发起,在该操作中需要手动制定分配方案并按照一定格式写入ZooKeeper的/admin/resaasign_partitions节点。分区副本重配是一个先扩展再收缩的过程,controller先将分区副本集合进行扩展,等到全部与leader保持同步后将leader设置为新分配方案中的副本,然后再执行收缩阶段,将分区副本集合缩减为新分配方案中的副本集合。

5).preferred leader选举。设置位于副本列表的第一位的副本为该分区的preferred leader。当分区的leader由于某种原因发生变更后,可以通过以下两种方式将leader重新调整为perferred leader。第一种方式是设置broker端参数auto.leader.rebalance.enable为true,使得controller会定时自动调整preferred leader。第二种方式是通过kafka-preferred-replica-election脚本手动触发。实现这两种方法时会向Zookeeper的/admin/preferred_replica_election节点写入数据。

6).topic分区扩展,当现有topic的分区数据不足以支撑业务量后,需要增加分区,可以通过kafka-topics脚本的--alter选项实现。

7).broker加入集群。当broker启动成功后会在Zookeeper的/broker/ids下创建一个znode节点,会在znode中写入broker的信息。

8).broker崩溃。当broker奔溃后,broker与Zookeeper的会话会失效并导致临时znode节点被删除。当发现该节点删除后,controller便会知道该broker退出集群,接下来会开启broker退出逻辑,更新集群元数据并同步到其他broker上。

9).受控关闭。也可称为优雅关闭,指的是通过kafka-server-stop脚本,kill -15方式关闭broker,优雅关闭是相对于强制关闭而言,强制关闭通常由掉电,kill -9实现,受控关闭能最大限度地降低broker的不一致性。在受控关闭时,即将关闭的broker会向controller发送CrontrolledShutdownRequest请求,然后会处于阻塞状态,直到接收到controller端发送的ControlledShutdownResponse时,broker可以正常退出。

10).controller leader选举。当kafka中的controller发生故障或者显式关闭,kafka需要保证能够及时选举出新的controller。当关闭controller所在的broker或者controller所在的broker宕机,崩溃,或手动删除,修改Zookeeper中的/crontroller节点这些情况都会导致发生controller leader选举。当选举成为controller后,会增加controller的版本号,更新/controller_epoch节点的值。





crontroller与broker交互

controller启动时会为集群中每个broker创建一个专属的Socket连接,同时controller会为每个tcp连接创建一个RequestSendThread线程,这些连接和线程用于controller给集群broker发送请求,目前有三种请求:

UpdateMetadataRequest:该请求携带了集群中当前最新的元数据信息,接收到该请求的broker会更新本地内存中的缓存信息,从而保证clients能获取到最新,及时的信息。

LeaderAndIsrRequest:用于创建分区,副本及完成leader和follower角色的逻辑。

StopReplicaRequest:停止指定副本的数据请求操作,同时还会负责删除副本数据。



自问自答

Q:
副本状态机与分区状态机的异同?

相同点:副本状态机和分区状态机都是controller用来进行状态管理的。

不同点:副本状态机是用于副本状态管理的,副本有7种状态,分区状态机是用于分区状态管理的,分区有4种状态。 

Q:
controller与broker的双向交互?

前面可知controller能够给broker发送3种请求,这些请求大部分都是借助Zookeeper实现。而待关闭broker可通过RPC发送ControlledShutdownRequest请求给controller。这个请求是broker与controller直接进行交互的。

Q:
controller的自身组成?

crontroller自身有很多组件,有数据类,基础功能类,选举器,监听器等,这些组件各自负责不同的职责。通过这些组件,controller实现以上功能,这些内容后续将会进行学习。


结尾小结

本篇是kafka第二阶段学习的第一篇,学习内容为controller的状态管理,职责及交互部分知识点。七夕已经过去,已经脱单的,得努力学习提升自己为未来的两个人的小家努力。没有脱单的,也得努力学习,毕竟你越优秀,才能遇到那个更好的她。不说了,我要去努力了,让自己变得优秀起来。




END



扫码关注我
每天进步一点点,未来才可期,我们共同的目标是星辰大海。
赞一下你最美!



原文作者:DBA修行之路;如有侵权,请联系管理员删除。

上一篇: 重新认识redis(一)
请登录后发表评论 登录
全部评论

注册时间:2021-05-25

  • 博文量
    64
  • 访问量
    23946