前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >舔一舔 · 肌霸Kafka

舔一舔 · 肌霸Kafka

作者头像
简熵
发布2023-03-06 21:37:45
1910
发布2023-03-06 21:37:45
举报
文章被收录于专栏:逆熵

目录

1、关于Kafka你知道这些术语么?

2、Kafka如何存储数据?

3、kafka扑街了,如何保证高可用?

4、Kafka如何做到数据不丢失?

又是烟雨蒙蒙的冬日,一杯暖茶,春天的气息已经在杯中袅袅升起的热气里荡漾开来,茶醇使人醉,技术要学会。我们来简单剖析一下kafka的一些原理特性。

1、关于Kafka,你知道这些术语吗?

Kafka在消息处理领域能独步天下,自然离不开他优良的架构设计,我们先来看看在Kafka的领域里有哪些组件和概念,下面是一些枯燥的名词解释,如果已经掌握,可以帮忙看看是否正确解释了。

  1. Topic,顾名思义,主题的意思。可以理解为是对某一类型的消息的标识,kafka处理的消息集按照Topic分类,相当于逻辑上的一个消息消息集合。
  2. Partition,分区,数据分区,数据分片,这是物理存储上的分组,每一个Topic可能对应多个分片,比如Topic为Order的消息需要存放5TB的数据到磁盘,如果分配5个Partition,每个partition就是1TB的数据。 一直在说kafka是分布式,高可靠的消息系统,那么这里就有所体现,多个Partition可以分散在不同的服务器上,将数据存储到不同服务器的磁盘上。
  3. Broker,Kafka是可以分布式部署集群,集群中多台服务器,每台部署一个Kafka进程,这个Kafka进程就称之为Broker。
  4. Message,消息,Kafka世界里的通信的基本单位,生产者和消费者基于Topic进行消息的流转。
  5. Producers,消息或者数据的生产者,可以选择向Kafka的某个主题的某个分区发送消息。
  6. Consumers,消息或者数据的消费者,可以从多个topics接受并处理消息,一个topic的数据可以被多个Consumer接收处理。

这图中大概画了几个组件的样子,简单的说他们之间的关系:一个Broker是一个Kafka进程,一个Broker有多个Topic,一个Topic可能有多个分区的。

02

Kafka如何存储数据?

我们知道Kafka是基于磁盘持久化存储的高可靠的消息系统。每次往一个Topic写入一条消息,就会定位到一个Partition上,相当于是写到磁盘上的一个日志文件,并且将消息追加写入到日志文件中。

消息会被封装到一个log entry,每一个日志条目都包含一个offset,消息大小和消息内容。offset是有序的,代表了在日志文件中的顺序,是唯一标记此消息的标识。Kafka是基于NIO的ByteBuffer来进行序列化成二进制进行存储,这样子也是最大化的保证存储的紧凑,节省磁盘的空间。

而Kafka的消息结构设计也随着版本的升级,有很多变化,正是因为对消息结构的优良设计,从而做到了存储紧凑,节省磁盘的存储空间。消息的格式是这样子滴:

消息格式设计的演变,也可以看出,通过引入RecordBatch,加上字段可变长度的消息体来节省磁盘空间,提高序列化的速度。V2版本里面时间戳增量,offset的增量也通过使用增量差值来节省存储的字节数。

上面也说了,每次消息发送到kafka,就会根据一定规则路由到某个Partition,并追加到磁盘的某个人日志文件的偏移量为offset的位置。

可以从图中看出,每一个Topic都是分散存储的,也就是多个Partition,在分布式集群部署下,TB级别数据实现扩容存储,分布式存储。

03

Kafka扑街了,如何保证高可用?

此时,如果kafka宕机了,从我们前面一直分析的来说,那我们将会丢失一个Topic下的某个Partition里的数据,这个问题就很严重了,数据丢失一向是架构设计里很重视的一个问题。所以Kafka是对所有的Partition做了多副本冗余的。

并且,将每个Partition的副本都是放到其他机器上,假设一个Partition有三个副本,kafka还会借助zookeeper选举出一个leader Partition,这个leader partition就是这个partition负责对外提供读写的服务。其他的follower partition 会定时同步数据。

假设此时leader partition宕机了,zookeeper会感知到,并且会在kafka集群选举出新的leader partition提供服务,新的leader partition拥有之前同步到的所有数据,通过这样的多副本冗余机制加上主从模式,宕机选主,就可以实现高可用啦。

04

kafka如何做到数据不丢失?

通过多副本冗余机制,我们可以实现高可用性,但是细思一番,上文中有这样一种场景,假如leader所在进程宕机了,此时数据还没有被follower同步,那么当follower选举成leader之后,此处就会丢失部分没有同步到的数据,这样子真是蛋疼了。

这里我们关注一个新的名字 ISR (in sync replicas),副本同步队列。每一个leader都维护一份ISR列表,列表中存放的是当前所有和leader partition 数据同步,保持一致的follower partition。

kafka要保证数据不丢失,那么每一个leader的ISR列表中必须至少要存在一个follower partition,那么当kafka写入数据的时候,必须是确保复制给了所有的ISR列表中的所有的follower partition,这样才能算写入成功。由此,就能保证数据不会在重新选主的时候丢失部分数据。

05

还有很多很多要去研究

Kafka是一款很优秀,很值得学习的工业级消息中间件,本文只是浅谈了他的一些基础概念和原理,还需要花费很多时间去研读他,文中有出现错误,欢迎小伙伴指正。谢谢大家。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逆熵架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档