美文网首页
kafka学习笔记(二)

kafka学习笔记(二)

作者: 那些年搬过的砖 | 来源:发表于2020-11-16 21:40 被阅读0次

一、基本概念

kafka中每条记录包含一个key,一个value和一个时间戳。

Topics

每个Topic,kafka都会维持一个分区日志,每个分区都是有序且不可变的记录集,分区中的每一个记录都有对应的id表示顺序,kafka中称之为offset。用于唯一的标识分区中的每一条记录。

kafka分区日志
kafka中增加或者减少消费者对已经存在的消费者消费数据是没有影响的,因为每一个消费者中唯一保存的元数据是offset。

分区

kafka中,每个分区都有一台server作为leader,其他为follwers,leader处理对分区的读写,follwers被动的从leader上同步数据。
每个分区内的记录是有序的,但并不保证主体中不同分区的顺序

消费者

一个消费者组是一个逻辑订阅者
1、如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.
2、如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.
3、kafka会将topic中的partion划分到每一个消费者实例上,确保每个实例都是分区唯一的消费者,有新的实例加入组或者有实例离开组时,都会动态的接管一些partion。

消费者组
kafka消费者正是基于以上特点,和传统的消息系统不同,kafka同时具备队列和发布-订阅的特性,同一个消费者组中,消费者实例处理消息记录后消息即被丢弃(offset偏移),这是kafka的队列特性,同时,消息可以广播分发给不同消费者组,这是kafka的发布-订阅特性。

kafka相比传统消息系统具备更严格的顺序保证

如下图所示,传统消息系统中,虽然服务器顺序的存储消息并顺序输出,但是消息异步到达消费者,因此在并行消费的情况下,无法保证消息的顺序性。

传统消息系统消费机制
kafka中,每个partion由一个消费者组中的一个消费者所消费,该消费者即为分区的唯一读者,并按顺序消费数据,因此可以保证消息的顺序性。但是消费者组中的消费者实例个数不能超过分区的数量
kafka分区消费机制

kafka集群的扩展

只需要分配新的brokerID并启动就可以加入到集群,但是新加入的broker是不会被分配任何数据分区,直到有新的topic创建。但是可以使用kafka-reassign-partitions.sh工具来重新分配partition

二、kafka的高可靠性

2.1 kafka的存储结构

一个topic可以分为多个partition,而一个partition又可分为多个segment(数据段)。第一个segment命名从0开始,后面每个segment名称为上一个segment最后一条消息的offset。


kafka存储结构

而每个segment由.index和.log和.timeindex文件组成


kafka-segment构成文件

index存储元数据,log存储消息, timeindex是kafka的时间日志。元数据指向log文件中message的偏移地址。对应关系如下图所示


元数据和日志文件的对应关系

2.2 副本同步机制

kafka每个partition都有一个leader和若干个follower, leader对外提供读写能力,follower会不断的向leader发送请求尝试拉取数据,拉取到的数据会写入到本地磁盘。关于副本的同步机制在之前一篇中已经介绍过。https://www.jianshu.com/p/d6bae5407d7f

2.3 kafka零拷贝机制

传统的四次拷贝机制
传统的四次拷贝

1、操作系统将数据从磁盘文件读取到内核空间
2、应用从内核空间读入到用户空间
3、应用程序将数据写入到内核空间,放入到socket缓冲区
4、操作系统将数据从socket缓冲区复制到网卡接口
四次拷贝伴随这四次上下文的切换

kafka零拷贝机制

kafka则借助操作系统的sendfile,直接将数据从一个fd传输到另一个fd.
1、网卡直接访问系统主内存,解放了CPU
2、不在需要内核态到用户态的文件拷贝和上线文切换


kafka零拷贝机制

2.4 kafka的三种消费模式

1、At most once 最多一次

第一步如果先提交offset,第二步再处理消息。如果②之前consumer宕机,则消息4不会被处理,这样就造成消息的丢失。


最多消费一次
2、At least once 最少一次

第一步如果先处理消息4,第二步再提交offset。如果②之前consumer宕机,则消息4下次会继续消费,这样就造成重复消费。


最少消费一次
3、Exactly once 精确一次

1、依赖业务来实现,即关闭offset自动提交,可以将offset作为关系型数据库的唯一索引,并将①和②放到一个事务中处理。消息处理成功同时提交offset的请求发送成功,提交事务。如果重复处理消息时,在数据库中有相同offset记录则不处理。
2、依赖kafka实现
Producer幂等性:设置enable.idempotent=true即开启Idempotent Producer机制,即使生产者多次发送,broder端也只会写入一次。不过0.11.0.0之前版本并不支持。
多分区的情况下,生产端还需要开启事务来保证多分区写入的原子性。
Consumer端仍然无法保证精确一次,还需要依赖业务逻辑,比如自行管理offset的提交(如通过数据库是管理)来实现精确消费一次。

相关文章

  • kafka学习系列

    Kafka学习总结(一)——Kafka简介 Kafka学习总结(二)——Kafka设计原理 Kafka学习总结(三...

  • Kafka学习笔记(二)

    Kafka环境搭建 准备工作 Kafka集群是把状态保存在Zookeeper中的,首先要搭建Zookeeper集群...

  • kafka学习笔记(二)

    一、基本概念 kafka中每条记录包含一个key,一个value和一个时间戳。 Topics 每个Topic,ka...

  • Kafka学习笔记(二) :初探Kafka

    看完上一篇,相信大家对消息系统以及Kafka的整体构成都有了初步了解,学习一个东西最好的办法,就是去使用它,今天就...

  • Kafka学习笔记二:Flume+Kafka安装

    Flume介绍 Flume是流式日志采集工具,FLume提供对数据进行简单处理并且写到各种数据接收方(可定制)的能...

  • sptest

    # Spring Kafka 学习笔记 ## 1 接收消息 接收消息需要提供MessageListenerCont...

  • Kafka学习笔记(二)架构深入

    1. Kafka工作流程及文件存储机制 Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,...

  • kafka学习笔记-kafka基础

    参考:极客时间-Kafka核心技术与实战 kafka术语 消息(Record):kafka要处理的主要对象。 主题...

  • spark 学习笔记

    Spark学习笔记 Data Source->Kafka->Spark Streaming->Parquet->S...

  • kafka学习笔记

    1、kafka 简介 kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理百万级QPS(每秒访问次数)的动...

网友评论

      本文标题:kafka学习笔记(二)

      本文链接:https://www.haomeiwen.com/subject/ixgzbktx.html