初识kafka-数据存储篇1

 目录

背景

1 kafka总体体系结构

2 疑问解答

2.1 高吞吐低延迟

2.2 实现分布式存储和数据读取

2.3 如何保证数据不丢失


背景

      最近在和产品过项目审批的时候,深刻感受到业务方对系统的时时响应提出了更高的要求。目前手上大部分的业务都是基础定时任务去实现的,如果要实现更快速的响应,最佳的方式无非是采用消息中间件,在课余的时间也重温了下消息中间件kafka的架构知识点,本文主要总结kafka的数据存储相关方的知识:

1 kafka总体体系结构

  • 架构图
  • 名称解释
    名称含义
    Broker 消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群,通俗说就是 每台机器上都运行一个Kafka的进程
    Topic代表了逻辑上的一个数据集
    Partition

    物理上的概念,一个topic可以分为多个partition ,说白就是数据

    Controllerkafka集群的总控组件,负责管理整个kafka集群范围内的各种东西
    Consumer消费者,从Broker拉去消息
    Consumer group每个Consumer属于一个特定的Consumer Group,一条满息可以发送到多个不同的Consumer Group但是一个Consumer Group中只能有一个Consumer能够满费该消息
     
    Producer生产者,向Broker推送消息
    看完整体架构后,不妨带上几个问题思考下
  • kafka的是如何实现高吞吐低延迟呢?
  • 如何实现分布式存储和存储的数据是如何保证高性能读取呢?
  • 如何保证数据不丢失?

2 疑问解答

2.1 高吞吐低延迟

吞吐量概念:单位时间内可以处理多少条数据,就叫做吞吐量。
提升了吞吐量,但是计算的延时就增加

kafka的高吞吐低延迟的原因主要体现在下面几个方面

  • 写数据:使用页缓存+磁盘顺序写

        rabbitmq相比:rabbitmq这种消息中间件,他会先把数据写入内存里,然后到了一定时候再把数据一次 性从内存写入磁盘里

  • 写数据:使用零拷贝技术

零拷贝:零拷贝是指在将数据从Kafka的日志文件传输到网络的过程中,避免了在Java堆内存(JVM)和操作系统之间拷贝数据。这样做可以减少CPU的使用,提高数据传输的效率

1 从page cache读,读不到才从磁盘IO读

2 会将数据放在os层的一个page  cache里

3 接着会发生上下文切换到系统那边,把os的读缓存数据拷贝到应用缓存里

4 接着再次发生上下文二切换到os层,把应用缓存的数据拷贝到os的socket缓存中

5 最后数据再发送到网卡上

        

2.2 实现分布式存储和数据读取

每个partition可以放在一台机器上,通过这个方式就可以实现数据的分布式存储了,落盘后的数据,其实就是个文件,类似日志。

  • 分布式存储实现:其实很简单,就是将每个partition可以放在一台机器上,通过这个方式就可以实现数据的分布式存储了。
  • 高性能的日志存储 
    • 每个分区对应的目录:

              比如说有个topic叫做“order-topic”  3台机器上分别会有3个目录
                “order-topic-0”,“order-topic-1”,“order-topic-2”

机器partition目录结构下级文件格式解释
机器1 order-topic-000000000000009936472.index
00000000000009936472.log
00000000000009936472.timeindex
每个分区里面就是很多的log segment file,
也就是日志段文件【有自己的索引文件】
机器2order-topic-100000000000019936472.index
00000000000019936472.log
00000000000019936472.timeindex
机器3order-topic-200000000000029936472.index
00000000000029936472.log
00000000000029936472.timeindex
    • 基于二分查找快速定位数据
      • 写入日志文件的时候,同时会写索引文件,就是.index和.timeindex【位移索引,时间戳索引】
      • 定位流程:索引文件里的数据是按照位移和时间戳升序排序的,用二分查找,时间复杂度是O(logN),找到索引,就可以在.log文件里定位到数据
    • 查找数据例子
需求查找流程例子查找offset = 58892
根据offset查找1 先在这个文件里二分查找找到offset,
2 在.index里根据offset二分查找找对应的.log文件里的位置,
3 最后就去.log文件里查找对应的数据      

 假设存在文件:

44576 物理文件(.log位置)57976 物理文件(.log位置)      64352 物文件(.log位置)

因58892> 57976&

58892<64352 因此数据在 57976 .log文件的位置

查找某段时间范围内的时间1 先在对应的索引文件里二分查找找到offset
2 然后再去.index里根据offset二分查找找对应的.log文件里的位置,
3 最后就去.log文件里查找对应的数据
略略略略

2.3 如何保证数据不丢失

  • 多副本冗余的机制

对数据做多副本冗余,也就是每个parttion都有副本【follower partition】

  • ISR【in-sync replica】 同步副本集

ISR 其实可以理解理解为与leader保持同步的所有副本的集合。主要是动态维护了一个和leader副本保持同步副本集合,ISR中的副本全部都和leader的数据保持同步。可以做到故障转移,保障服务的可用性。

架构图如下:

总之,保证写入kafka的数据不丢失,首先需要保证ISR中至少有一个follower。其次就是在一条数据写入了leader partition之后,要求必须复制给ISR中所有的follower partition。

关于ISR机制的原理,下期在详讲

作者:老喵

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs+vue高校会议室预订管理系统python-flask-django-php

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套高校会议室预订管理系统&#xff0c;帮助学校进行会议…

JDK,JRE,JVM之间的关系

他们明面上的关系是JDK包含JRE&#xff0c;JRE包含JVM。 简单理解JDK就是Java开发工具包。JRE是Java运行环境。JVM是Java虚拟机。 JDK是面向开发者的&#xff0c;JRE是面向JAVA程序的用户的。也就是说开发者开发JAVA程序是需要用到JDK&#xff0c;如果用户不去开发JAVA程序&am…

