一篇文章了解Kafka

一、Kafka是什么/Kafka是一个分布式的基于发布/订阅模式消息队列

先看第一个关键词:消息队列

(1)消息队列是什么

消息队列我们可以简单理解为:把要传输的数据放在队列中。

把数据放到消息队列叫做生产者,从消息队列里边取数据叫做消费者

(2)如果不使用消息队列会怎么样

数据直接写入数据库,之后将接收到的响应发送给用户。这样在高并发的情况下,会对数据库造成巨大的压力,响应也会延迟,如果连接多个数据库/系统,那么某个数据库/系统出故障会影响到整体,比如一个系统挂掉后,消息生产者要考虑是否需要重新将数据传输。

(3)使用消息队列有哪些优点

①削峰:消息会在一个时间点达到峰值,在不使用消息队列的情况下,用户直接发送请求,数据直接写入数据库,之后将接收到的响应发送给用户。这样在高并发的情况下,会对数据库造成巨大的压力,响应也会延迟。如果为了解决响应延迟等问题,以峰值来配置资源,就会有造成平时资源浪费。使用消息队列能够使缓冲突发的访问压力,解决响应延迟的问题,也不会资源浪费。

②降低了进程间的耦合,允许我们独立的扩展或修改队列两边的处理过程

③异步:同时允许用户把一个消息放入队列,但并不立即处理它,解决生产消息和消费消息的处理速度不一致的情况。

④可恢复性:即使一个处理消息的系统挂掉,加入队列中的消息仍然可以在系统恢复后被处理,提高了可恢复性

第二个关键词:发布订阅/模式

(1)消息队列有两种模式:点对点模式和发布/订阅模式(kafka采用的就是这一种)

(2)点对点模式:这种模式是消费主动拉取数据,但对一个消息而言,只有一个消费者可以消费,因为消息收到后会删除消息

(3)发布/订阅模式:生产者发布消息,同时有多个消费者(订阅)消息。当你发布一个消息,所有订阅者都能得到这个消息的

第三个关键词:分布式

kafka是一个消息队列但与传统的消息队列还是有所区别的

(1).Kafka持久化日志,这些日志可以被重复读取和无限期保留

(2).Kafka是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据提升容错能力和高可用性

(3)Kafka的特点是高吞吐量极高,主要应用于大数据实时处理领域

二、kafka的架构

 (1)组成部分

kafka架构由zookeeper,producer(生产者),consumer(group)(消费者),kafka集群组成

(2)kafka集群

①broker:一个kafka集群由多个broker组成,一台kafka服务器就是一个broker

②Topic:Topic 适用于存储消息的逻辑概念,1个Topic,可以看做是消息的集合。

这个消息的集合(Topic),可以接收多个生产者(Producer)推送(Push)过来的消息,也可以让多个消费者(Consumer)从中消费(Pull)消息。

为了实现扩展性,一个非常大的 topic 可以分布到多个broker(即服务器)上

③partition:一个 topic 可以分为多个 partition

多个partition的好处在于,一方面能够对broker上的数据进行分片有效减少消息的容量从而提升io性能。另一方面,为了提高消费端的消费能力,一般会通过多个consumer 去消费同一个topic,也就是消费端的负载均衡机制

每个 partition 是一个有序的队列,保证顺序消费,不同partition之间不能保证顺序

副本机制:为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且kafka 仍然能够继续工作,kafka 提供了副本机制,kafka的replica包含leader与follower。

生产者发送数据和消费者消费消息的对象都是每个分区多个副本的leader

每个分区follower,实时从 leader 中同步数据,保持和 leader 数据的同步。

一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。Replica的个数小于等于Broker的个数,也就是说,对于每个Partition而言,每个Broker上最多只会有一个Replica

所有Partition的Replica默认情况会均匀分布到所有Broker上。

⑤那leader怎么判断follower对leader数据同步的进度呢

所有Replica都向Leader发送ACK时,leader才commit

什么是ACK

对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失, 所以没必要等ISR 中的 follower 全部接收成功。

所以 Kafka 为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡, 选择以下的配置。

0:生产者不会等待broker的ack,这个延迟最低但是存储的保证最弱当server挂掉的时候就会丢数据。

1:服务端会等待ack值leader副本确认接收到消息后发送ack但是如果leader挂掉后他不确保是否复制完成新leader也会导致数据丢失。

-1(all):服务端会等所有的follower的副本受到数据后才会受到leader发出的ack,这样数据不会丢失。

ISR机制:这时候如果一个follower迟迟不能同步数据,ack无法发送,为了解决这个问题

kafka采用ISR机制

ISR是所有与leader副本保持一定程度同步的副本(包括Leader)的一个集合,

当follower副本落后太多或者失效时,leader会把它从ISR集合中剔除,

Leader 发生故障之后,就会从 ISR 中选举新的 leader。

(3)producer

 ①写入流程(如图)

②消息传到哪一个分区

  1. partition在写入的时候可以指定需要写入的partition,如果有指定,则写入对应的partition。
  2. 如果没有指定partition,但是设置了数据的key,则会根据key的值hash出一个partition。
  3. 如果既没指定partition,又没有设置key,则会轮询选出一个partition。

(4)consumer

consumer group:一个 consumer group 中有多个 consumer,一个分区只能被同一个消费组(ConsumerGroup)内的一个消费者消费。

offset:由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。kafka都会根据该topic下对于该consumer记录的offset,传递对应消息,
无指定的offset时,从头开始消费

③consumer消费哪一个分区

Kafka 有两种分配策略,一是 RoundRobin,一是Range。

Ⅰ:Range分配策略是面向每个主题的,首先会对同一个主题里面的分区按照序号进行排序,并把消费者线程按照字母顺序进行排序。然后用分区数除以消费者线程数量来判断每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。

Ⅱ:RoundRobin策略的原理是将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序,然后通过轮询算法逐个将分区以此分配给每个消费者。

如果同一消费组内,所有的消费者订阅的消息都是相同的,那么 RoundRobin 策略的分区分配会是均匀的。

如果同一消费者组内,所订阅的消息是不相同的,那么在执行分区分配的时候,就不是完全的轮询分配,有可能会导致分区分配的不均匀。如果某个消费者没有订阅消费组内的某个 topic,那么在分配分区的时候,此消费者将不会分配到这个 topic 的任何分区。

(5)Zookeeper

Kafka 集群中有一个 broker 会被选举为 Controller,负责管理集群 broker 的上下线,所有 topic 的分区副本分配leader 选举等工作。(获取ISR 选举新的leader 更新leader及isr),Controller 的管理工作都是依赖于 Zookeeper 的。

Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始, consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic  consumer_offsets

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值