本篇文章将深入kafka,介绍集群成员关系、控制器、复制和处理请求等相关内容。
一.集群成员关系
介绍集群成员关系前,我们要清楚集群包含哪些成员,所有关系都是围绕这几个成员展开的:
1.成员:包含broker、zookeeper和kafka组件。
2.关系:
- broker启动的时候,它通过创建临时节点把自己的ID注册到zookeeper
- kafka组件订阅zookeeper的/brokers/ids路径,当有broker加入或退出集群时,它就会收到通知
- kafka组件在broker服务器上安装。
二.控制器
本节将介绍两个概念和三种场景的处理:
1.概念
- 控制器:就是一个broker,除了具备一般broker的功能,还负责分区首领的选举
- 脑裂:有两个broker同时认为自己是当前的控制器
2.三种场景的处理
- 控制器的产生:集群里启动的第一个broker通过在zookeeper里创建一个临时节点让自己成为broker。其他broker在控制器节点上创建zookeeper watch对象,这样就可以接收到这个节点的变更通知
- 控制器挂了:剩余的broker通过watch对象得到控制器节点消失的通知,然后尝试使自己成为新的控制器,第一个在zookeeper里成功创建控制器节点的broker会成为新的控制器。
- broker离开集群:控制器会为失去首领的分区选择新的首领。告知首领和跟随者,谁是首领谁是跟随者。
三.复制
复制功能是kafka的核心功能,Kafka使用主题来组织数据,每个主题被分为若干个分区,每个分区有多个副本,副本被保存在broker上。本节我们来了解一下什么叫首领副本、跟随者副本、同步副本和不同步副本。
1.首领副本:每个分区都有一个首领副本,为了保证一致性,所有生产者和消费者的请求都会经过这个副本。
2.跟随者副本:
- 首领以外的副本都是跟随者副本
- 跟随者副本不处理客户端请求
- 唯一的任务从首领那里复制消息,保持与首领一致的状态。如果首领发生崩溃,其中一个跟随者就会提升为新首领
3.同步副本:
- 持续请求得到的最新消息的副本称为同步副本。
- 首领发生失效时,只有同步副本才有可能成为新的首领。
4.不同步副本:
- 跟随者10秒内没有请求任何消息。
- 虽然在请求消息,但是在10秒内不是请求最新的消息。
四.处理请求
本节将介绍几个相关概念、kafka内部处理流程、获取元数据、broker的操作内容和客户端设置。
1.在介绍broker如何处理请求前,我们先了解几个概念:
- Acceptor线程:Broker会在它所监听的每一个端口上运行一个acceptor线程,这个线程会创建一个连接,并把它交给Processor线程处理。
- Processor线程:也叫网络线程,负责从客户端获取请求消息,把他们放入“请求对列“,然后从”响应对列“获取响应消息,把他们发送给客户端。
- IO线程:处理”请求对列”的消息
2.Kafka处理请求内部流程:
3.获取元数据:
- 问题:客户端怎么知道往哪里发送请求呢?
- 答案:客户端会发送元数据请求。请求中包含客户端感兴趣的主题,服务器端的响应消息里指明了这些主题所包含的分区、每个分区有哪些副本,以及哪个副本是首领。
- 特点:元数据是缓存到客户端的
- 元数据请求策:
- 轮询发送元数据请求
- 客户端收到“非首领”错误,会触发发送元数据请求
- 元数据请求流程:
4.处理生产请求Broker会做哪些操作?
-
校验:
1:发送数据的客户是否有主题写入权限
2:请求里包含的acks值是否有效(只允许:0、1、all)
3:若acks=all,是否有足够多的同步副本保证消息已经被安全写入 -
处理消息:将消息写入磁盘
-
返回响应:
1:acks=0|1,消息被写入分区首领后,响应会被立即返回
2:acks=all,请求会被放在一个叫做“炼狱”的缓冲区里,直到所有跟随副本都复制了消息,响应才会返回给客户端。
5.处理获取请求Broker会做哪些操作?
-
校验:校验指定的偏移量在分区上是否存在,不存在broker将返回一个错误消息
-
处理消息:broker按照客户端指定的数量上限从分区里读取消息
6.客户端设置
-
设置返回下限:告诉broker“等到有10kb数据的时候再把他们发送给我”。这样可以减少cpu和网络开销
-
设置超时时间:告诉broker:“如果你无法在X毫秒内积累满足要求的数据,那么就把当前数据返回给我”
7.另外需要了解一下两点:
-
注意:并不是所有保存到分区首领的数据都能返回,而是返回已经被写入同步副本的消息
-
零复制:kafka直接把消息文件发送到网络通道。这样避免了字节复制和管理内存缓冲区,从而获得更好的性能。
以上就是kafka处理请求的基本操作,哪里说的不对,不吝赐教。