集群成员关系

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. mybatis简单用法

    1.resultType 和 resultMap 引言: MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表 ...

  2. percona-toolkit 3.0.13 简单安装记录

    percona-toolkit 3.0.13 简单安装记录 环境:centos6.x mysql:8.0.17 yum -y install perl-DBIyum -y install perl-D ...

  3. JAVA笔记19-容器之三 Set接口、List接口、Collections类、Comparable接口(重要)

    一.Set接口 //HashSet综合举例 import java.util.*; public class Test{ public static void main(String[] args){ ...

  4. c++常见函数记录

    1.bitsset 模板,可以操作二进制字符串,转化成数字等 2.swap()交换函数,将a,b的值交换 3.stringstream类用于字符串和其他类型的转换,操作方便 4.stx,tr1. 5. ...

  5. Quartz监听器

    1.概念Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.TriggerLi ...

  6. ELK结合logback

    之前ELK的安装可以查看前面一篇博客 下面是我的logback的配置文件,通过logback的appender直接导入logstash <?xml version="1.0" ...

  7. Shell test命令/流程控制

    Shell test命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数,说明 -eq等于则为真 -ne不等于则为真 -gt 大于则 ...

  8. Spring Data Jpa (四)注解式查询方法

    详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQ ...

  9. [design pattern](3) Dectorator

    前言 很久没有写关于设计模式的博客了,实在是没有太多的精力去写.但个人觉得设计模式在我们的日常开发中还是挺重要的,它提高了软件的可维护性.因此还是有必要坚持学习设计模式,写博客主要是为了加深我对设计模 ...

  10. Intellij Idea Spring Boot 热部署

    1. POM 文件添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...