kafka学习笔记(二)(上)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: kafka学习笔记(二)

一、基本概念


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


Topics


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


image.png

kafka分区日志


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


分区


kafka中,每个分区都有一台server作为leader,其他为follwers,leader处理对分区的读写,follwers被动的从leader上同步数据。


每个分区内的记录是有序的,但并不保证主体中不同分区的顺序


消费者


一个消费者组是一个逻辑订阅者


1、如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.


2、如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.


3、kafka会将topic中的partion划分到每一个消费者实例上,确保每个实例都是分区唯一的消费者,有新的实例加入组或者有实例离开组时,都会动态的接管一些partion。


image.png

消费者组


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


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


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


image.png

传统消息系统消费机制


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


image.png

kafka分区消费机制


如果某主题对顺序有强一致性,可以通过kafka的该特性将该主题的数据写入到指定的partion中(我们可通过props.put("partitioner.class","***")指定分区策略),可以通过实现Partitioner接口来自定义我们的分区策略,如果是spring-cloud-stream,可通过下面方式指定分区策略,具体可参考spring-cloud-stream官网说明

@InboundChannelAdapter(channel = Source.OUTPUT, poller = @Poller(fixedRate = "5000"))
    public Message<?> generate() {
        String value = data[RANDOM.nextInt(data.length)];
        System.out.println("Sending: " + value);
        return MessageBuilder.withPayload(value)
                .setHeader("partitionKey", value)
                .build();


kafka集群的扩展


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


二、kafka的高可靠性


2.1 kafka的存储结构


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


image.png

kafka存储结构


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


image.png

kafka-segment构成文件


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


image.png

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


相关文章
|
消息中间件 数据采集 域名解析
数据采集-Lua集成kafka流程跑通|学习笔记
快速学习数据采集-Lua集成kafka流程跑通
数据采集-Lua集成kafka流程跑通|学习笔记
|
7月前
|
消息中间件 存储 分布式计算
Hadoop学习笔记(HDP)-Part.19 安装Kafka
01 关于HDP 02 核心组件原理 03 资源规划 04 基础环境配置 05 Yum源配置 06 安装OracleJDK 07 安装MySQL 08 部署Ambari集群 09 安装OpenLDAP 10 创建集群 11 安装Kerberos 12 安装HDFS 13 安装Ranger 14 安装YARN+MR 15 安装HIVE 16 安装HBase 17 安装Spark2 18 安装Flink 19 安装Kafka 20 安装Flume
187 0
Hadoop学习笔记(HDP)-Part.19 安装Kafka
|
消息中间件 Kafka 调度
Kafka 消费者案例 | 学习笔记
快速学习 Kafka 消费者案例
176 0
Kafka 消费者案例  |  学习笔记
|
消息中间件 负载均衡 Kafka
Kafka 生产者案例 | 学习笔记
快速学习 Kafka 生产者案例
137 0
Kafka 生产者案例  |  学习笔记
|
消息中间件 存储 弹性计算
消息队列 kafka 销售指南| 学习笔记
快速学习消息队列 kafka 销售指南
消息队列 kafka 销售指南| 学习笔记
|
消息中间件 弹性计算 分布式计算
Kafka 数据如何同步到 MaxCompute | 学习笔记
快速学习 Kafka 数据如何同步到 MaxCompute,介绍了 Kafka 数据如何同步到 MaxCompute系统机制, 以及在实际应用过程中如何使用。
Kafka 数据如何同步到 MaxCompute | 学习笔记
|
消息中间件 分布式计算 大数据
Structured_Source_Kafka_整合 | 学习笔记
快速学习 Structured_Source_Kafka_整合
Structured_Source_Kafka_整合 | 学习笔记
|
消息中间件 JSON 大数据
Structured_Source_Kafka_回顾 | 学习笔记
快速学习 Structured_Source_Kafka_回顾
Structured_Source_Kafka_回顾 | 学习笔记
|
消息中间件 分布式计算 Hadoop
Structured_Sink_Kafka | 学习笔记
快速学习 Structured_Sink_Kafka
Structured_Sink_Kafka | 学习笔记
|
消息中间件 JSON 分布式计算
Structred_Source_Kafka_需求 | 学习笔记
快速学习 Structred_Source_Kafka_需求
Structred_Source_Kafka_需求 | 学习笔记