初识kafka-数据存储篇1

目录

背景

[1 kafka总体体系结构](#1 kafka总体体系结构)

[2 疑问解答](#2 疑问解答)

[2.1 高吞吐低延迟](#2.1 高吞吐低延迟)

[2.2 实现分布式存储和数据读取](#2.2 实现分布式存储和数据读取)

[2.3 如何保证数据不丢失](#2.3 如何保证数据不丢失)


背景

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

1 kafka总体体系结构

  • 架构图

  • 名称解释

    |----------------|-----------------------------------------------------------------------------------------------------|
    | 名称 | 含义 |
    | Broker | 消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群,通俗说就是 每台机器上都运行一个Kafka的进程 |
    | Topic | 代表了逻辑上的一个数据集 |
    | Partition | 物理上的概念,一个topic可以分为多个partition ,说白就是数据 |
    | Controller | kafka集群的总控组件,负责管理整个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-0 | 00000000000009936472.index 00000000000009936472.log 00000000000009936472.timeindex | 每个分区里面就是很多的log segment file, 也就是日志段文件【有自己的索引文件】 |
| 机器2 | order-topic-1 | 00000000000019936472.index 00000000000019936472.log 00000000000019936472.timeindex | 每个分区里面就是很多的log segment file, 也就是日志段文件【有自己的索引文件】 |
| 机器3 | order-topic-2 | 00000000000029936472.index 00000000000029936472.log 00000000000029936472.timeindex | 每个分区里面就是很多的log segment file, 也就是日志段文件【有自己的索引文件】 |

    • 基于二分查找快速定位数据
      • 写入日志文件的时候,同时会写索引文件,就是.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机制的原理,下期在详讲

作者:老喵

相关推荐
懒洋洋的华3697 小时前
消息队列-Kafka(概念篇)
分布式·中间件·kafka
happycao12312 小时前
kafka之路-01从零搭建环境到SpringBoot集成
kafka
happycao12312 小时前
kafka 配置自定义序列化方式
kafka
happycao12312 小时前
kafka Partition使用详解
kafka
qingcyb17 小时前
下载Kafka 3.0.0教程
分布式·kafka
huisheng_qaq1 天前
【kafka-03】springboot整合kafka以及核心参数详解
spring boot·kafka·消息队列·topic·partition·kafka底层原理
晚枫20001 天前
kafka发送事件的几种方式
spring boot·分布式·docker·容器·kafka·intellij-idea·linq
小王是个弟弟1 天前
ClickHouse-Kafka Engine 正确的使用方式
clickhouse·kafka
happycao1231 天前
kafka 一步步探究消费者组与分区分配策略
中间件·kafka
qianer0_01 天前
php实现kafka
kafka·php·linq