初识kafka---Kafka从入门到精通(一)

2023-11-04

Kafka中的消息是以topic进行分类的,生产者生产消息,消费者消费消息都是面向topic。而每个topic里面都是有分区的概念,一个topic有三个分区,而每个分区都是有分区leader(partition leader)和partition follower,注意重点,每个leader和follower对应的在不同的服务器,否则一个服务器挂掉了,则没有任何备份的意义。每个数据都有offset,主要是记录每次消费到哪个位置,方便kafka宕机后从当前位置继续消费。

比如broker0里有topicA-partition0-leader 和 topicA-partition1-follower

Broker1里有topicB-partition1-leader 和 topicB-partition0-follower

Topic是逻辑上的概念,partition是物理上的概念,每个partition都对应一个log文件,producer生成数据的信息就存储在这个log文件里,每次生产数据都会append进入。

这时候kafka为了防止数据过大,采用了分段segment和索引的机制来方便查找数据,每个segment都有对应的log文件和index文件。

Kafka在通过producer保证数据的可靠性,当topic的分区接受到消息时,会返回一个ack确认收到消息,如果收到消息,则会进入下一轮发送新的数据,否则会一直重复发送当前数据。

副本数据同步有两种方案,半数以上topic分区完成同步则直接发送ack,这种方案有点延迟低,速度快,但是当宕机选举新的leader时候,容忍n台故障机器,这时候需要2n+1个副本。第二种方案则延迟高,这个选举新的leader时候,容忍n台故障机器,需要n+1个副本。

Kafka选择了第二种方案,因为kafka毕竟是存储高并发大数据的,数据量大的是时候,副本越多成本越大,而网络延迟对kafka影响比较小。

采用第二种方案后,如果leader收到数据,follower都开始同步数据,但有一个follower发生故障,这时候就会影响整个流程,所以就有了ISR机制,当有其中一个follower宕机的时候,会将该follower踢出ISR,这里会有一个过期时间,过期时间由replica.lag.time.max.ms参数设定,当leader发生故障则重新选举新的leader。

对于一些不是很重要的数据,可以允许丢失,所以每次等topic回复ack很影响效率,这时候有三个ack的应答机制:

  1. producer不等待broker的ack,这个机制延迟最低,但宕机时候可能数据会丢失。
  2. Producer等待broker的ack,当leader成功后返回ack,这时候宕机会导致follower数据丢失。

-1、也就是all,这个是延迟最高,必须所有的都返回ack。但可能会造成数据重复,当同步到leader和follower之后,leader挂掉了,这时候选举新的leader,于是再次通过leader同步一次数据到follower。

分区分配策略:一个consumer group有多个consumer,一个topic会有多个partition,所以必然涉及到partition分配问题,确定哪个partition由consumer来消费。Kafka有两种分配策略,一个是RoundRobin,一个是Range。

RoundRobin:轮询消费,但是缺点是会消费到未订阅的数据,比如吧消费者consumerA 和consumerB看做一个整体,然后消费topicA和topicB,如果consumerA只订阅了topicA,但是因为他们是一个整体,所以会消费到未订阅的数据,优点是负载均衡。

Range:按范围分配,每个consumer消费特定的区间partition,但是缺点就是可能消费不均衡。

Kafka在0.9版本之前是吧offset保存在zookeeper种,但是在之后的版本,是吧offset保存在kafka内置的topic种,这个topic叫做_consumer_offset。

Kafka高效读写数据

Kafka是分布式消息队列,因为topic的分区特性,并发读写能力强。

顺序写磁盘:kafka需要producer写入log文件种,磁盘写都是很慢的,但是kafka采用顺序写方式,因为随机写会在磁盘种找地址值,kafka官方文档测试表示随机写100kb/s,顺序写能600m/s。

零复制技术:直接由系统内核来处理文件读写,省去了与用户空间交互部分。

Zookeeper在kafka中会负责选举新的broker作用,当其中主的broker宕机时候,则会通过zookeeper来选举,还有前面说的存储offset但是0.9版本之后就没存了。

Kafka事务在11版本之后引入了事务,当消费者和生产者跨分区时候,要么全部成功,要么全部失败。

Producer事务:为了实现事务跨分区,所以事务ID肯定是全局的,又为了防止宕机数据事务消失,所以又会吧事务id存入kafka其中一个topic,为了管理事务,引入了transaction coordinator组件。

Consumer事务:上述事务主要针对producer,对于消费端而言事务相对来说较弱,尤其无法保证commit信息精准消费,这是由于consumer可以通过offset访问任意信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初识kafka---Kafka从入门到精通(一) 的相关文章

