一、Kafka基本概念
Kafka是由LinkedIn开发的一个分布式基于发布/订阅的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。
Kafka遵循了一种大部分消息系统共同的传统的设计:producer将消息推送到broker,consumer从broker拉取消息。
特点:
(1)高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
(2)可扩展性:kafka集群支持热扩展
(3)持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
(4)容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
(5)高并发:支持数千个客户端同时读写
缺点:
(1)由于是批量发送,数据并非真正的实时;
(2)对于mqtt协议不支持;
(3)不支持物联网传感数据直接接入;
(4)仅支持统一分区内消息有序,无法实现全局消息有序;
(5)监控不完善,需要安装插件;
(6)依赖zookeeper进行元数据管理;
使用场景:
(1)收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、HBase、Solr等。
(2)消息系统:解耦和生产者和消费者、缓存消息等。
(3)用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
(4)运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
(5)流式处理:比如spark streaming和 Flink
二、Kafka结构

Broker:
一个Borker就是Kafka集群中的一个实例,或者说是一个服务单元。连接到同一个zookeeper的多个broker实例组成kafka的集群,一般只有一个leader,其余为follwer。
Consumer Group:
同一个group的consumer可以并行消费同一个topic的消息,但是同group的consumer,不会重复消费。
Topic:
kafka中消息订阅和发送都是基于某个topic。Topic就像一个特定主题的收件箱,producer往里丢,consumer取走。
三、kafka核心概念
kafka采用分区(Partition)的方式,使得消费者能够做到并行消费,从而大大提高了自己的吞吐能力。同时为了实现高可用,每个分区又有若干份副本(Replica),这样在某个broker挂掉的情况下,数据不会丢失。
1.分区(Partition)

无分区时,一个topic只有一个消费者在消费这个消息队列。采用分区后,如果有两个分区,最多两个消费者同时消费,消费的速度肯定会更快。如果觉得不够快,可以加到四个分区,让四个消费者并行消费。分区的设计大大的提升了kafka的吞吐量!!
备注:
(1)一个partition只能被同组的一个consumer消费
(2)同一个组里的一个consumer可以消费多个partition
(3)消费效率最高的情况是partition和consumer数量相同。这样确保每个consumer专职负责一个partition。
2.副本(Replica)
在kafka中,正本和副本都称之为副本(Repalica),但存在leader和follower之分。活跃的称之为leader,其他的是follower。
每个分区的数据都会有多份副本,以此来保证Kafka的高可用。
Topic、partition、replica的关系如下图:

topic下会划分多个分区(partition),每个分区(partition)都有自己的副本(replica),其中只有一个是leader 副本(replica),其余的是follower 副本(replica)。
由此可见,leader replica做了大量的工作。所以如果不同partition的leader replica在kafka集群的broker上分布不均匀,就会造成负载不均衡。
kafka通过轮询算法保证leader replica是均匀分布在多个broker上。
(1)Replica均匀分配在Broker上,同一个partition的replica不会在同一个borker上
(2)同一个partition的Replica数量不能多于broker数量。多个replica为了数据安全,一台server存多个replica没有意义。server挂掉,上面的副本都要挂掉。
(3)分区的leader replica均衡分布在broker上。此时集群的负载是均衡的。这就叫做分区平衡
备注:
1.分区平衡
基本概念:
(1)AR: assigned replicas,已分配的副本。每个partition都有自己的AR列表,里面存储着这个partition最初分配的所有replica。注意AR列表不会变化,除非增加分区。
(2)PR(优先replica):AR列表中的第一个replica就是优先replica,而且永远是优先replica。最初,优先replica和leader replica是同一个replica。
(3)ISR:in sync replicas,同步副本。每个partition都有自己的ISR列表。ISR是会根据同步情况动态变化的。
最初ISR列表和AR列表是一致的,但由于某个节点死掉,或者某个节点的follower replica落后leader replica太多,那么该节点就会被从ISR列表中移除。此时,ISR和AR就不再一致

如果Replica 0副本挂了,他会重新选举一个副本当该分区leader,但还保持优先副本。当Replica 0回来了,因为其为优先副本,所以会重新变为Leader。
2.Partition的读和写
写的时候:采用round-robin算法,轮询往每个partition写入。
读的时候:
(1)每个consumer都维护一个offset值,指向的是它所消费到的消息坐标。同一个consumer group组内可以消费同一个topic中不同分区。
每个consumer维护的唯一元数据是offset,代表消费的位置,一般线性向后移动。
consumer也可以重置offset到之前的位置,可以以任何顺序消费,不一定线性后移。
(2)同一个消息可能会被不同的consumer group消费。
(3)每个partition都是有序的不可变的。
(4)Kafka可以保证partition的消费顺序,但不能保证topic消费顺序。
更多内容:
本文介绍了Kafka的基本概念,探讨了其高吞吐量、低延迟、可扩展性等特点,并详细解析了Kafka的架构组成及其核心概念,如Broker、ConsumerGroup、Topic等。
1万+

被折叠的 条评论
为什么被折叠?



