kafka系列一:初识kafka

概述

kafka是由scala语言编写的一个分布式且具备高可用、高性能、可持久化、可水平扩展、支持流数据处理等众多特性的消息系统,常活跃于大数据生态中,而且大名鼎鼎的rocketmq就是参考了kafka的设计原理。

目前越来越多的开源分布式中间件都支持与kafka集成(elk、spark、storm、canal......)。接下来咱们就深入看下为何它如此受青睐。

架构设计

kafka它由这几个部分组成:若干个producer、若干个consumer、若干个broker、zookeeper集群。

producer负责发送消息,broker负责将消息持久化和将消息推送给消费者,consumer负责消费消息其架构图如下:

图片

broker没有绝对的主从之分,它是根据topic的分区来区分的主从概念。默认分区是1个副本可以在创建topic的时候通过replication-factor参数去指定副本数量,理论上副本数量越多安全度越高,当然也要结合broker的节点数量,比如就三个broker节点,副本设置2个其实安全度是最好的。

副本越多一定越好吗?因为副本越多的话会增加broker的压力和写入的tps。特别是当ack参数为-1的时候。

高可用、高性能原理

高可用这个体现在上面说的分区之间的副本概念,当一个分区中的主分区所在的broker挂掉以后,此时通过zookeeper进行选举操作,将其副本中某一个升级为主分区,这样就可以继续写入了。

那高性能怎么体现呢:从2个角度看第一生产角度broker采用的是顺序写盘再加上 topic设置多分区每个分区的文件是各自落档的,所以最大程度的发挥磁盘性能。

消费角度 可以并发的从不同的分区中拉取消息,其次可以通过增加分区的副本主要在isr列表内的副本都可以为消费提供消息,并且消费者可以横向扩展,只要数量小于分区数就可以保证每个消费者都可以消费到消息,这行消费性能得到成倍的提升。

       并且可以通过指定key将相同用户或者模数相同的数据发送到同一个分区中,做到分区内有序,架构图如下:

图片

什么是ISR列表

       ISR全称:In-Sync Replicas 是一个副本的集合,比如我们创建一个topic :test 分区数为9,replication-factor 副本为3,如果在理想状态下,所有副本的数据都跟上主分区,那此时topic test的ISR中应该是有3个replication-factor ,但是随着业务量上涨,各节点承载的性能越来越大,高峰期写入tps陡增时就会出现副本同步不及时的问题。

    

    默认当副本延迟10秒以后就会将其踢出ISR列表中,可以通过参数 replica.lag.time.max.ms设置,架构图如下:

图片

      我们不难得出结论这个列表是一直动态伸缩的,当部分节点数据差异很大的时候就会被踢出,当数据同步跟上主分区后又被重新加入到列表内,那它有什么影响呢?

       当我们生产者端的ack参数设置为all或者-1的时候此时写请求会等到ISR列表内所有节点都响应后才会给客户端响应成功,这样可以确保消息在生产阶段不丢失。

     这样一来的话就大大降低了生产者写入的tps,如果列表内小于min.insync.replicas的值此时topic就禁止写入了。

ISR总结        

         Kafka Broker在处理消息写入时需更新HW,此时需要申请leaderIsrUpdateLock的读锁,消费者在拉取消息时也需要申请leaderIsrUpdateLock的读锁,这是互补影响的,但是ISR列表在伸缩的同时,主分区需要维护ISR中的HW那么此时就需要申请leaderIsrUpdateLock的写锁,此时会与消息发送、消费客户端消费消息、分区副本消息复制发送锁竞争,并发度急剧下降,这样TPS急剧下降。

     可以通过增大replica.lag.time.max.ms的值来解决此问题,或者增大参数num.replica.fetchers该值默认1,即将replication-factor复制线程数量调大,进而加快同步性能,降低ISR的伸缩频率。


图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3017978.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

kraken2 最新版安装,极简模式

kraken2 git clone https://github.com/DerrickWood/kraken2.gitcd kraken2./install_kraken2.sh /opt/krakenvim .bashrc ---------------- # Kraken export PATH"/opt/kraken:$PATH" ----------------source .bashrc Note: 不晓得是不是我设置了清华源&#xff0c…

AI烟雾监测识别摄像机:智能化安全防范的新利器

随着现代社会的不断发展,人们对于安全问题的关注日益增加,尤其是在日常生活和工作中,对火灾等意外事件的预防成为了一项重要任务。为了更好地应对火灾风险,近年来,AI烟雾监测识别摄像机应运而生,成为智能化…

【Ansiable】ansible的模块和主机清单

Ansible Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机。比…

python turtle

名字动画 #SquareSpiral1.py import turtle t turtle.Pen() turtle.bgcolor("black")my_nameturtle.textinput("输入你的姓名","你的名字?") colors["red","yellow","purple","blue"] for…

适合小白使用的编译器(c语言和Java编译器专属篇)

