初识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机制的原理,下期在详讲

作者:老喵

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【yolo算法水果新鲜程度检测】

Yolo&#xff08;You Only Look Once&#xff09;系列算法是一类流行的一阶段实时目标检测模型&#xff0c;在水果检测领域有着广泛的应用。因其高效性和实时性而受到青睐&#xff0c;可用于识别和定位图像中不同种类的水果以及水果的新鲜度。 YOLOv3 已被用于水果商品的检测分…

家乡特色推荐系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

【Linux】线程互斥{线程间的互斥相关背景概念/锁的相关问题/锁的原理/可重入VS线程安全}

文章目录 0.计算机如何完成y a * b c &#xff1f;1.线程间的互斥相关背景概念2.pthread_mutex_t3.pthread_mutex_lock()4.time() or gettimeofday5.锁的相关问题6.锁的原理7.可重入VS线程安全8.完善后的代码 0.计算机如何完成y a * b c &#xff1f; 来源&#xff1a; 王道…

nodejs+vue反诈科普平台的设计与实现pythonflask-django-php

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

基础篇Redis

基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key.value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串.数值.甚至json…

Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程

文章目录 Windows/Linux-openEuler系统使用路由侠内网穿透&#xff0c;部署项目详细教程一、在windows系统下载安装路由侠并实现项目部署1、下载路由侠并注册安装到Windows系统2、点击内网映射&#xff0c;添加映射&#xff0c;注册域名前缀3、选择网站应用4、配置你想要代理项…

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 &#xff08;一&#xff09;存储引擎概念 &#xff08;二&#xff09;MySQL常用的存储引擎 &#xff08;三&#xff09;存储引擎运作方式 二 MyISAM 存储引擎介绍 &#xff08;一&#xff09; MyISAM 存储引擎特点 1&#xff0c;不支持…

栅格地图路径规划:基于螳螂搜索算法(Mantis Search Algorithm,MSA)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

数据分析和机器学习库Pandas的使用

Pandas 库是一个免费、开源的第三方 Python 库&#xff0c;是 Python 数据分析和机器学习的工具之一。Pandas 提供了两种数据结构&#xff0c;分别是 Series&#xff08;一维数组结构&#xff09;与 DataFrame&#xff08;二维数组结构&#xff09;&#xff0c;极大地增强的了 …

个人博客系列-后端项目-系统角色配置(8)

系统角色配置需要设置的接口 用户可以绑定多个角色&#xff0c;角色对应有多个路由权限。用户绑定角色后&#xff0c;可以访问当前角色下的各个api路由和菜单路由。 用户注册时设置用户角色修改用户角色&#xff08;同时对应用户可以访问的路由将会同步变更&#xff09;添加修…

有关AI的随笔(1)

随笔&#xff1a; 今天是周天&#xff0c;是个好日子&#xff0c;结果老师布置的诗还没写&#xff0c;只好去借助AI&#xff0c;结果我发现了几个有趣的问题&#xff1a; 1. AI写的诗是如何来的&#xff1f;通过数据库&#xff1f; 2. 它真的明白是什么意思吗&#xff1f;&…

AutoDL算力云进行yolov5训练流程

目录 第一步 充值第二步 选择我们用到的显卡第三步 将我们的yolov5源代码导入服务器第四步 激活环境第五步 训练第六步 训练完成 提取 第一步 充值 打开我们的算力云官网 然后找到充值入口 最低充值50 第二步 选择我们用到的显卡 一般呢我都用便宜的2080ti 选择2080ti之后 基…

前端学习之用css和html做一个仿淘宝的导航栏

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>仿淘宝界面案例</title><style>/* 最外层盒子 */.container{width: 270px;height: 385px;border: 1px solid rgb(255, 208, 0);bord…

【jvm】ParNew和ParallelOld为什么不能一起使用

java垃圾回收器ParNew和ParallelOld为什么不能一起使用 Java垃圾回收器中的ParNew和ParallelOld不能一起使用的原因在于它们的设计和目标不同&#xff0c;以及它们所属的垃圾回收器系列不同。 设计和目标差异&#xff1a; ParNew 收集器是 Serial 收集器的并行版本&#xff0c…

【计算机网络】物理层

文章目录 第二章 物理层一、 物理层的基本概念1. 物理层接口特性 二、数据通信基础1. 典型的数据通信模型2. 数据通信相关术语3. 设计数据通信系统要考虑的3个问题4. 三种通信方式5. 串行传输&并行传输6. 同步传输&异步传输7. 码元8. 数字通信系统数据传输速率的两种表…

Python入门(六)

参数传递 1.普通传参 通过判断对应位置来传递。 2.关键字传参 用关键字(Keyword&#xff09;的方式来传递参数。在定义函数时&#xff0c;我们给了形参一个符号标记&#xff0c;即参数名。关键字传递是根据参数名来让数据与符号对应上。因此&#xff0c;如果在调用时使用关键…

Vite+Vue3+TS+Vue-Router+Axios+Pinia开发模板

一、模板介绍 VUE3开发全家桶模板&#xff0c;安装了ts,router,axios,pinia并提供了简单示例并提供了它们的官网链接。 对axios进行了简单封装。 二、下载地址 https://github.com/yigedayouzi/ViteTemplateOne 三、快速开始 1、git clone gitgithub.com:yigedayouzi/Vite…

鸿蒙实战开发:【7日天气预报】

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式&#xff0c; 数据接口是[和风&#xff08;天气预报&#xff09;]&#xff0c; 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是&#xff0c;查询当前城市的实时天气&#xff0c; 目前已实现的功…

IDEA, Pycharm, Goland控制台乱码

IDEA, Pycharm, Goland控制台乱码 问题描述: 控制台出现&#xfffd;&#xfffd;&#xfffd;&#xfffd;等乱码 复现频率: 总是 解决方案: 以IDEA为例 添加 -Dfile.encodingUTF-8位置 idea64.exe.vmoptions 在安装idea的bin目录idea.vmoptions idea客户端 示意图

我的风采——android studio

目录 实现“我的风采”页面要求理论代码生成apk文件 实现“我的风采”页面 要求 要求利用’java框架的边框布局实现“找的风采 ”页而&#xff0c;其中中间为你的生活照&#xff0c;左右和下面为按钮&#xff0c;上面为标签 理论 Java GUI编程是Java程序设计的重要组成部分…