集群成员关系

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. PrimeFaces ab function

    The PrimeFaces.ab function is a shortcut function for PrimeFaces.ajax.AjaxRequest. //ajax shortcut a ...

  2. WPF 样式Style

    一:样式基础 如果我们的程序有三个这样的按键,一般我们会这样写 <StackPanel> <!--按键的背景色为Azure蔚蓝色背景色为Coral珊瑚色字体为Arial加粗字体大小为 ...

  3. 负载均衡(三)Nginx的安装配置

    linux系统为Centos 64位 一.安装 [root@cuiqq local]# mkdir /usr/local/nginx [root@cuiqq local]# cd /usr/local ...

  4. 启动 jvm 参数小总结

    1.启动某项目 nohup java -jar -Xms256m -Xmx512m -Dspring.config.location=/config/application.yml -Dfile.en ...

  5. codevs 1020 孪生蜘蛛 x

    题目描述 Description 在G城保卫战中,超级孪生蜘蛛Phantom001和Phantom002作为第三层防卫被派往守护内城南端一带极为隐秘的通道. 根据防护中心的消息,敌方已经有一只特种飞蛾 ...

  6. django操作cookie和session

    一.cookie:保存在客户端浏览器上的键值对 Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会 ...

  7. msf生成后门拿shell

    0X01简介 这里我本来想学习 msf利用漏洞反弹shell的 但是 没有靶机....等找了靶机在弄吧 kali 172.18.5.118 靶机  172.18.5.240 先尝试能不能ping通 好 ...

  8. [CSP-S模拟测试]:彩球问题(记忆化搜索)

    题目传送门(内部题91) 输入格式 第一行一个正整数$N$,表示颜色种类数. 第二行$N$个正整数$k[i],k[i]$表示第$i$种颜色的数量$(1\leqslant k[i]\leqslant 3 ...

  9. [CSP-S模拟测试]:简单的括号序列(组合数)

    题目传送门(内部题82) 输入格式 一行一个字符串$ss$,保证$ss$中只包含$'('$和$')'$. 输出格式 一行一个整数,表示满足要求的子序列数对$10^9+7$的结果. 样例 样例输入1: ...

  10. Ajax监测开始执行及结束执行

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...