kafka学习(四)

集群成员关系

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.污浊的部分

这些消息是在上一次清理之后写入的。

原文地址:https://www.cnblogs.com/Seeasunnyday/p/9236591.html

时间: 2024-11-10 13:34:27

kafka学习(四)的相关文章

kafka学习(四)-Topic & Partition

topic中partition存储分布 Topic在逻辑上可以被认为是一个queue.每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里.为了使得 Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,每个partition在物理上对应一个文件夹,该文件夹下存储 这个partition的所有消息和索引文件.partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减

kafka学习笔记:知识点整理

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.

1、Kafka学习分享-V1.0

Kafka学习分享 .1       什么是Kafka Apache Kafka是一个开源的流处理平台,由 Apache Software Foundation使用Scala and Java编写发展而来.Kafka?用于构建实时数据管道和流媒体应用. 它具有水平可扩展性,容错性,快速性,并在数千家公司生产中运行. 它的主要功能:数据流的发布和订阅.数据流的处理.数据流的存储.像一个消息系统一样发布和订阅数据流,有效且实时地处理数据流,在一个分布式备份的集群中安全地处理存储数据流. .2    

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

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.

3、Kafka学习分享|快速入门-V3.0

Kafka学习分享|快速入门 这个教程假定你刚开始是新鲜的,没有现存的Kafka或者Zookeeper 数据.由于Kafka控制控制脚本在Unix和Windows平台不同,在Windows平台使用bin\windows\ 代替 bin/,并且更改脚本扩展名为.bat. 第一步:下载编码 下载0.10.2.0版本并且解压它. 第二步:启动服务器 Kafka使用Zookeeper,因此如果你没有Zookeeper server,你需要先启动a ZooKeeper server.你可以使用Kafka的

kafka 学习(二)

kafka 学习(二) 一.Kafka的架构 如上图所示,一个典型的Kafka集群中包含若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU.Memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干Consumer Group,以及一个Zookeeper集群.Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance.Producer

kafka学习之路

https://www.cnblogs.com/qingyunzong/p/9004509.html 目录 一.简介 1.1 概述 1.2 消息系统介绍 1.3 点对点消息传递模式 1.4 发布-订阅消息传递模式 二.Kafka的优点 2.1 解耦 2.2 冗余(副本) 2.3 扩展性 2.4 灵活性&峰值处理能力 2.5 可恢复性 2.6 顺序保证 2.7 缓冲 2.8 异步通信 三.常用Message Queue对比 3.1 RabbitMQ 3.2 Redis 3.3 ZeroMQ 3.4

kafka学习之路(二)——提高

kafka学习之路(二)--提高 消息发送流程 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理.为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息.     过程: 1.Producer根据指定的partition方法(round-robin.hash等),将消息发布到指定topic的partition里面 2.kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否

nodejs学习四 Node.js NPM

什么是NPM? 不知道大家注意没有,windows平台下的Node.js安装包大小才区区4M多,真可以用短小精悍来形容它,作为一种编程语言,像java一个SDK 就几十M,为什么node.js的运行环境这么小呢?这其中的微妙之处在于,它拥有一个庞大的第三方软件库. 在Node本身提供的包(原生)中没有我们要实现的功能模块的时候,我们可以去寻找下是否已经有人实现了这种功能.毕竟重复造轮子这种事情,很多人都不想干. 去哪里寻找我们想要的包呢?如果你还不知道报的名字,你可以去https://www.n