Kafka学习记录

一、基本概念

Kafka官方介绍:Kafka是一个分布式的流处理平台(0.10.x版本),在kafka0.8.x版本的时候,kafka主要是作为一个 分布式的、可分区的、具有副本数 的日志服务系统(Kafka™ is a  distributed partitioned replicated  commit log service), 具有 高水平扩展性、高容错性、访问速度快、分布式 等特性;主要应用场景是: 日志收集系统和消息系统

  1. 数据在Kafka上的分布简单描述图:

  1. 生产消费过程:




  1. 各模块定义:
Message (消息):
传递的数据对象,主要由四部分构成:offset(偏移量)、key、value、timestamp(插入时间); 其中offset和timestamp在kafka集群中产生,key/value在producer发送数据的时候产生。
消息只保证在同一个Partition中有序。
Broker (代理者):
Kafka集群中的每一个机器/服务被成为broker, 是一个物理概念。
Topic (主题):
维护Kafka上的消息类型被称为Topic,是一个 逻辑概念
Partition (分区):
具体维护Kafka上的消息数据的最小单位,一个Topic可以包含多个分区;Partition特性: ordered & immutable 。(在数据的产生和消费过程中,不需要关注数据具体存储的Partition在那个Broker上,只需要指定Topic即可,由Kafka负责将数据和对应的Partition关联上)
每个分区都由一系列有序的、不可变的消息组成,这些消息被连续的追加到分区中。分区中的每个消息都有一个连续的序列号叫做offset,用来在分区中唯一的标识这个消息
存储的数据是可配置存储时间的,在该配置时间段内,Kafka集群保留所有发布的数据,不管这些数据有没有被消费。Kafka的性能和数据量是无关的,所以保留太多的数据不是问题。
Partition对应逻辑上的Log。
实际上每个consumer唯一需要维护的数据是消息在日志中的位置,也就是offset.这个offset由consumer来维护,从zookeeper上读取:一般情况下随着consumer不断的读取消息,这offset的值不断增加,但其实consumer可以以任意的顺序读取消息,比如它可以将offset设置成为一个旧的值来重读之前的消息。

将日志分区可以达到以下目的:首先这使得每个日志的数量不会太大,可以在单个服务上保存。另外每个分区可以单独发布和消费,为并发操作topic提供了一种可能。
以上特点的结合,使Kafka consumers非常的轻量级:它们可以在不对集群和其他consumer造成影响的情况下读取消息。你可以使用命令行来"tail"消息而不会对其他正在消费消息的consumer造成影响。
Replication (副本):
  • Topic可以(应该)维护多个副本。
  • 副本的单元是Partition。
  • 每个Partition在Topic中有一个或者多个副本。
  • 副本可以与zookeeper通信。
  • 副本Partition形成的组称为 ISR(In-Sync-Replicas)


Producer (生产者):
负责将数据发送到Kafka对应Topic的进程
Consumer (消费者):
  • 负责从对应Topic获取数据的进程.
  • 发布消息通常有两种模式:队列模式(queuing)和发布-订阅模式(publish-subscribe)。队列模式中,consumers可以同时从服务端读取消息,每个消息只被其中一个consumer读到;发布-订阅模式中,消息被广播到所有的consumer中。
  • 多个消费者可以读取同一个Topic。

Consumer Group (消费者组):
每个consumer都属于一个特定的group组,一个group组可以包含多个consumer,但一个组中只会有一个consumer消费数据。
Consumers可以加入一个consumer 组,共同竞争一个topic,topic中的消息将被分发到组中的一个成员中。同一组中的consumer可以在不同的程序中,也可以在不同的机器上。如果所有的consumer都在一个组中,这就成为了传统的队列模式,在各consumer中实现负载均衡。
如果所有的consumer都不在不同的组中,这就成为了发布-订阅模式,所有的消息都被分发到所有的consumer中。更常见的是,每个topic都有若干数量的consumer组,每个组都是一个逻辑上的“订阅者”,为了容错和更好的稳定性,每个组由若干consumer组成。这其实就是一个发布-订阅模式,只不过订阅者是个组而不是单个consumer。

由两个机器组成的集群拥有4个分区 (P0-P3) 2个consumer组. A组有两个consumerB组有4个

传统的队列,消息在服务器上保存有序的消息,如果多个Consumer从这个服务器消费,服务器会按照顺序向消费者提供消息,但是消息被异步分发到各个Consumer上就失去了原来的顺序。当然我们可以同一时间只允许一个消费者消费可以的到顺序的消息,但这就意味着失去了并发性。
相对于传统队列,Kafka将每个Partition只分发给一个Consumer Group,该组就可以顺序消费这个分区的消息。当然因为有多个分区,依然可以在多个consumer组之间进行负载均衡。
注意:
在Partition角度:一个Partition可以被不同Consumer group消费,但是对于同一个group,Consumer的数量不能大于Partition的数量。
原因请参考下面链接:

Consumer Group的应用场景:
点对点
将所有消费者放到一个Consumer Group
广播
将每个消费者单独放到一个Consumer Group
水平扩展
向Consumer Group中添加消费者并进行Rebalance
故障转移
当某个Consumer发生故障时,Consumer Group重新分配分区
分布式:
每个分区(Partition)在Kafka集群的若干服务中都有副本,这样这些持有副本的服务可以共同处理数据和请求,副本数量是可以配置的。副本使Kafka具备了容错能力。
每个分区都由一个服务器作为“leader”,零或若干服务器作为“Replication ”,leader负责处理消息的读和写,Replication 则去复制leader.如果leader down了,Replication 中的一台则会自动成为leader。集群中的每个服务都会同时扮演两个角色:作为它所持有的一部分分区的leader,同时作为其他分区的Replication ,这样集群就会据有较好的负载均衡。

kafka durability 可靠性
Producer配置中可以配置可靠性 request.required.acks

0 : The producer never waits for an ack 不需要等待响应
1 : The producer gets an ack after the leader replica has received the data (当leader收到数据时响应)
-1 : The producer gets an ack after all ISRs receive the data(所有副本都主从同步完成)
Minimum available ISR can also be configured such that an error is returned if enough replicas are not available to replicate data
所以,kafka可以选择不同的durability来换取不同的吞吐量


通用,kafka可以通过增加更多的Broker来提升吞吐量
一个推荐的配置:



二、Kafka设计原理


  • Partition 
topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。 
在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1 

 
每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。 
每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。 
这样做的好处就是能快速删除无用文件,有效提高磁盘利用率。
  • segment file
  • segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件、数据文件.
  • segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。

 
其中 .index 索引文件存储大量元数据, .log 数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。他们两个是一一对应的,对应关系如下 

  • Message 
segment data file由许多message组成,message物理结构如下 


参数说明:


三、Kafka&RabbitMQ&RocketMQ对比



本文参考以下博客,大体内容为转载,同时按照自己需求和理解进行了一定的修改和糅合:

https://blog.csdn.net/imgxr/article/details/80130878

api使用参考:

https://blog.csdn.net/isea533/article/details/73822881

官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值