集群成员关系

kafka使用Zookeeper 来维护集群成员的信息。每个broker都有一个唯一标识符,这个标识符可以在配置里指定,也可以自动生成。在broker启动的时候,它通过创建临时节点把自己的ID注册到Zookeeper。kafka组件订阅Zookeeper的/brokers/ids路径,当有broker加入集群或退出集群时,这些组件就可以获取通知。
 

控制器

 
控制器其实就是一个broker,只不过它除了具有一般broker的功能之外,还负责分区首领的选举。集群里第一个启动的broker通过在zookeeper里创建一个临时节点/controller 让自己成为控制器。其他broker在启动时也会尝试创建这个节点,不过他们会收到一个“节点已存在”的异常,然后“意识”到控制节点已存在,也就是说集群里已经有一个控制器了。如果控制器被关闭或者zookeeper断开连接,zookeeper上的临时节点就会消失。
 

复制

 
复制功能是kafka架构的核心,kafka使用主题来组织数据,每个主题被分为若干区,每个分区有多个副本。而副本有一下两种类型。
 
1.首领副本,每个分区都有一个首领副本。为了保证一致性,所以生产者请求和消费者请求都会经过这个副本。
2.跟随者副本,首领以外的副本都是跟随副本。跟随者副本不处理来自客户端的请求,它们唯一的任务就是从首领哪里复制信息,保持与首领一致的状态。如果首领发送崩溃,其中的一个跟随者会被提升为新首领。首领的另一个任务是搞清楚那个跟随者的状态与自己是一致的。
 
请求得到的最新消息副本被称为同步的副本。在首领发生失效,只有同步副本才有可能被选为新首领。
每个分区都有一个首选首领-创建主题时选定的首领就是分区的首选首领。
 

处理请求

broker的大部分工作是处理客户端,分区副本和控制器发送给分区首领的请求。
所有的请求信息都包含一个标准消息头。
Request type (也就是API key)
Request version (broken可以处理不同版本的客户端请求,并根据客户端版本作出不同的响应)
Correlation ID 一个具有唯一性的数字,用于标识请求信息,同时也会出现在响应消息和错误日志里。
Client ID 用于标识发送请求的客户端
 
broker会在它所监听的每一个端口运行一个acceptor线程,这个线程会创建一个连接,并把它交给processor线程去处理。processor线程的数量是可配置的,网络线程负责从客户端获取消息,把他们放进请求队列,然后从响应队列获取消息,把它们发送给客户端。
 

生产请求

生产者发送的请求,它包含客户端要写入broker的消息。
生产请求参数acks 可选值0 ,1 ,all
0 代表生产者发送消息之后就不管了
1代表只要首领收到消息就认为写入成功
all 代码所有的需要同步副本收到消息才算成功
包含首领副本的broker在收到生产请求是,会对请求做一些验证。
1.发送数据的用户是否有主题写入权限
2.请求里包含的acks值是否有效(0,1,all)
3.如果是acks=all 是否有足够多的同步副本保证消息已经被安全写入
最后消息被写入磁盘,Linux系统上,消息会被写到文件系统缓存里,并不保证它们何时回被刷新到磁盘上。
 

获取请求

在消费者和跟随者副本需要从broker读取消息时发送的请求。客户端发送请求,向broker请求主题分区里具有特定偏移量的消息。如果请求的偏移量存在,broker将按照客户端指定的数量上限从分区里读取消息,再把消息返回客户端。客户端除了可以设置broker返回数据的上限,也可以设置下限。
 

索引

kafka为每个分区维护了一个索引,消费者可以从任意位置读取偏移量。
 

清理的工作原理

 
每个日志片段可以分为两个部分
1.干净的部分
这些消息之前被清理过,每个键只有一个对应的值,这个值是上一次清理时保留下来的。
 
2.污浊的部分
这些消息是在上一次清理之后写入的。

kafka学习(四)的更多相关文章

  1. kafka学习(四)-Topic & Partition

    topic中partition存储分布 Topic在逻辑上可以被认为是一个queue.每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里.为了使得 Kafka的吞吐 ...

  2. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  3. kafka学习2:kafka集群安装与配置

    在前一篇:kafka学习1:kafka安装 中,我们安装了单机版的Kafka,而在实际应用中,不可能是单机版的应用,必定是以集群的方式出现.本篇介绍Kafka集群的安装过程: 一.准备工作 1.开通Z ...

  4. [Big Data - Kafka] kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  5. Docker下kafka学习三部曲之二:本地环境搭建

    在上一章< Docker下kafka学习,三部曲之一:极速体验kafka>中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来 ...

  6. 大数据 -- kafka学习笔记:知识点整理(部分转载)

    一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...

  7. Kafka学习(学习过程记录)

    Apache kafka 这,仅是我学习过程中记录的笔记.确定了一个待研究的主题,对这个主题进行全方面的剖析.笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长.不止是技术. Kafka ...

  8. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  9. KafKa——学习笔记

    学习时间:2020年02月03日10:03:41 官网地址 http://kafka.apache.org/intro.html kafka:消息队列介绍: 近两年发展速度很快.从1.0.0版本发布就 ...

随机推荐

  1. Mysql定时器定时删除表数据

    由于测试环境有张日志表没定时2分钟程序就狂插数据,导致不到1一个月时间,这张日志表就占用了6.7G的空间,但是日志刷新较快,有些日志就没什么作用,就写了个定时器,定期删除这张表的数据 首先先查看mys ...

  2. Luogu P3170 [CQOI2015]标识设计 状态压缩,轮廓线,插头DP,动态规划

    看到题目显然是插头\(dp\),但是\(n\)和\(m\)的范围似乎不是很小.我们先不考虑复杂度设一下状态试试: 一共有三个连通分量,我们按照\(1,2,3\)的顺序来表示一下.轮廓线上\(0\)代表 ...

  3. DevExpress WinForms v19.1新版亮点:Tree List等控件性能增强

    行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...

  4. Java 集合基础详细介绍

    一.Java集合框架概述 集合.数组都是对多个数据进行存储操作的结构,简称Java容器.此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt, .jpg, .avi,数据库中).Jav ...

  5. 部署jumpserver

    参考:https://jumpserver.readthedocs.io/zh/master/setup_by_centos7.html yum update -y systemctl start f ...

  6. 12. ClustrixDB 为容错和可用性分配磁盘空间

    集群必须包含足够的空闲磁盘空间,以便从节点或区域故障中自动恢复.要计算在发生故障后仍然允许ClustrixDB完全重新保护数据的情况下可以使用的最大磁盘空间量,可以使用以下公式: 最大磁盘利用率% = ...

  7. SpringBoot项目中,cookie的设置与销毁

    cookie的设置与销毁 1.设置cookie /** * 设置一个cookie * @param response HttpServletResponse * @param name cookie的 ...

  8. 【BZOJ2521】 [Shoi2010]最小生成树

    Description Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可 ...

  9. tesseract 4.0 使用

    https://blog.csdn.net/andylanzhiyong/article/details/81807425 官方例子: https://github.com/tesseract-ocr ...

  10. tf.InteractiveSession() 和 tf.Session() 的区别

    tf.InteractiveSession():它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的.这对于工作在交互式环境中的人们来说非常便利,比如使用IPy ...