`

Kafka简介及主要机制

 
阅读更多

一、简介
Kafka是一种分布式的,基于发布/订阅的消息系统
主要特性:
1)消息持久化
要从大数据中获取真正的价值,那么不能丢失任何信息。Apache Kafka设计上是时间复杂度O(1)的磁盘结构,它提供了常量时间的性能,即使是存储海量的信息(TB级)。
2)高吞吐
记住大数据,Kafka的设计是工作在标准硬件之上,支持每秒数百万的消息。
3)分布式
Kafka明确支持在Kafka服务器上的消息分区,以及在消费机器集群上的分发消费,维护每个分区的排序语义。
4)多客户端支持
Kafka系统支持与来自不同平台(如java、.NET、PHP、Ruby或Python等)的客户端相集成。
5)实时
生产者线程产生的消息对消费者线程应该立即可见,此特性对基于事件的系统(比如CEP系统)是至关重要的。

 

二、概念/相关原理、机制

Broker
-----------------------------------------------------
Kafka集群包含一个或多个服务器,这种服务器被称为broker(kafka实例)

**********************************************************************************************************
1.生产者---》Broker(Leader partition)
[主从复制了再返回ask?ask了再去主从复制?]
选择保存到哪一个partition(Key Hash)

2.Broker(Leader partition)-->>Broker(follower partition)
分布式存储partition
(主从复制)
[选举leader]
删除消息方式

3.Broker(Leader partition)-->>消费者
[处理了消息再返回commit?commit了再处理消息?]
offset
Consumers(消费者)/consumers group(订阅/广播)
**********************************************************************************************************
1.生产者---》Broker
Producers(生产者):负责发布消息到Kafka broker。

2.Broker-->>Broker
Topics/partition

-----------------------------------------------------
Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里。
为了使得Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,
每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件。

partition的数量可以在server.properties中指定。
在发送一条消息时,可以指定这条消息的key,producer根据这个key和partition机制来判断将这条消息发送到哪个parition。
paritition机制可以通过指定producer的paritition.class这一参数来指定,该class必须实现kafka.producer.Partitioner接口。

离散:
本例中如果key可以被解析为整数则将对应的整数与partition总数取余,该消息会被发送到该数对应的partition。(每个parition都会有个序号)

import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;

public class JasonPartitioner<T> implements Partitioner {

    public JasonPartitioner(VerifiableProperties verifiableProperties) {}

    @Override
    public int partition(Object key, int numPartitions) {
        try {
            int partitionNum = Integer.parseInt((String) key);
            return Math.abs(Integer.parseInt((String) key) % numPartitions);
        } catch (Exception e) {
            return Math.abs(key.hashCode() % numPartitions);
        }
    }
}

partitions/Replication/Leader election(partition级别的概念)
-----------------------------------------------------
一个Topic的多个partitions,被分布在kafka集群中的多个server上;每个server(kafka实例)负责partitions中消息的读写操作;
此外kafka还可以配置partitions需要备份的个数(replicas),每个partition将会被备份到多台机器上,以提高可用性.

1.partitions
Kafka从0.8开始提供partition级别的replication(主从复制,同步)
replication对Kafka的吞吐率是有一定影响的,但极大的增强了可用性。

2.Replication(提高消息可用性,不会丢失)
Kakfa处理失败需要明确定义一个broker是否alive。对于Kafka而言,Kafka存活包含两个条件,
一是它必须维护与Zookeeper的session(这个通过Zookeeper的heartbeat机制来实现)。
二是follower必须能够及时将leader的writing复制过来,不能“落后太多”。

leader会track“in sync”的node list。
如果一个follower宕机,或者落后太多,leader将把它从”in sync”list中移除。
这里所描述的“落后太多”指follower复制的消息落后于leader后的条数超过预定值。

一条消息只有被“in sync” list里的所有follower都从leader复制过去才会被认为已提交。
这样就避免了部分数据被写进了leader,还没来得及被任何follower复制就宕机了,而造成数据丢失(consumer无法消费这些数据)。
而对于producer而言,它可以选择是否等待消息commit,这可以通过request.required.acks来设置。
这种机制确保了只要“in sync”list有一个或以上的flollower,一条被commit的消息就不会丢失。

这里的复制机制即不是同步复制,也不是单纯的异步复制。事实上,同步复制要求“活着的”follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率。
而异步复制方式下,follower异步的从leader复制数据,数据只要被leader写入log就被认为已经commit,这种情况下如果follwer都落后于leader,而leader突然宕机,则会丢失数据。
而Kafka的这种使用“in sync” list的方式则很好的均衡了确保数据不丢失以及吞吐率。
follower可以批量的从leader复制数据,这样极大的提高复制性能(批量写磁盘),极大减少了follower与leader的差距。

3.Leader election
kafka集群,容忍N-1个replicas失效。

每个partition都有一个唯一的leader,所有的读写操作都在leader上完成(
    生产者push消息或消费者pull消息,都只和leader打交道,
        partition有多个follower,消费者保证消息不会从多个follower中得到;
    leader宕机了会重新选举出一个leader,保证消费者能得到消息。
)。

Leader的概念是相对于partition的备份(Replication)来说的。

一个基本的原则就是,如果leader不在了,新的leader必须拥有原来的leader commit的所有消息。
这就需要作一个折衷,如果leader在标明一条消息被commit前等待更多的follower确认,
那在它die之后就有更多的follower可以作为新的leader,但这也会造成吞吐率的下降。

1.生产者---》Broker(Leader partition)[主从复制了再返回ask?ask了再去主从复制?]
2.Broker(Leader partition)-->>Broker(follower partition)(主从复制)[选举leader]分布式存储partition
3.Broker(Leader partition)-->>消费者[处理了消息再返回commit?commit了再处理消息?]

如何选举Leader
-----------------------------------------------------
最简单最直观的方案是,所有Follower都在ZooKeeper上设置一个Watch,一旦Leader宕机,
其对应的ephemeral znode会自动删除,此时所有Follower都尝试创建该节点,
而创建成功者(ZooKeeper保证只有一个能创建成功)即是新的Leader,其它Replica即为Follower。

(还没看懂)
但是该方法会有3个问题:
split-brain 这是由ZooKeeper的特性引起的,虽然ZooKeeper能保证所有Watch按顺序触发,但并不能保证同一时刻所有Replica“看”到的状态是一样的,
        这就可能造成不同Replica的响应不一致
herd effect 如果宕机的那个Broker上的Partition比较多,会造成多个Watch被触发,造成集群内大量的调整
ZooKeeper负载过重 每个Replica都要为此在ZooKeeper上注册一个Watch,当集群规模增加到几千个Partition时ZooKeeper负载会过重。

Kafka 0.8.*的Leader Election方案解决了上述问题,它在所有broker中选出一个controller,
所有Partition的Leader选举都由controller决定。controller会将Leader的改变直接通过RPC的方式(比ZooKeeper Queue的方式更高效)
通知需为为此作为响应的Broker。同时controller也负责增删Topic以及Replica的重新分配。

消息Deliver guarantee
-----------------------------------------------------
At most once 消息可能会丢,但绝不会重复传输
At least one 消息绝不会丢,但可能会重复传输
Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的。

读完消息先commit再处理消息:这种模式下,如果consumer在commit后还没来得及处理消息就crash了,下次重新开始工作后就无法读到刚刚已提交而未处理的消息,这就对应于At most once
读完消息先处理再commit:这种模式下,如果处理完了消息在commit之前consumer crash了,下次重新开始工作时还会处理刚刚未commit的消息,实际上该消息已经被处理过了。这就对应于At least once。

如果一定要做到Exactly once,就需要协调offset和实际操作的输出。
比如,consumer拿到数据后可能把数据放到HDFS,如果把最新的offset和数据本身一起写到HDFS,那就可以保证数据的输出和offset的更新要么都完成,要么都不完成,间接实现Exactly once。
(目前就high level API而言,offset是存于Zookeeper中的,无法存于HDFS,而low level API的offset是由自己去维护的,可以将之存于HDFS中)

总之,Kafka默认保证At least once,并且允许通过设置producer异步提交来实现At most once。
而Exactly once要求与目标存储系统协作,幸运的是Kafka提供的offset可以使用这种方式非常直接非常容易。

Persistence/文件存储Log
-----------------------------------------------------
kafka使用文件存储消息(append only log),这就直接决定kafka在性能上严重依赖文件系统的本身特性.
且无论任何OS下,对文件系统本身的优化是非常艰难的.文件缓存/直接内存映射等是常用的手段.
因为kafka是对日志文件进行append操作,因此磁盘检索的开支是较小的;同时为了减少磁盘写入的次数,
broker会将消息暂时buffer起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,
这样减少了磁盘IO调用的次数.对于kafka而言,较高性能的磁盘,将会带来更加直接的性能提升.

需要考虑的影响性能点很多,除磁盘IO之外,我们还需要考虑网络IO,这直接关系到kafka的吞吐量问题.
对于producer端,可以将消息buffer起来,当消息的条数达到一定阀值时,批量发送给broker;
对于consumer端也是一样,批量fetch多条消息.不过消息量的大小可以通过配置文件来指定.

kafka支持gzip/snappy等多种压缩方式.

Kafka提供两种策略去删除旧数据。
一是基于时间,二是基于partition文件大小。
例如:让Kafka删除一周前的数据,也可通过配置让Kafka在partition文件超过1GB时删除旧数据。

***************************************
3.Consumers(消费者)/consumers group
消费消息
每个consumer属于一个特定的consuer group(可为每个consumer指定group name,若不指定group name则属于默认的group)。
同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。
如果每一个consumer都属于一个特定的group,则每一个consumer都能得到这条消息。

offset
-----------------------------------------------------
当前消费的消息的position
这个offset由consumer控制。正常情况下consumer会在消费完一条消息后线性增加这个offset。
当然,consumer也可将offset设成一个较小的值,重新消费一些消息。

Consumer Rebalance(后续引入Zookeeper)(Consumer加入或减少)(Broker加入或减少)待续
-----------------------------------------------------
如果某consumer group中consumer数量少于partition数量,则至少有一个consumer会消费多个partition的数据,
如果consumer的数量与partition数量相同,则正好一个consumer消费一个partition的数据,

而如果consumer的数量多于partition的数量时,会有部分consumer无法消费该topic下任何一条消息。

参考:
http://www.linuxidc.com/Linux/2014-09/107388.htm
http://blog.csdn.NET/qqqq724/article/details/43228863
http://my.oschina.Net/frankwu/blog/303745

分享到:
评论

相关推荐

    kafka存储机制.docx

    下面将从 Kafka 文件存储机制和物理结构角度,分析 Kafka 是如何实现高效文件存储,及实际应用效果。 Kafka 文件存储机制 Kafka 文件存储机制是衡量一个消息队列服务技术水平和最关键指标之一。Kafka 文件存储机制...

    kafka简介与kafka深入浅出两个资料.rar

    3. **容错性**:通过复制机制,Kafka能够在broker故障时自动切换,保证服务的连续性。 4. **实时处理**:Kafka设计用于处理实时数据流,延迟极低,适合实时分析和流处理。 5. **API支持**:Kafka提供了Java和Scala的...

    Kafka简介.pptx

    Kafka的PPT讲义,入门级 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。...Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

    Apache Kafka:Kafka分区与副本机制.docx

    Apache Kafka:Kafka分区与副本机制.docx

    Kafka Tool linux版本,适用于kafka0.11及以上

    Kafka Tool是针对Kafka集群进行管理和操作的一款图形用户界面(GUI)工具,特别适用于Kafka 0.11及以上版本。它为用户提供了便捷的方式来查看、管理和操作Kafka集群,极大地简化了日常维护工作。 **主要功能:** 1...

    5、kafka监控工具Kafka-Eagle介绍及使用

    Kafka-Eagle 的主要特点包括: 1. **全面监控**:它能够监控 Kafka 的关键指标,如 Broker 的状态、Topic 的分区分布、Consumer 的消费进度(offset 和 lag)以及 Owner 信息。 2. **直观界面**:Kafka-Eagle 提供...

    kafka简介

    ### Kafka简介 Kafka是一种高性能、可扩展的分布式消息系统,它主要被设计用于处理大量实时数据流。本文将从Kafka的基本概念出发,深入探讨其技术架构、工作原理及应用场景。 #### 一、Kafka概述 Kafka是一个轻量...

    kafka概述及原理.pdf

    ### Apache Kafka概述及原理 #### 一、Apache Kafka简介 Apache Kafka是一款开源的分布式流处理平台,由LinkedIn公司创建,并于2011年捐赠给Apache软件基金会,现已成为Apache顶级项目之一。Kafka主要用于构建实时...

    Kafka the Definitive Guide 2nd Edition

    Kafka 的主要特点是高性能、可扩展性和高可靠性,能够处理高吞吐量的消息数据。 2. Kafka 的核心概念 Kafka 的核心概念包括: * 消息(Message):Kafka 中的基本数据单元,包含键、值和时间戳。 * 批处理(Batch...

    kafka数据可靠性机制详解共4页.pdf.zip

    《Kafka数据可靠性机制详解》 Kafka作为一个分布式流处理平台,其数据可靠性是系统稳定性和可用性的重要保障。在深入探讨Kafka的数据可靠性机制之前,我们首先要理解Kafka的基本架构。Kafka由生产者、消费者和 ...

    kafka安装及详细介绍

    Kafka 安装及详细介绍 Kafka 是一个高吞吐的分布式消息队列系统,具有生产者消费者模式,先进先出(FIFO)保证顺序,不丢失数据,默认每隔 7 天清理数据。事件记录了一个事实,即世界或企业中发生的“某些事情”。...

    kafka原理文档1

    kafka的Partition机制主要包括以下几个方面: *Partition策略:kafka使用Hash策略来将消息路由到不同的Partition中。 *Partition文件:每个Partition对应一个文件目录,用于存储消息数据。 *Offset:Offset是消息在...

    kafka介绍及部署

    通过其独特的持久化机制、分布式架构以及对大规模数据处理的优化,Kafka已经成为大数据领域不可或缺的工具,广泛应用于日志收集、实时监控、数据聚合等多种场景。了解并熟练掌握Kafka的使用,有助于构建高性能、高...

    大数据采集技术-Kafka的消息存储机制.pptx

    **大数据采集技术与Kafka的消息存储机制** 大数据采集技术在当今的信息时代中扮演着至关重要的角色,它涉及从各种来源收集、处理和分析大量数据。Kafka作为一个高效、可扩展的分布式流处理平台,尤其在大数据采集和...

    Kafka详细课程讲义

    3. 解释Kafka的ISR(In-Sync Replicas)机制。 4. Kafka的消费模型是什么样的? 5. 如何处理Kafka的消费者挂掉或新消费者加入的情况? 通过学习以上章节,你可以深入了解Kafka的原理、配置、使用和优化,为实际项目...

    kafka简介.docx

    【Kafka 简介】 Kafka 是一个高性能的分布式消息系统,最初由 LinkedIn 开发,现已成为 Apache 软件基金会的顶级项目。Kafka 以其可扩展性和高吞吐量著称,广泛应用于大数据处理、日志聚合、实时流处理等领域。...

    kafka 数据可靠性深度解读.pdf

    Kafka是一个分布式的流处理平台,主要用于构建实时数据管道和流应用程序。它的设计初衷是成为一个分布式的、可持久化的、高吞吐量的消息系统。Kafka在互联网企业中广泛应用,尤其适合于需要处理大量数据并保证数据...

    华为kafka.zip

    在华为kafka中,可能包含了华为特有的安全机制,如支持对接kerberos认证,这使得它在企业级应用中更加安全可靠,尤其适合处理敏感信息。 Kafka的工作原理主要包括生产者、消费者和 broker 三部分。生产者负责将数据...

Global site tag (gtag.js) - Google Analytics