Kafka教程(一)—— Kafka基本原理介绍

本文会依次介绍kafka的介绍、特性、使用场景、基本概念、生产消费流程。因此前面遇到一些陌生的名词不要慌张,后面会介绍到。


一、Kafka基本介绍

        Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala、java语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

二、Kafka特性

  1. 高吞吐量、低延迟:Kafka每秒可以处理几十万条消息,它的延迟只有几毫秒。
  2. 可扩展性:Kafka集群支持热扩展,即不再断开当前连接的情况下,扩展其生产者或消费者。
  3. 持久性、可靠性:消息被持久化到本地磁盘,默认1个礼拜后清空,这一点不像其他的消息队列,消息被消费掉即丢失。
  4. 容错性:kafka的消息都有备份,其允许集群中节点的宕机。
  5. 高并发:Kafka是发布-订阅模式,支持数千个客户端同时读写。

三、Kafka使用场景

  1. 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
  2. 消息系统:解耦和生产者和消费者、缓存消息等。
  3. 用户动作跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
  4. 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
  5. 流式处理:比如spark streaming和storm。

四、Kafka基本概念

     在介绍kafka工作原理之前,我们需要熟悉几个基本概念,这样便于更好的理解其工作流程。

  1. Producer:消息生产者,向Kafka发送消息的客户端
  2. Consumer:消息消费者,消息的使用方,负责消费Kafka服务器上的消息。
  3. Topic:主题,我们在安装好Kafka之后,需要自己建立一个topic,生产者发送消息到该topic下,而消费者从这个topic消费数据。一个kafka集群中可以包含多个topic,这样可以使得各个任务的消息隔离,彼此操作不受影响。
  4. Partition:消息分区,topic会被切分为多个分区,消息实际上是被存储在各个partitions里面。我们在创建topic的时候,需要指定topic包含的partition的数量,如果包含多个partitions那么消息会根据其key-value按照一定的策略分配到各partition里面存储,每个partition里面的消息都是有序队列。因此严格来说各个partition里面消息是FIFO,但是整个kafka的生产消费流程并非FIFO。(是以文件的形式存储在磁盘上的,kafka写partition不通过内存,直接写入磁盘)
  5. Partition offset:每个partition中的消息拥有一个唯一的序列id,被称为offset。消费者在消费消息时就是从offset开始消费的。
  6. Broker:代理,维护发布消息的系统,消费者会从broker来获取消息进行消费。一个Kafka集群由多个broker组成,broker主要来实现集群的负载均衡。一台物理机可以有一个broker,也可以有多个broker。单个broker每秒可以处理数十万的读写请求,即使保存TB级别的数据也不会影响性能。这也是kafka的恐怖之处。
  7. Leader:在Kafka集群中,一个partition会先写入某个broker里面,之后再备份到其他beoker里面。因此一个partition会出现在多个broker里面,其中leader是负责该partition数据读写操作的节点,每个partition都有一个leader。
  8. Follower:跟随leader操作的节点被称为follower。如果leader节点宕机,则会其他的follower中挑选一个作为新的leader。这也是Kafka容错性的提现。
  9. Consumer Group:消费者分组,用于归组同类消费者。每个consumer属于一个特定的consumer group。但是当一个consumer group消费一个partition时,只能由一个consumer可以消费到数据。

五、图解Kafka流程

(1)先抛出一个kafka集群的整体流程

       上图中一个topic被分为3个partition,3个broker,一个partition只能有一个broker作为leader,其他的broker作为follower其进行备份。

生产者直接将生产的消息丢到topic中,而消费者则是通过broker对消息进行消费的。

(2)topic拆分为多个partition

        topic会被分为多个partition,消息实际上是存储在各个partition中。每个partition里面的消息都是有序队列,是FIFO的队列,每个消息在partition都是有唯一的标识offset的。kafka集群生产的消息不经过内存直接存储到磁盘的partition上,默认的保留设置是7天,在消息产生之后的7天内都可以被读取使用,之后会被丢弃以释放空间。

        zookeeper保留每个消费者上次消费的offset,当该消费者断开连接,下次再消费时会自动从上次消费的offset继续消费。在消费程序中

(3)partition被broker备份

        

        上图中红色的是partition的leader,而蓝色的是partition的follower。在Kafka集群中,一个partition会先写入某个broker里面,之后再备份到其他beoker里面。因此一个partition会出现在多个broker里面,其中leader是负责该partition数据读写操作的节点,follower是对于partition的备份,每个partition都只有一个leader,当该leader宕机之后,zookeeper会选取其他的follower来作为leader。

(4)消费过程

        首先,消费者消费的数据是通过broker获取的。

        其次,一个partition可以被多个consumer group消费,但只能被consumer group里面的一个consumer消费。

        再次,当我们不指定consumer group进行消费时,一个partition可以被多个consumer消费。

        kafka的发布-订阅模式(publish-subscribe)体现在其消费逻辑上。当生产者将生产的消息放到kafka中,消息会被zookeeper广播到所有的consumer中,也就是同一个消息可以被多个consumer消费。这一点区别于队列模式,传统的队列模式例如redis等,同一个消息只能被一个消费者消费,并且消费之后会删除该消息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值