Kafka服务器端
目录
- kafka是如何维护集群成员关系
- kafka集群中分区首领是如何选取的
- kafka如何进行复制
- kafka是如何处理请求的
- 如果生产请求和消费请求发送到了错误的分区上
- 对于生产请求,包含首领副本的broker会做哪些验证
- broker是否可以发送指定大小数量的数据
- 客户端可以读取分区首领上的所有数据嘛
- kafka存储
- kafka零拷贝技术
- kafka为什么那么快
kafka服务器端
kafka是如何维护集群成员关系?
kafka使用zookeeper来维护集群成员的消息,每一个broker都有一个唯一标识符,这个标识符可以在配置文件中指定,也可以自动生成。当broker启动的时候,他通过创建临时节点把自己的ID注册到走哦keeper中。kafka组件订阅zookeeper的/brokers/ids的路径,当有broker加入集群或退出集群时,这些组件就可以获得通知。
kafka集群中分区首领是如何选取的?
kafka是通过一个控制器来确定分区首领的选取,这个控制器其实就是一个broker。集群里第一个启动的broker通过在zookeeper里创建一个临时节点/controller让自己成为控制器,如果这个控制器断开连接,其他的节点通过watch对象得到控制节点小时的通知,会尝试让自己成为新的控制器。
当控制器发现一个broker已经离开集群,它就知道,那些失去首领的分区需要一个新的分区(这些分区刚好在这个broker上)。控制器遍历这些分区,并确定谁应该成为新的首领(简单的说,分区副本列表的下一个副本),然后向所有包含新首领或现有跟随着的broker发送请求。该请求包含了谁是新首领以及谁是新首领的分跟随着的消息。随后,新首领开始处理来自生产者和消费者的消息,而跟随者从新首领那里复制消息。
简而言之,kafka使用zookeeper的临时节点来选举控制器,并在节点加入集群或退出集群时通知控制器,控制器负责在节点加入或者离开集群时进行分区首领选举。控制器通过epoch来避免多个首领的情况(多个集群是有可能出现脑裂, kafka通过每次选举新首领增加epoch的值,当值小于当前epoch则信息无效)。
kafka如何进行复制?
Kafka使用主题来组织数据,每个主题被分为若干分区,每个分区有多个副本。这些副本被保存在broker上,每个broker可以保存成百上千个属于不同主题和分区的副本。
分区副本分为两种,首领副本和跟随者副本,生产者请求和消费者请求都经过首领副本,而跟随者副本为了与首领保持同步,跟随着会向首领发送获取数据的请求,这种请求与消费者为了获取消息而发送的请求是一样的。首领将响应消息发给跟随着,请求消息里包含了跟随着想要获取的消息和偏移量,这些偏移量总是有序的。
kafka是如何处理请求的?
broker会在它监听的每一个端口上运行一个Acceptor线程,这个线程会创建一个连接,并把它交给Processor线程去处理,Processor线程的数量是可以配置的,网络线程复制从客户段获取请求,把它们放进请求队列,然后从响应队列获取响应消息,把它们发送给客户端。
kafka网络.png
如果生产请求和消费请求发送到了错误的分区上,怎么办?
错误的分区broker会返回一个非分区首领的错误响应。
对特定的分区的获取请求,kafka客户端要自己负责把生产请求和获取请求发送到正确的broker上。客户端使用元数据请求,查找客户端感兴趣的主题列表。当客户端缓存原数据信息不一致时会导致发送到错误分区。
对于生产请求,包含首领副本的broker会做哪些验证?
- 发送数据的用户是否有主题写入权限?
- 请求里包含的acks值是否有效(只出现0,1,或all)
- 确认acks
broker是否可以发送指定大小数量的数据?
可以,客户端可以设置broker返回数据的上线也可以设置下限。这样可以减少cpu和网络开销。这样会让broker积累一定的数据量在发送给消费者,还可以设置一个超市时间,告诉broker,如果无法再X时间内积累满足要求的数据,那么久吧当前数据返回给我。
客户端可以读取分区首领上的所有数据嘛?
不可以,大部分客户端只能读取已经写入所有同步副本的消息(跟随副本实际上也是消费者)
kafka存储
- kafka通过topic来分主题存放数据 主题内又有分区 分区还可以有多个副本 ,分区的内部还细分为若干个segment。所谓的分区 其实就是在 kafka对应存储目录下创建的文件夹,文件夹的名字是主题名加上分区编号 编号从0开始。所谓的segment 其实就只在分区对应的文件夹下产生的文件。一个分区会被划分成大小相等的若干segment 这样一方面保证了分区的数据被划分到多个文件中保证不会产生体积过大的文件 另一方面可以基于这些segment文件进行历史数据的删除 提高效率。
- 文件会按修改日期和设置的过期策略进行删除,活跃片段不会删除。还有一个删除策略是compact策略保留最新值(当值保留最新的key values时需要,比如保留客户最新地址), 墓碑消息就是key不为空,值为null的消息,这是为了清理这条信息。
- kafka的索引是为了让broker快速定位到偏移处,索引把偏移量映射到片段和偏移量所在文件的位置;索引也被分为片段,所以在删除消息时,也可以删除相应索引;(索引是非必须的,如果不存在将被kafka重建)
kafka零拷贝技术
-
普通网络请求
普通网络请求.png
-
零拷贝技术, 只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。
零拷贝.png
kafka为什么那么快,可参考 Kafka 为什么这么快?
- 写入: 顺序写入(顺序写入没法删除,所以才有删除策略),mmp(写入时只是写入页面缓存,还需要借助操作系统同步到硬盘,充分利用了页缓存,所以jvm内存不用太大,多分配给页缓存内存)。
- 读取: 零拷贝