kafka内部结构笔记

集群架构

搭建一套测试集群,共三个节点,每个节点上面都有procuder/broker/consumer角色。没有WebUI页面,架构如下:

kafka架构

在系统架构中,将消息系统独立可起到架构解耦、易扩展、灵活性强、可恢复、数据冗余、异步通讯等优点。

kafka是分布式消息系统软件,实现了消息发布/订阅功能。还有一些其他的消息队列软件,比如RabbitMQ、Redis、ZeroMQ、ActiveMQ、RocketMQ等。这些消息系统各有优缺点。

kafka的优点如下:

  • 时间复杂度为O(1);性能与数据量多少无关;
  • 高吞吐,100k条/s;
  • 消息分区
  • 分布式消费。
  • Scale out。

组件

producers(生产组件,消息来源)

producers是消息来源,提供消息写入接口,与zookeeper来实现数据的写入均衡。具体的写入过程见。

与producers有关的内容有:

  • 写入流程;
  • 如何实现均衡写入;
  • 修改topic的分布;
  • 维护存储的

producers和borders的数据写入方式是push。

consumers(消费组件,消息流出)

consumers是消息系统的流出接口,多个consumers逻辑上组成consumer Group。CG的目标是实现同一需求的消费吞吐量。

同一个topic的message,只能被同一CG的一个Consumer消费;但可以被不同多个CG消费;

比如上图中,一条message被CG中的的C161消费,或者被C163消费,但不能同时被C161和C163消费。因为同一CG在zk中维护共同维护对一个topic的消费pos。

与consumers相关的内容有:

  • topic实现广播与单播。
  • 消费的负载均衡。
  • message的消费实现。

brokers(消息管理,存储/删除/)

brokers的物理结构

图片备注:

  • 一共三个broker,存储了不同的topic;
  • 以topic1为例,topic1有多个partitions,图中黄色部分为partition1-4,存储在不同的brokers上,这些是partition的Leader;
  • 灰色的topic1:partition1-4,作为partition的replica,图中我们的的副本数为2,在server.properity配置文件中由参数offsets.topic.replication.factor控制;
  • topic1:partition3有一个segments,由一个offset.index和offset.log组成。
  • offset.log有多个message顺序写入,命名是起始message的offset。

brokers的存储内容归纳如下:

  • broker——>topics——>partitions——>segments(index and logs)
  • 一个broker上存储不同的topic;
  • topic是逻辑结构,相当于query,不同的topic由多个连续的partition组成,每个partition对应一个物理文件夹;
  • kafka实现replica的单元是partitions,由参数offsets.topic.replication.factor控制,默认是3,Leader提供读写,由zk配合进行Leader的选举,选举过程见;
  • 每个partition由多个segments组成(index和log),命名为起始message的offset;

需要了解

  • 信息存储,message的存储格式,
  • Replica的数据同步
  • Leader选举
  • HA方案与故障恢复
  • 过期数据清理

组件

zookeepers(负责选举,均衡,meta记录,消费记录)

zookeeper在集群中与broker和consumer进行交互,维护数据和集群高可用。

  • 记录consumer消费message的位置信息;
  • partitions故障时进行Leader Election
  • kafka的meta信息在zookeeper如何存储

kafka在zookeeper的结构图如下:

三级目录是一些组件:

  • consumers consumers的信息,记录对partition访问偏移量,由consumer自己维护,目录/sohudba_kafka/consumers/[consumer]/offsets/[topic]/[partition]
  • broders  维护broders的信息,包含borders下的partition,每个partition的ISR,当前leader,目录结构比较复杂,我们后面细说;
  • producers  producers的信息,当前zookeeper未记录任何信息
  • admin  admin维护删掉的topic,partition的重新分配(过后删除),partition选举Leader(过后删除)
  • config
  • controlers  增删topic/重新分配replica/RPC通知其他broker
  • controler_epoch 
  • isr_change_notifications

信息存储

message结构

zookeeper对各节点的数据存储

borker数据存储目录:/borker/topics/[topic]/partitions/[partition]/state

state数据结构:

{"controller_epoch":5,           ##表示kafka集群中的中央控制器选举次数
"leader":1,                      ##当前partition的leader所在的borker id
"version":1,                     ##版本编号默认为1
"leader_epoch":6,                ##leader选举次数
"isr":[2,1,3]                    ##当前partition的In-sync replica,副本组的borker id列表
}

borker数据存储示例:

