首页 > 其他分享 >kafka学习笔记

kafka学习笔记

时间:2023-03-31 16:55:05浏览次数:41  
标签:副本 消费者 分区 broker 笔记 kafka 学习 消息

一、初识kafka

  kafka的数据单元被称为消息,为了提高效率,消息会被分批次写入kafka,批次就是一组消息,这些消息属于同一个主题和分区。批次数据会被压缩,这样可以提升数据的传输和存储能力,但要做更多的计算处理。

  kafka的消息通过主题进行分类,主题可以被分为若干个分区,消息以追加的方式写入分区,然后以先入先出的方式顺序读取。

由于一个主题可以有多个分区,所以无法在整个主题内保证消息的顺序,但可以保证单个分区内的消息顺序。分区可以分布在不同的服务器上。

 

 一般情况下消息会被发布到一个特定的主题上,默认会均衡分布到主题的各个分区,不过,某些情况下生产者会把消息直接写到指定的分区上。

消费者订阅一个或多个主题,并按照消息生产的顺序读取它们,消费者根据偏移量区分读取过的消息。

消费者是消费者群组的一部分,会有一个或多个消费者共同读取一个主题,群组保证每个分区只能被一个消费者读取。

 

  broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。根据特定的硬件及其性能特征,单个broker可以轻松处理数千个分区,以及每秒百万级的消息量。

 

 broker是集群的组成部分,每个集群都有一个broker同时充当集群控制器的角色,集群中一个分区从属于一个broker,该broker被称为分区的首领,一个分区可以分配给多个broker,这个时候会发生分区复制。这种分区为集群提供了消息冗余机制,一个broker发生故障,其他broker会机关集群,这时生产者和消费者要重新连接到新的broker。

zookeeper集群称为群组,zookeeper使用的是一致性协议,所以建议集群应该包含奇数个节点,因为只有集群中大多是节点处于可用状态,zookeeper才能处理外部的请求。

二、kafka生产者

ProducerRecord包含了目标主题、键和值。键可以设置成默认的null,不过大多是应用程序会用到键。

键有两个用途:可以作为消息的附加消息,也可以用来决定消息被写到主题的哪个分区。

如果键值为null,并且使用了默认的分区器,分区器将使用轮询算法均衡的分布在各个分区上。

如果key不为null,将根据散列值映射到特定分区,如果分区数变化,映射的分区也会变化。

三、kafka消费者

分区的所有权从一个消费者转移到另一个消费者,这样的行为称为再平衡。

消费者通过向被指派为群组协调器的broker(不同的群组可以有不同的协调器)发送心跳来维持他们和群组的从属关系以及他们对分区的所有权关系。

我们把更新分区当前位置的操作叫做提交,消费者往_consumer_offset的特殊主题发送消息,消息里包含每个分区的偏移量。

自动提交:默认时间间隔是5秒,如果期间发生了再均衡,将导致消息的重复消费。

手动提交:处理完一批消息,使用commitSync()提交,提交完之后需要等待broker的返回,提交出现错误会一直重试。

异步提交:处理完一批消息,使用commitAsync()提交,提交之后如果出现错误,不会重试,因为此时可能已经有更高的序列号已经提交成功。

四、深入kafka

1、kafka如何进行复制

2、kafka如何处理来自生产者和消费者的请求

3、kafka的存储细节,比如文件格式和索引

kafka使用主题来组织数据,每个主题被分为若干个分区,每个分区有若干个副本。

副本有一下两种:首领副本、跟随者副本。

首领副本:每个粪污都有一个首领副本,为了保证消息一致性,所有生产者请求和消费者请求都会经过这个副本。

跟随者副本:除首领副本意外的副本都是跟随者副本,跟随者副本不处理来自客户端的请求,他们唯一的任务就是从首领那里复制信息。如果首领发生奔溃,其中一个副本会被提升为首领。

五、可靠的数据传递

kafka的复制机制和分区多副本架构是kafka可靠性保证的核心,把消息写入多个副本可以使kafka在发生崩溃时仍能保证消息的持久性。

