设为首页 加入收藏

TOP

kafka基本原理
2018-11-13 16:37:13 】 浏览:127
Tags:kafka 基本 原理

KAFKA

Kafka是一个分布式的、可分区、可复制的消息系统。

基本术语:

broker:一个kafka集群由一个或者多个broker组成;

topic:Kafka中用来维护的一类消息;

partition:每个topic包含多个分区,每一个分区都存在各个broker中,但是一个分区只选取一个broker作为主节点;

producer:生产并发送消息到Kafka topic中;

consumer:消息消费者;

consumer group:每个consumer属于一个特定的consumergroup,对于一个topic中的消息只能被同一个group下的一个consumer消费。

producer在网络上向kafka集群发送消息,集群讲消息提供给consumer,如下图所示:


topic

一个topic就是一类消息,每一个topic,kafka都会对其日志进行分区,如下图所示:

每个partition就是一个队列,其中消息是有序的,且不可变。新消息被连续追加写到partition中,partition中的每个消息都有一个连续的序号,叫做offset,用来唯一标识partition中的每条消息。

Kafka集群保留了所有以发布消息,即使消息被消费,消息仍然会被保留一段时间。例如,如果log被设置为保留两天,那么在一条消息被消费之后的两天内仍然有效,之后它将会被丢弃以释放磁盘空间。Kafuka的性能相对于数据量来说是恒定的,所以保留大量的数据并不是问题。

每个consumer(消费者)的基础元数据只有一个,那就是offset,它表示消息在log文件中的位置,它由consumer所控制,通常情况下,offset将会”线性”的向前驱动,也就是说消息将依次顺序被消费。而事实上,consumer可以通过设置offset来消费任意位置的消息。例如,consumer可以重置offset来从新处理消息。

partition/Distribution

Kafka集群中,一个Topic的多个partitions被分布在多个server上。每个server负责partitions中消息的读写操作。每个partition可以被备份到多台server上,以提高可靠性。

每一个patition中有一个leader和若干个follower。leader处理patition内所有的读写请求,而follower是leader的候补。如果leader挂了,其中一个follower会自动成为新的leader。每一台server作为担任一些partition的leader,同时也担任其他patition的follower,以此达到集群内的负载均衡。

producer

producer发布消息到指定的topic中,producer决定将消息发送到具体的哪一个partition。比如基于”round-robin”方式实现简单的负载均衡或者通过其他的一些算法等.

consumer

消息基本上有两种模式:queuing(队列模式) 和 publish-subscribe(发布-订阅模式) ,在队列模式中,consumer池从server中读取消息,每个消息都会到达一个consumer。在发布-订阅模式中,消息被广播到所有的consumer。Kafka提供了consumer group这个抽象概念来概括这两种模式。

每个consumer属于一个consumer group, 如果consumer group订阅了topic,那么它会接收到该topic发布的每条消息,该消息只会被分配到一个consumer上。consumer实例可以部署在不同的进程或机器上。如果所有的consumer都具有相同的group,这种情况和queue模式很像,消息将会在consumers之间负载均衡。如果所有的consumer都具有不同的group,那这就是“发布-订阅”,消息将会广播给所有的消费者。

然而,我们发现大多数情况下topic只有少量的逻辑上的订阅者 consumer group,每个group由许多的consumer实例组成,以提高扩展性和容错性。这就是发布-订阅模式,订阅者是consumer集群而非单个进程。

相比于传统的消息系统,Kafka具有更强的序列保证。

传统的队列在server上保持有序,如果多个consumer从队列中消费,队列会按序弹出,然后消息被异步分配到consumer上,因此,消息到达consumer时可能会破坏顺序。这意味着在并行处理过程中,消息处理是无序的。为了解决这个问题,消息系统的exclusive consumer机制只允许单进程从队列中消费消息,当然,这就是说,没有了并行处理能力。

Kafka具有更好的解决方案。通过parallelism—thepartition—within the topics机制,Kafka能够提提供有序保证,使consumer池能够负载均衡。这是通过把topic中的partition分派给consumer group中的consumer来实现的,因此,每个partition由group中一个确定的consumer来消费。通过这种方式我们保证了consumer是指定partition的唯一reader,并且按顺序消费数据。由于有很多partition,这种方式使得consumer实例可以负载均衡。

kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的。事实上,从Topic角度来说,消息仍不是有序的。如果你需要topic范围内的有序,那么你可以只使用一个partition,这也就是说,group中也只有一个consumer。

Guarantees

在更高的层面,Kafka给出以下保证:
1) 发送到partitions中的消息将会按照它接收的顺序追加到日志中。
2) 对于消费者而言,它们消费消息的顺序和log中消息顺序一致。
3) 如果Topic的”replication factor“为N,那么允许N-1个kafka实例失效。

kafka部署

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Docker自定义network搭建kafka 下一篇Kafka原理框架汇总

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目