Kafka文字欲

无镜--kafka之服务关闭

2019-01-07  本文已影响0人  绍圣

Kafka服务关闭时,会先发送ControlledShutdown请求给主控制器,然后依次关闭网络服务端(SocketServer),处理请求的连接池(KafkaRequestHandlePool),副本管理器(ReplicaManager),日志管理器(LogManager),消费组的协调者(GroupCoordinator),控制器(kafkaController)。

关闭之后

日志同步:将所有未同步的日志刷写到磁盘,避免重启时需要执行恢复日志的流程。因为日志恢复会花费一定的时间,在服务关闭前同步日志,重启时就不需要恢复日志,从而可加快服务重启的速度 。

分区迁移:在服务关闭之前,将代理节点上属于主副本的分区迁移到其他代理节点上。这种方式可以更快地转移分区的主副本,减少分区不可用的时间窗口。

代理节点发送ControlledShutdown请求给主控制器是阻塞式的。

主动关闭kafka服务的代理节点向主控制器发送ControlledShutdown请求,收到响应结果的partitionsRemaining数据必须为空,代理节点才可以关闭其他组件。partitionsRemaining表示分区的主副本仍然在即将关闭的代理节点上。如果分区只有一个副本(这个副本就是主副本,就在即将关闭的代理节点上),由于没有可用的其他副本,也就没有办法迁移主副本到其他代理节点上。

主控制器的服务端处理ControlledShutdown请求,将代理节点添加到即将关闭的代理节点列表。如果代理节点是分区的主副本:转移主副本,更新ISR,更新ZK,通知其他受影响的代理节点;如果代理节点是分区的备份副本:停止副本,然后将副本状态转为下线。如果代理节点是当前的主控制器,则关闭状态机,否则不会有任何实际的操作。

例如:

1,只有分区P1的主副本在代理节点1上,当分区P1的主副本转移到代理节点2上时,关闭动作才认为完成。

2,三个分区[P1,P2,P3]都在代理节点1上,只有这个三个分区的主副本都转移到其他代理节点上时,才算关闭完成。

3,代理节点1上分区P1的主副本没有迁移到其他代理节点,它需要再次发送ControlledShutdown请求给主控制器,直到所有副本全部迁移完成 。

4,如果分区的副本数为1,这种场景下不需要转移分区的主副本,认为关闭完成。

即将关闭的代理节点发送ControlledShutdown请求到主控制器,会带有代理节点的编号。因为控制器上下文记录了每个代理节点上的所有分区,所以控制器知道即将关闭的代理节点上都有哪些分区。主控制器处理分区的主副本和备份副本逻辑不同:如果是主副本,控制器会通过分区状机和分区的主副本选举器,将分区的主副本转移到其他代理节点,并将分区状态转为上线状态;如果是备份副本,控制器会先向即将失败的代理节点发送StopReplica请求,然后将对应的副本转为下线状态。

控制器处理分区状态机和副本状态机的状态转换,会发送三种请求给对应的代理节点。

1,发送LeaderAndIsr请求给受影响的代理节点:分区的主副本如果在即将关闭的代理节点上,控制器选举出新的主副本后,发送LeaderAndIsr请求给分区所有副本所在的代理节点 。新主副本所在的代理节点会调用分区的makeLeader()方法成为主副本,其他代理节点会调用分区的makeFollower()成为备份副本。

2,发送UpdateMetadata请求:由于分区的主副本和ISR信息发生变化,每个代理节点都会接收控制器发送的UpdateMetadata请求,并更新元数据缓存。

3,发送StopReplica请求给即将失败的代理节点:分区的备份副本如果在即将关闭的代理节点上, 即将关闭代理节点上对应的分区会关闭备份副本的拉取线程。因为代理节点一旦真正下线,它上面的备份副本就不需要向主副本同步消息了。

参考资料:

Kafka技术内幕:图文详解Kafka源码设计与实现

上一篇下一篇

猜你喜欢

热点阅读