kafka的主题被分为多个分区,分区是基本的数据块,分区存储在单个磁盘上,kafka保证分区里的事件有序。分区可以有多个副本,其中一个副本是首领。所有的事件都直接发给首领副本,或直接从首领副本读取事件。其他副本只需要与首领副本保持同步,并及时复制最新的事件。当首领副本不可用时,其中一个副本将成为新首领。

ISR,kafka为某个分区维护的一个同步集合,只有ISR中所有副本都接收到消息才认为,消息已被同步,消费者才能看到这条消息。

min.insync.replicas用于配置最少同步副本数。

生产者发送确认:acks=0、acks=1都会发生数据丢失风险。

acks=all和min.insync.replicas配合使用,可以确保在消息返回前至少有多少个副本收到消息。

生产者的重试配置:有些错误是可以通过重试解决的,有些是不可以的。消息的重试也是有风险的,如网络问题导致生产者没有收到broker的确认,但实际已经写入broker成功,此时broker会写入重复的消息,重试和恰当的错误处理可以保证每个消息“至少被保存一次”。现实中可以在消息中加入唯一标志符,用于消费者过滤消息。或者做到消息本身就是幂等的。

可靠的消费者:

只有那些被提交到kafka的数据,也就是那些被写入所有同步副本的数据,对消费者是可用的,这意味着消费者写入的消息已经具备了一致性。

消费者唯一要做的就是跟踪哪些消息是已经读取过的,哪些是没有读取过的。

如果消费者提交了偏移量却未能处理完消息,那么就有可能造成消息丢失,这也是消费者丢失消息的主要原因。这也是偏移量提交时间和方式重要的原因。

消费者相关参数配置:

group.id

auto.offset.reset:没有偏移量或指定的偏移量不存在时处理方式。

enable.auto.commit

auto.commit.interval.ms和第三个参数配合使用,如果配置自动提交,此参数用于自动提交的频率,默认5秒一次。

仅一次传递:kafka无法支持仅一次传递语义,但是可以把结果写入到一个仅支持唯一键的系统里,通常消息本身包含唯一键,这样可以实现幂等性写入。

六、构建数据管道

kafka为数据管道带来的主要价值在于,它可以作为数据管道各个数据段之间的大型缓冲区,有效地解耦管道数据的生产者和消费者。kafka的解耦能力以及在安全和效率方面的可靠性,使它称为构建数据管道的最佳选择。

七、跨集群数据镜像

我们把集群间的数据复制叫做镜像,kafka内置的集群复制工具叫做MirrorMaker。

跨数据中心通信需要考虑的问题:高延迟、有限的带宽、高成本。

kafka客户端和服务器是按照单个数据中心进行设计、开发、测试和调优的。

在大多数情况下,我们要避免向远程的数据中心生成数据,如果这么做了,需要忍受高延迟、并且要增大重试次数和增加缓冲区来解决潜在的网络分区问题。

如果一个数据中心的多个应用程序需要从另一个数据中心的kafka服务器上读取数据,我们倾向于为每一个数据中心安装一个kafka,并在这些集群间复制数据,而不是让程序直接通过广域网访问数据。

基本的架构原则:

每个数据中心至少需要一个集群。

每两个数据中心的复制要做到每个事件仅复制一次(除非出现错误需要重试)。

如果有可能,尽量从远程数据中心读取数据而不是向远程数据中心写入数据。

 

 

当有两个或多个数据中心需要共享数据并且每个数据中心都可以生产和读取数据时,可以使用双活架构。

八、管理kafka

九、监控kafka

十、流式处理

kafka一般被认为是一个强大的消息总线,可以传递事件流,但没有处理和转换事件的能力。

数据流是无边界数据流的抽象。无边界意味着无线和持续增长。

除了没有边界,事件流还有其他的属相:事件流是有序的、不可变的数据记录、事件流是可重播的。

流式处理是指实时的处理一个或多个事件流,流式处理是一种编程范式,就像请求与响应范式、批处理范式那样。

流的定义不依赖任何一个特定的框架、API或特性。只要持续的从一个无边界的数据集读取数据,然后对她们进行处理并生成结果,那就是在进行流式处理。重点是整个处理过程必须是持续的。

流式处理的设计模式:

