Kafka架构

5.kafka系统的架构

5.1主题topic和分区partition

  • topic

Kafka中存储数据的逻辑分类;你可以理解为数据库中的概念;

比如,将app端日志、微信小程序端日志、业务库订单表数据分别放入不同的topic

  • partition分区(提升kafka吞吐量)

topic中数据的具体管理单元;(你可以理解为hbase中表的“region"概念)

- 每个partition由一个kafka broker服务器管理;

- 每个topic 可以划分为多个partition,分布到多个broker上管理;

- 每个partition都可以有多个副本;保证数据安全

分区对于 kafka 集群的好处是:实现topic数据的负载均衡。提高写入、读出的并发度,提高吞吐量。

  • 分区副本replica

每个topic的每个partition都可以配置多个副本(replica),以提高数据的可靠性

每个partition的所有副本中,必有一个leader副本,其他的就是follower副本(observer副本);follower定期找leader同步最新的数据;对外提供服务只有leader

  • 分区follower 

partition replica中的一个角色,它通过心跳通信不断从leader中拉取、复制数据(只负责备份)。

如果leader所在节点宕机,follower中会选举出新的leader;

  • 消息偏移量offset

partition内部每条消息都会被分配一个递增id(offset);通过offset可以快速定位到消息的存储位置;

kafka 只保证按一个partition中的消息的顺序,不保证一个 topic的整体(多个partition 间)的顺序。

我们在说到偏移量的时候,是哪一个topic的哪一个分区的哪一个,偏移量他的数据只能追加,不能被修改

自我推导设计:

  • kafka是用来存数据的;
  • 现实世界数据有分类,所以存储系统也应有数据分类管理功能,如mysql的表;kafka有topic;
  • 如一个topic的数据全部交给一台server存储和管理,则读写吞吐量有限;
  • 所以,一个topic的数据应该可以分成多个部分(partition)分别交给多台server存储和管理;
  • 如一台server宕机,这台server负责的partition将不可用,所以,一个partition应有多个副本;
  • 一个partition有多个副本,则副本间的数据一致性难以保证,因此要有一个leader统领读写;
  • 一个leader万一挂掉,则该partition又不可用,因此还要有leader的动态选举机制;
  • 集群有哪些topic,topic有哪几个分区,server在线情况,等等元信息和状态信息需要在集群内部及客户端之间共享,则引入了zookeeper;
  • 客户端在读取数据时,往往需要知道自己所读取到的位置,因而要引入消息偏移量维护机制;

broker服务器:一台 kafka服务器就是一个broker。一个kafka集群由多个 broker 组成。

生产者producer:消息生产者,就是向kafka broker发消息的客户端。

消费者consumer

  • consumer :消费者,从kafka broker 取消息的客户端。
  • consumer group:消费组,单个或多个consumer可以组成一个消费组;

消费组是用来实现消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段;

消费者可以对消费到的消息位置(消息偏移量)进行记录;

老版本是记录在zookeeper中;新版本是记录在kafka中一个内置的topic中(__consumer_offsets)

5.2kafka的数据存储结构    kafka的数据存在哪?

5.2.1kafka的整体存储结构

物理存储目录结构         __consumer_offset  

存储目录 名称规范:  topic名称-分区号

注:“t1"即为一个topic的名称;

“t1-0 / t1-1"则表明这个目录是t1这个topic的哪个partition

  • 数据文件 名称规范:

生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制

  1. 每个partition的数据将分为多个segment存储
  1. 每个segment对应两个文件:“.index"文件和“.log"文件。

index和log文件以当前segment的第一条消息的offset命名。

index索引文件中的数据为:  消息offset -> log文件中该消息的物理偏移量位置;

Kafka 中的索引文件以稀疏索引( sparse index )的方式构造消息的索引,它并不保证每个消息在索引文件中都有对应的索引;每当写入一定量(由 broker 端参数 log.index.interval.bytes 指定,默认值为 4096 ,即 4KB )的消息时,偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和时间戳索引项,增大或减小 log.index.interval.bytes的值,对应地可以缩小或增加索引项的密度;

查询指定偏移量时,使用二分查找法来快速定位偏移量的位置。

 5.2.2消息message存储结构

在客户端编程代码中,消息的封装类有两种:ProducerRecord、ConsumerRecord;

简单来说,kafka中的每个massage由一对key-value构成;

Kafka中的message格式经历了3个版本的变化了:v0 、 v1 、 v2  

各个字段的含义介绍如下:

  • crc:占用4个字节,主要用于校验消息的内容;
  • magic:这个占用1个字节,主要用于标识日志格式版本号,此版本的magic值为1
  • attributes:占用1个字节,这里面存储了消息压缩使用的编码以及Timestamp类型。目前Kafka 支持 gzip、snappy 以及 lz4(0.8.2引入) 三种压缩格式;[0,1,2]三位bit表示压缩类型。[3]位表示时间戳类型(0,create time;1,append time),[4,5,6,7]位保留;
  • key length:占用4个字节。主要标识 Key的内容的长度;
  • key:占用 N个字节,存储的是 key 的具体内容;
  • value length:占用4个字节。主要标识 value 的内容的长度;
  • value:value即是消息的真实内容,在 Kafka 中这个也叫做payload。

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

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

相关文章

c++11 标准模板(STL)(std::basic_ostream)(二)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

【SQL应知应会】分析函数的点点滴滴(二)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数&#xff1a;…

【Java-SpringBoot+Vue+MySql】前后端分离项目云端部署

目录 部署环境&#xff1a; 安装MYSQL&#xff1a; 安装Nginx 安装配置JDK 远程连接数据库 前端打包 后端打包 心得&#xff1a; 部署环境&#xff1a; CentOS7.6 MySQL5.7 JDK1.8 Nginx1.8 下载MySQL MySQL :: Download MySQL Community Server (Archived Versions) …

【探索 Kubernetes|作业管理 Deployment 篇 系列 12】水平扩展 / 收缩、滚动 / 回滚更新

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们介绍了控制器的基本设计思想&#xff1a;控制器模式。通过这个 “控制器模式” 我们来看看 Deployment 是如何依靠它来实现的。 最近搞了一个扣扣群&#xff0c;旨在技术交流、博客互助&#xff0c;希望各位…

IBM N系列存储和NetApp FAS之间的对应关系

IBM在很长一段时间都是OEM NetApp的FAS存储作为他的NAS产品线&#xff0c;在IBM叫做Storage N series&#xff0c;就是N系列&#xff0c;在2014年IBM终止了和NetApp之间的OEM关系&#xff0c;目前在市场上的OEM的NetApp存储型号主要是 FAS3000&#xff0c;FAS31和FAS32的中端系…

MySQL-SQL视图详细

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

chatgpt赋能python:同一个python文件能同时运行多次吗?

同一个python文件能同时运行多次吗&#xff1f; Python作为一种高级编程语言&#xff0c;具有丰富的语法和功能。在编写Python程序时&#xff0c;我们常常需要考虑不同的需求。有时我们可能需要使用相同的python文件运行不同的程序&#xff0c;这时候很自然的问题就会出现&…

数据结构--单链表的查找

数据结构–单链表的查找 均以带头结点链表为例 目标&#xff1a; GetElem(Li):按位查找操作。获取表L中第i个位置的元素的值。 LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。 按位查找 按位查找,返回第i 个元素&#xff08;带头结点) 代码实现 typ…

Diffusion详细学习

解决报错 https://zhuanlan.zhihu.com/p/622238031 原理&#xff1a;https://zhuanlan.zhihu.com/p/612854566 解决内存溢出问题 溢出问题 总结下来&#xff1a;batch_size 和 n_samples 调节 原理学习 扩散模型是一种生成模型&#xff0c;用于生成与训练数据相似的数据。…

go语言学习笔记1

go语言简介 ​ GoLang是一种静态强类型、编译型、并发型&#xff0c;并具有垃圾回收功能的编程语言&#xff1b;它可以在不损失应用程序性能的情况下极大的降低代码的复杂性&#xff0c;还可以发挥多核处理器同步多工的优点&#xff0c;并可解决面向对象程序设计的麻烦&#x…

架构基本概念和架构本质

什么是架构和架构本质 在软件行业&#xff0c;对于什么是架构&#xff0c;都有很多的争论&#xff0c;每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前&#xff0c;我们先讨论架构的概念定义&#xff0c;概念是人认识这个世界的基础…

从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题

目录 1. 多态&#xff08;polymorphism&#xff09; 1.1 构成多态的两个条件 1.2 虚函数重写(覆盖) 1.3 协变构成多态 1.4 父虚子非虚构成多态 1.5 析构函数的重写 1.6 final 和 override 关键字&#xff08;C11&#xff09; 1.7 重载、覆盖、隐藏的对比 2. 抽象类&am…