OpenHarmony IDL工具规格及使用说明书(仅对系统应用开放)

IDL接口描述语言简介 当客户端和服务器进行IPC通信时&#xff0c;需要定义双方都认可的接口&#xff0c;以保障双方可以成功通信&#xff0c;OpenHarmony IDL&#xff08;OpenHarmony Interface Definition Language&#xff09;则是一种定义此类接口的工具。OpenHarmony IDL先…

初识 Redis 浅谈分布式

目 录 一.认识 Redis二.浅谈分布式单机架构分布式是什么数据库分离和负载均衡理解负载均衡数据库读写分离引入缓存数据库分库分表引入微服务 三.概念补充四.分布式小结 一.认识 Redis 在 Redis 官网我们可以看到介绍 翻译过来就是&#xff1a;数以百万计的开发人员用作缓存、…

nodejs+vue高校社团管理小程序的设计与实现python-flask-django-php

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低学校的运营人员成本&#xff0c;实现了高校社团管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了高校社团管理的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准…

t-rex2开放集目标检测

论文链接&#xff1a;http://arxiv.org/abs/2403.14610v1 项目链接&#xff1a;https://github.com/IDEA-Research/T-Rex 这篇文章的工作是基于t-rex1的工作继续做的&#xff0c;核心亮点&#xff1a; 是支持图片/文本两种模态的prompt进行输入&#xff0c;甚至进一步利用两…

CCF-CSP认证考试 202303-5 施肥 35/60/75/100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202303-5 施肥 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 1.0GB 问题描述 春天到了&#xff0c;西西艾弗岛上的 n n n 块田地需要施肥了。 n n n 块田地编号为 1 , 2…

基于Google云原生工程师的kubernetes最佳实践(二)

目录 二、应用部署篇 为deployment打上丰富的label,以便selecting 使用sidecar容器部署agent、proxy等组件 使用init container处理依赖关系,而不要用sidecar 镜像tag使用版本号,不要用latest或空tag 为pod设置readiness和liveness探针 不要给所有服务都使用LoadBalance…

【微服务】以模块化单体架构开发微服务应用

目录 推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战我们知道,起初,单体应用有显著的优势:它们更容易开发和部署。从开发人员的角度来看,这种简单性是有益的。一切都是集中的,可以快速更新任何部分的业务逻辑并立即看到结果。这种开…

竞赛 python opencv 深度学习 指纹识别算法实现

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…

ETL数据倾斜与资源优化

1.数据倾斜实例 数据倾斜在MapReduce编程模型中比较常见&#xff0c;由于key值分布不均&#xff0c;大量的相同key被存储分配到一个分区里&#xff0c;出现只有少量的机器在计算&#xff0c;其他机器等待的情况。主要分为JOIN数据倾斜和GROUP BY数据倾斜。 1.1GROUP BY数据倾…

【短接笔记本或者台式机的CMOS针脚解决电脑开机无法启动BIOS无法进入问题】

为什么要执行短接笔记本或者台式机的CMOS针脚操作&#xff1f; 问题&#xff1a;可以解决如下图所示&#xff0c;技嘉小雕主板开机时按delete键无法进入BIOS主板界面&#xff0c;长时间等待之后依然无法进入BIOS主板界面&#xff0c;则判定为主板问题。此时短接CMOS针脚可清空…

nodejs+vue高校工作室管理系统python-flask-django-php

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对高校工作室管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

python(django(自动化))之流程接口展示功能前端开发

1、创建模板代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>测试平台</title> </head> <body role"document"> <nav class "navbar n…

Redis - list 列表

前言 列表类似于 Java 中的数组或者顺序表&#xff0c;在 Redis 中&#xff0c;可以对列表两端插⼊&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;&#xff0c;还可以获取指定范围的元素列表、 获取指定索引下标的元素等。列表是⼀种⽐较灵活的数据结构&#…

(一)基于IDEA的JAVA基础7

关系运算符 运算符 含义 范例 结果 等于 12 false &#xff01; 不等于 1&#xff01;2 true > 大于 1>2 false < 小于 …

微服务(基础篇-001-介绍、Eureka)

目录 认识微服务&#xff08;1&#xff09; 服务架构演变&#xff08;1.1&#xff09; 单体架构&#xff08;1.1.1&#xff09; 分布式架构&#xff08;1.1.2&#xff09; 微服务&#xff08;1.1.3&#xff09; 微服务结构 微服务技术对比 企业需求 SpringCloud(1.2) …

思科网络中DHCP中继的配置

一、什么是DHCP中继&#xff1f;DHCP中继有什么用? &#xff08;1&#xff09;DHCP中继是指一种网络设备或服务&#xff0c;用于在不同的子网之间传递DHCP&#xff08;动态主机配置协议&#xff09;消息。DHCP中继的作用是帮助客户端设备获取IP地址和其他网络配置信息&#x…

jvm底层

逐步细化 静态链接&#xff1a;静态方法(符号引用)替换为内存指针或者句柄直接引用) 动态链接&#xff1a;程序期间将符号引用替换为直接引用 对象头&#xff1a; 指针压缩&#xff1a; -XX:UseCompressedOops 开启指针压缩 减少内存消耗&#xff1b;大指针在主内存 缓存间移…

6.3 BP神经网络

在多层感知器被引入的同时&#xff0c;也引入了一个新的问题&#xff1a;由于隐藏层的预期输出并没有在训练样例中给出&#xff0c;隐藏层结点的误差无法像单层感知器那样直接计算得到。 为了解决这个问题&#xff0c;反向传播&#xff08;BP&#xff09;算法被引入&#xff0…