问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Kafka消息存储机制:大数据时代的必备技能

创作时间:
作者:
@小白创作中心

Kafka消息存储机制:大数据时代的必备技能

引用
CSDN
12
来源
1.
https://blog.csdn.net/Mrxiao_bo/article/details/136545326
2.
https://blog.csdn.net/liu_feng_zi_/article/details/123207695
3.
https://blog.csdn.net/weixin_38750084/article/details/83037938
4.
https://ost.51cto.com/posts/11167
5.
https://cloud.baidu.com/article/3198005
6.
https://blog.csdn.net/shufangreal/article/details/111869058
7.
https://blog.csdn.net/chenshun123/article/details/125248390
8.
https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html
9.
https://www.cnblogs.com/rickiyang/p/14649750.html
10.
https://developer.aliyun.com/article/1479593
11.
https://www.cnblogs.com/expiator/p/17955578
12.
https://www.cnblogs.com/wenBlog/p/15939192.html

在大数据时代,Apache Kafka作为分布式流处理平台,在系统或应用程序之间传递消息方面发挥着重要作用。本文深入探讨了Kafka的消息存储机制,揭示了数据是如何被持久化并保证高效访问的。了解这些核心概念和技术细节,对于从事大数据领域工作的工程师来说是必不可少的技能。

01

Kafka的基本概念

Kafka是一个分布式、分区的、多副本的、多订阅者,基于Zookeeper协调的分布式日志系统。它最初由LinkedIn公司开发,于2010年贡献给了Apache基金会,现已成为大数据处理领域的核心组件。Kafka常见用于Web/Nginx日志、访问日志、消息服务等场景。

在深入探讨存储机制之前,让我们先了解几个关键概念:

  • Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。
  • Topic:一类消息,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。
  • Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。
  • Segment:partition物理上由多个segment组成,每个segment是一个独立的日志文件。
  • Offset:每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息。
02

数据存储架构

在Kafka中,数据存储的基本单位是partition。每个topic可以有多个partition,每个partition对应一个目录。partition命名规则为topic名称+有序序号,第一个partition序号从0开始。

每个partition由多个segment组成,segment是实际存储数据的文件。这种设计的好处是能快速删除无用文件,有效提高磁盘利用率。segment文件的命名规则是:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。

03

消息存储机制

Kafka通过日志分段和索引机制实现高效存储。每个partition包含多个segment,每个segment又由两部分组成:index filedata file

  • Index File:存储大量元数据,用于快速定位消息的物理位置。
  • Data File:存储实际的消息数据。

这种设计使得Kafka能够快速定位和检索消息。索引文件中存储了每条消息的偏移量和物理位置,数据文件则按顺序存储消息内容。

04

数据持久化原理

Kafka通过以下机制保证数据的可靠性和持久性:

  1. 消息追加写入:当Producer发送消息到Kafka Broker时,这些消息首先被追加写入到一个称为日志文件的数据文件中。每个主题(Topic)的分区都有一个对应的日志文件。

  2. 顺序写入:消息的写入是顺序的,新的消息会被追加到已有的日志文件的末尾。这种顺序写入方式对于磁盘的性能是友好的,也确保了消息在磁盘上的存储是有序的。

  3. 分区日志文件:对于每个分区,Kafka维护一个或多个日志文件。每个日志文件中存储的消息都有一个唯一的偏移量,用于标识消息在分区中的位置。

  4. 日志滚动:随着时间的推移或者达到一定大小,日志文件会发生滚动(Roll),即新的消息开始写入到一个新的日志文件中。这确保了日志文件的大小是可控的。

此外,Kafka还支持消息复制机制。每个分区的消息可以有多个副本,它们分布在不同的Broker上。ISR(In-Sync Replica)机制确保了Leader和Follower之间的数据同步,保障了消息的持久性。

05

消息过期与删除策略

Kafka提供了灵活的消息过期和删除策略。管理员可以通过配置参数来控制数据的保留时间或大小。例如,可以通过以下命令创建一个Topic并设置消息过期时间为12天:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic my_topic --config retention.ms=1036800000

关键参数是retention.ms,它用于指定消息的保留时间(以毫秒为单位)。如果需要修改已存在的Topic的消息过期时间,可以使用以下命令:

./kafka-configs.sh --zookeeper localhost:2181 --alter --entity-name my_topic --entity-type topics --add-config retention.ms=1036800000

Kafka支持两种主要的清理策略:

  • 删除策略:直接删除过期消息。可以通过配置log.retention.hourslog.retention.bytes来控制数据保留时间或大小。
  • 压缩策略:只保留每个key的最新版本数据。适用于某些特殊场景,如用户资料更新等。

为了避免在删除时阻塞读操作,Kafka采用了copy-on-write形式的实现。删除操作进行时,读取操作的二分查找功能实际是在一个静态的快照副本上进行的,这类似于Java的CopyOnWriteArrayList。

06

最佳实践

为了充分发挥Kafka的性能和可靠性,建议遵循以下最佳实践:

  1. 合理设置Partition数量:根据业务需求和集群规模,合理分配partition数量,避免过多或过少。
  2. 优化Segment大小:通过调整log.segment.bytes参数,控制单个segment文件的大小,平衡读写性能和磁盘利用率。
  3. 定期检查和清理:通过log.retention.check.interval.ms参数,定期检查和清理过期数据,避免磁盘空间不足。
  4. 启用数据复制:通过设置合适的replication factor,提高数据的可靠性和容错能力。
07

总结与展望

Kafka凭借其高效的消息存储机制和灵活的数据管理策略,已经成为大数据处理领域的核心组件。通过深入理解其存储机制,我们可以更好地利用Kafka构建稳定、高效的数据处理系统。随着大数据技术的不断发展,Kafka必将在未来的数据处理领域发挥更加重要的作用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号