随机推荐

  • 2022mpsPTE岗位笔试题

    2022年9月完成了PTE岗位的笔试 并通过了 浅浅的还有一点印象 之前有朋友也想来 就放在这里 供需要的朋友看 前两个题是关于C语言的 语言不限 C 也可 一个是输出2到100偶数之和 主要就是调用for循环 一个是输入一个数 输出这个数
  • SpringCloud集成Nacos并使用

    摘要 今天分享下 SpringCloud 集成 Nacos 并使用 的一些基本知识 欢迎关注 欢迎阅读 总结系列 SpringCloudAlibaba 实战搭建 项目父模块 pom xml 配置
  • lgb(lightgbm)处理类别特征遇到的问题(泰坦尼克):

    1 lgb lightgbm 处理类别特征遇到的问题 ValueError DataFrame dtypes for data must be int float or bool Did not expect the data types
  • windows下使用vscode远程连接Linux服务器进行开发

    windows下使用vscode远程连接Linux服务器进行开发 一 安装远程开发插件Remote Development 1 在商店中搜索 Remote Development 并安装 2 选择SSH Targets 3 新建远程连接 4
  • mysql 数据类型

    1 整数类型 TINYINT SMALLINT MEDIUMINT INT BIGINT 分别使用 8 16 24 32 64位存储空间 存储范围是 2的 n 1 次方到2的 n 1 次方 1 其中n是存储空间位数 unsigned属性不允
  • 如何在uni-app正确使用web-view

    可以定义一个内部页面 就只放一个web view 然后在列表点击的时候 跳转到该内部页面 并且把需要打开的链接传递到该页面
  • vector::erase() vector中如何删除元素?

    vector erase 从指定容器删除指定位置的元素或某段范围内的元素 vector erase 方法有两种重载形式 如下 1 iterator erase iterator Where v1 erase v1 begin 删除v1中的第
  • MongDB解决Authentication Failed导致的不能连接问题

    MongoDB的安装 Step1 打开MongoDB产品下载页面https www mongodb com download center jmp nav community 选择Windows Server 2008 R2 64 bit
  • linux标准库unistd.h

    unistd h是unix std的意思 是POSIX标准定义的unix类系统定义符号常量的头文件 包含了许多UNIX系统服务的函数原型 unistd h在unix中类似于window中的windows h ifdef WIN32 incl
  • 微信小程序秀才成语接龙趣味答题小游戏带流量主无授权源码

    介绍 流量主带 横屏广告 视频广告 插屏广告 激励广告 趣味性很强 会推广运营肯定能赚一笔 这套源码也是淘宝买的 网盘下载地址 http kekewangLuo cc j27EjMGhsPL0 图片
  • 微信小程序 Spdier - OfferShow 反编译逆向(一)

    微信小程序 Spdier OfferShow 反编译逆向 一 文章目录 微信小程序 Spdier OfferShow 反编译逆向 一 前言 一 任务说明 1 尝试反编译分析出js code参数的生成方式 用来获取token 2 将小程序搜索
  • Flask 打包 PostgreSQL/PyTorch 的图像推荐系统在 Heroku 云平台上运行

    前文 推荐图像理论简述 PyTorch 推荐相似图像实现 图像推荐 Flask App 步骤 我已经为这个项目设定并满足了以下要求 该网络应用程序可在互联网上访问 该应用程序有一个带分页的图像库 仅加载页面的相关数据 图库和推荐的数据是从数
  • redis常用数据类型的场景,你真的用对了么?

    关注微信公众号 虾米聊吧 每天更新一篇技术文章 文章内容涵盖架构师成长必经之路应掌握的技术 一起学习 一起交流 redis常用数据类型的场景 你真的用对了么 redis常用数据类型包含string hashmap list set sort
  • 使用Transformers离线模型(以bert模型为例)

    首先需要安装transformers pip install transformers 以bert base uncased为例 进入网站 https huggingface co bert base uncased tree main 可
  • qt/e在arm板上显示中文的方法

    QTCN社区 gt Qt嵌入式开发 gt 求qt e在arm板上显示中文的方法 打印本页 登录 注册 回复主题 发表主题 newalan 2008 04 15 00 38 求qt e在arm板上显示中文的方法 求qt e在arm板上显示中文
  • mysql 高效复制存储数据到另一张表

    最近有个需求 我们老大说让我写个存储过程把一张表的数据分组之后按时间取最近的三条数据 复制到另一张表中 刚开始他也没有说这么明白 我就用存储过程写了 写完之后他才说每天取最近三条数据 我一想 这根本用不到存储过程 直接两条SQL搞定如下 d
  • windows server 2008 R2使用nginx代理https访问,外网访问失败

    windows server 2008 R2使用nginx代理https访问 外网访问失败 问题 因为公司固定了ip 在公司服务器Windows server 2008 R2部署项目后 使用nginx代理了https 出现 使用公司的网络
  • 无需Root 手机装电脑系统 虚拟机

    不需要ROOT 安装也有简单方法 比较适合小白 也有大神操作方法 特别说下这不是云电脑 不需要网都可以跑起来 下面具体看下面操作 来自网上教程 非本站原创 我们需要一个软件 windows模拟器 链接 https pan baidu com
  • vue把el-dialog提取出来作为子组件,并实现父组件和子组件相互传值

    最近做项目遇到了一个需求是 为了防止组件中代码冗长 需要将el dialog对话弹出框单独封装成子组件 并将父组件中的id传递给子组件 子组件再根据id刷新父组件 具体项目代码太长 这里仅记录一下实现思路 01 把el dialog提取出来
  • 初识kafka---Kafka从入门到精通(一)

    Kafka中的消息是以topic进行分类的 生产者生产消息 消费者消费消息都是面向topic 而每个topic里面都是有分区的概念 一个topic有三个分区 而每个分区都是有分区leader partition leader 和partit