{"version":1,
"partitions":{
        "45":[2,1,3],
        "34":[3,2,1],
        "12":[2,3,1],
        "8":[1,2,3],
        "19":[3,1,2],
        "23":[1,3,2],
        "4":[3,2,1],
        "40":[3,2,1],
        "15":[2,1,3],
        "11":[1,3,2],
        "9":[2,1,3],
        "44":[1,2,3],
        "33":[2,1,3],
        "22":[3,2,1],
        "26":[1,2,3],
        "37":[3,1,2],
        "13":[3,1,2],
        "46":[3,2,1],
        "24":[2,3,1],
        "35":[1,3,2],
        "16":[3,2,1],
        "5":[1,3,2],
        "10":[3,2,1],
        "48":[2,3,1],
        "21":[2,1,3],
        "43":[3,1,2],
        "32":[1,2,3],
        "49":[3,1,2],
        "6":[2,3,1],
        "36":[2,3,1],
        "1":[3,1,2],
        "39":[2,1,3],
        "17":[1,3,2],
        "25":[3,1,2],
        "14":[1,2,3],
        "47":[1,3,2],
        "31":[3,1,2],
        "42":[2,3,1],
        "0":[2,3,1],
        "20":[1,2,3],
        "27":[2,1,3],
        "2":[1,2,3],
        "38":[1,2,3],
        "18":[2,3,1],
        "30":[2,3,1],
        "7":[3,1,2],
        "29":[1,3,2],
        "41":[1,3,2],
        "3":[2,1,3],
        "28":[3,2,1]
        }
}

数据操作

为避免broker挂后造成数据丢失,kafka实现了高可用方式。

  • 基于partition实现Replica。并与zookeeper配合实现Leader的选举。
  • 通过算法,将partition的Leader与Fellowers分散于不同的broker。

replica实现

在“brokers的物理结构”中,replication有多个follewers,分散于不同的brokers。通过增量日志实现。

partition的log记录是顺序的,通过server.properties中log.retention.hours参数定义日志保留时长,过期则删除。新写入的message append记录在partition中。

为提升效率,

  • follewers会在message未写入log时,读到message则将ACK发送给Leader,因此只能保证存在Replica,不能保证数据一定持久化了。
  • 批量复制

ISR是In-Sync Replicate 记录与Leader保持同步的列表。

Leader Election

判断Replica活着,(1)与zk有心跳通讯;(2)与Leader通讯及时。两者有一不满足,fellower都会从ISR中移除。

选举算法

一般的leader选举算法,有Majority Vote/Zab/Raft/PacificA。kafka采用的即PacificA,kafka维护多个ISR,但不不像Majorty Vote算法,限制最少的2N+1节点和N+1以上投票。

即使只有1个follewer,也可完成Leader选举。

选举过程

时间: 2025-01-14 14:16:25

kafka内部结构笔记的相关文章

Kafka 学习笔记之 Producer/Consumer (Scala)

既然Kafka使用Scala写的,最近也在慢慢学习Scala的语法,虽然还比较生疏,但是还是想尝试下用Scala实现Producer和Consumer,并且用HashPartitioner实现消息根据key路由到指定的partition. Producer: import java.util.Properties import kafka.producer.ProducerConfig import kafka.producer.Producer import kafka.producer.Ke

Kafka 学习笔记之 Consumer API

Kafka提供了两种Consumer API High Level Consumer API Low Level Consumer API(Kafka诡异的称之为Simple Consumer API,实际上非常复杂) 1. High Level Consumer API概述 High Level Consumer API围绕着Consumer Group这个逻辑概念展开,它屏蔽了每个Topic的每个Partition的Offset管理(自动读取zookeeper中该Consumer group

Kafka学习笔记

Apache Kafka 一.消息队列分类 1.1 点对点 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并消费消息 注意:   1.消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息   2.Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费 1.2 发布/订阅 消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息.和点对点方式不同,发布到topic的消息会被所有订阅者消费 二.消息队

kafka学习笔记:知识点整理(一)

一.kafka 架构 1.1 拓扑结构 如下图: 图.1 1.2 相关概念 如图.1中,kafka 相关名词解释如下: 1.producer:  消息生产者,发布消息到 kafka 集群的终端或服务. 2.broker:  kafka 集群中包含的服务器. 3.topic:  每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的. 4.partition:  partition 是物理上的概念,每个 topic 包含一个或多个 partition.kafka 分配

Kafka学习笔记-Java简单操作

Maven依赖包: [plain] view plain copy <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.8.2.1</version> </dependency> <dependency> <groupId>org.apache

Kafka学习笔记(一):概念介绍

Kafka是一个开源的,分布式的,高吞吐量的消息系统.随着Kafka的版本迭代,日趋成熟.大家对它的使用也逐步从日志系统衍生到其他关键业务领域.特别是其超高吞吐量的特性,在互联网领域,使用越来越广泛,生态系统也越来的完善.同时,其设计思路也是其他消息中间件重要的设计参考. Kafka原先的开发初衷是构建一个处理海量日志的框架,基于高吞吐量为第一原则,所以它对消息的可靠性以及消息的持久化机制考虑的并不是特别的完善.0.8版本后,陆续加入了一些复制.应答和故障转移等相关机制以后,才可以让我们在其他关

kafka学习笔记:知识点整理(二)

三.kafka HA 3.1 replication 如图.1所示,同一个 partition 可能会有多个 replica(对应 server.properties 配置中的 default.replication.factor=N).没有 replica 的情况下,一旦 broker 宕机,其上所有 patition 的数据都不可被消费,同时 producer 也不能再将数据存于其上的 patition.引入replication 之后,同一个 partition 可能会有多个 replic

kafka学习笔记:知识点整理

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.

[Big Data - Kafka] kafka学习笔记:知识点整理

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.