本节课主要讲如何安装适合编程小白的编译器 废话不多说,我们现在开始 c/c篇 首先,进入edge浏览器,在搜索框输入visual studio ,找到带我画圈的图标,点击downloads 找到community版(社区版)的下…

【排序算法】之冒泡排序

一、算法介绍 冒泡排序(Bubble Sort)是一种基础的排序算法,它的主要思想是通过重复遍历待排序的列表,比较每对相邻的元素并根据需要交换它们,使得每一遍遍历都能将未排序的最大(或最小)元素“冒…

使用sqlmodel实现唯一性校验2,插入之前检查是否已存在

虽然之前添加唯一性校验的方法能够解决数据唯一的问题,但是如果忘了处理异常,则可能会导致程序崩溃。 在此基础上,我们可以在插入数据之前检查该数据是否已存在。 原来的代码: from sqlmodel import Field, Session, SQLModel,…

LINUX 入门 6

LINUX 入门 6 day10 20240505 耗时:41min day10 20240506 耗时:155min 课程链接地址 第6章 DNS协议与请求 1 DNS协议分析与项目介绍 自己去看教程 快速扫了一下,还是结合实践去看概念有感觉 回答以下几个问题: dns作用dns分层…

PLC学习笔记

PLC学习笔记 前言一、一些基操知识二、GX works2编程2.1 位逻辑1.2 中间寄存器1.3 PLC的扫描方式 总结 前言 我这个人真的是太渴望知识了~ 一、一些基操知识 一般X表示输入,Y表示输出。一般八个为一组X0~X7M表示中间寄存器,M0~M7时间T、计数C 二、GX …

Centos 7.9 配置VNCServer实现远程vnc连接

文章目录 1、Centos安装图形界面1.1、安装X Windows System图形界面1.2、安装GNOME图形界面 2、VNC SERVER配置2.1、VNC SERVER安装2.2、VNC SERVER配置1)创建vnc配置文件2)修改配置文件内容3)完整配置文件参考 2.3、设置vnc密码2.4、配置防火…

C#语言核心

一、面向对象基本概念 万物皆对象,用程序来抽象(形容)对象,用面向对象的思想来编程 用中文去形容一类对象,把一类对象的共同点提取出来,然后用程序语言把它翻译过来,带着对象的概念在程序中使…

OCR文本识别模型CRNN

CRNN网络结构 论文地址:https://arxiv.org/pdf/1507.05717 参考:https://blog.csdn.net/xiaosongshine/article/details/112198145 git:https://github.com/shuyeah2356/crnn.pytorch CRNN文本识别实现端到端的不定长文本识别。 CRNN网络把包含三部分&…

IOS离线打包uniapp的信息时报错如下的解决方法

IOS离线打包uniapp的信息时报错如下的解决方法 问题描述: Extract app intents metadata 0.1 seconds XExtractAppIntentsMetadata(in target HBuilder from project HBuilder-Hello)cd /Users/whb/space/vpt/vptios/HBuilder-Hello/Applications/Xcode.app/Conte…

分布式与一致性协议之ZAB协议(六)

ZAB协议 成员发现 成员发现是通过跟随者和领导者交互来完成的,目标是确保大多数节点对领导者的关系没有异议,也就是确立领导者的领导地位。成员发现的实现流程如图所示。 1.领导者选举结束,节点进入跟随者状态或者领导者状态后&#xff0…

如何获得一个Oracle 23ai数据库(RPM安装)

准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 方法包括3种,本文介绍第2种: Virtual ApplianceRPM安装Docker RPM安装支持Linux 8和Linux 9。由于官方的Vi…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者:Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能,优先考虑攻击,而不是警报。 传统的安全信息与事件管理系统(SIEM)在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

【busybox记录】【shell指令】join

目录 内容来源: 【GUN】【join】指令介绍 【busybox】【join】指令介绍 【linux】【join】指令介绍 使用示例: 打印两个文件的共有行 - 默认输出 可以对字母排序 可以对数字排序 可以对字符串排序 打印两个文件的共有行 - 输出文件1或者文件2中…

SQL注入实例(sqli-labs/less-1)

初始网页 从网页可知传递的参数名为 id,并且为数字类型 1、得知数据表有多少列 1.1 使用联合查询查找列数(效率低) http://localhost/sqli-labs-master/Less-1/?id1 union select 1,2 -- 1.2 使用order by查找列数(效率高&…

【MySQL】MySQL基本知识点

目录 1.SQL分类: 2.DDL-数据库操作 3.DDL-表操作-创建 4.DDL-表操作-查询 5.DDL-表操作-数据类型 6.DDL-表操作-修改 1.SQL分类: 2.DDL-数据库操作 3.DDL-表操作-创建 注意:里面的符号全部要切换为英文状态 4.DDL-表操作-查询 5.DDL…

网络安全之动态路由入门

动态路由协议有几种:RIP,OSPF,EIGRP,ISIS,BGP 动态路由工作原理: 例如: 若A区域运行的协议与B中的不同,数据从1到4走A区域还是走B区域,则看A,B两区域的优先级(priority preference或AD——管理距离&#…