单个事件的处理:处理单个事件是流式处理最基本的模式,也叫map或filter模式,(map-reduce,map阶段转换事件,reduce阶段聚合转换过的事件)

使用本地状态:大部分流式应用程序关心的是如何聚合消息,特别是基于时间窗口进行聚合。

多阶段处理和重分区:

使用外部查找--流和表的连接

流与流的连接

 

标签:副本,消费者,分区,broker,笔记,kafka,学习,消息
From: https://www.cnblogs.com/gaoshikenan/p/17246648.html

相关文章

  • 通过MapEdit源程序的学习MAP文件 2, 极度简化的程序,只有显示MAP
      1,地图编辑器。主界面EdMainin'EdMain.pas'{FrmMain},2,大号地砖?有界面mpalettin'mpalett.pas'{FrmMainPal},3,素材数据有界面FObjin'FObj.pas'{FrmObj},4,数据合成编辑器,有界面,ObjEditin'ObjEdit.pas'{FrmObjEdit},5,提取数据,有界面,ObjSet......
  • gulp笔记 2 (进阶一点点:使用bower来管理前端依赖)
    其实gulp比例1中的内容已经基本满足开发要求了。此文为进阶的一点点知识#1 安装bower(bower是个纯web前端依赖管理工具。)   npminstall-gbower #版本为1.8.14,必须安装在全局   bowerinit#会生成一个bower.json文件,选项寂寞默认就行,bower的库户自动放到bowe......
  • 手把手带你玩转Spark机器学习-深度学习在Spark上的应用
    文章目录系列文章目录前言一、ApacheSparkTimeline二、开发步骤1.在jupyter中启动SparkSession和SparkContext2.下载数据3.用Spark读取图片3.TransferLearning总结前言本文将介绍深度学习在Spark上的应用,我们将聚焦于深度学习Pipelines库,并讲解使用DLPipelines的方式。我们......
  • 如何基于MLServer构建Python机器学习服务
    文章目录前言一、数据集二、训练Scikit-learn模型三、基于MLSever构建Scikit-learn服务四、测试模型五、训练XGBoost模型六、服务多个模型七、测试多个模型的准确性总结参考前言在过去我们训练模型,往往通过编写flask代码或者容器化我们的模型并在docker中运行。这篇文章中,我们......
  • 计算机视觉中的主动学习(Active Learning)介绍
    前言 ActiveLearning主动学习是机器学习(ML)的一个研究领域,旨在通过以智能方式查询管道的下一个数据来降低构建新机器学习解决方案的成本和时间。在开发新的AI解决方案和处理图像、音频或文本等非结构化数据时,我们通常需要人工对数据进行注释,然后才能使用它们来训练我们的模......
  • 为什么学习微积分
    为什么学习微积分Itookcalculusmysenioryearofhighschool,andIreallylikedthewayourteacherframedthisonthefirstdayofclass.Heaskedsomebodytoraisetheirhandandaskhimwhenwewouldusecalculusinoureverydaylife.Soonestuden......
  • 机器学习基础09DAY
    分类算法之逻辑回归逻辑回归(LogisticRegression),简称LR。它的特点是能够是我们的特征输入集合转化为0和1这两类的概率。一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要应用进入,可以使用逻辑回归。了解过线性回归之后再来看逻辑回归可以更好的......
  • 腾讯云-云计算学习课程
    云计算学习https://cloud.tencent.com/edu/paths/series/cloudcomputing......
  • Redis和kafka比较,两者的区别和各自的优势。
    1.Redis,它首先是一个内存数据库,其提供的PUB/SUB功能把消息保存在内存中(基于channel),因此如果你的消息的持久性需求并不高且后端应用的消费能力超强的话,使用RedisPUB/SUB是比较合适的使用场景。比如官网说提供的一个网络聊天室的例子:模拟IRC,因为channel就是IRC中的服务器。用户......
  • 【C#学习】01--基本概念
    1.1关于C#C#只是一种简单安全的新型面向对象语言,继承了C的语法风格和C++的面向对象特性,不再提供对指针类型的支持(因此程序不可随便访问内存地址空间)、不再支持多重继承;C#的诞生意义是生成面向.NETFramework环境的代码,身为编程语言的一种,它作为开发工具而存在,本身并不......