Kafka核心基础和基本概念

目录

Kafka的基本概念

生产数据——工作流程分析

1、写入指定的partition,顺序排列

2、如何确保数据不丢失

消费数据


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

//注意:Apache Kafka2.8版本之后可以不需要使用ZooKeeper,需要使用JDK9

Kafka的基本概念

kafka是一个分布式的,分区的消息(官方称之为commit log)服务。它提供一个消息系统应该具备的功能,但是确有着独特的设计。可以这样来说,Kafka借鉴了JMS规范的思想,但是确并没有完全遵循JMS规范。

首先,让我们来看一下基础的消息(Message)相关术语:

      名称                                                      解释
Broker 消息中间件处理节点,一个Kafka节点就是一个broker(相当于一个Server),一个或者多个Broker可以组成一个Kafka集群
Topic Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
Producer 消息生产者,向Broker发送消息的客户端
Consumer 消息消费者,从Broker读取消息的客户端
ConsumerGroup 每个Consumer属于一个特定的Consumer Group,一条消息可以被多个不同的Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费该消息 //消息分组,同一个分组只能消费一次消息
Partition 物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的 //消息分区,一个topic可以有多个分区

因此,从一个较高的层面上来看,producer通过网络发送消息到Kafka集群(一个Broker也是集群,Broker中的Topic可以有多个Partition),然后consumer来进行消费,如下图:

服务端(brokers)和客户端(producer、consumer)之间通信通过TCP协议来完成。

如果看到这张图你很懵逼,木有关系!我们先来分析相关概念。

Producer:Producer即生产者,消息的产生者,是消息的入口。

kafka cluster:

        Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……

        Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。

        Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!

        Replication(副本):每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。//副本是针对Partition(分区)来进行的

Message:每一条发送的消息主体。

Consumer:消费者,即消息的消费方,是消息的出口。

  Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!

Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。

  • 推荐阅读:
  • 再过半小时,你就能明白kafka的工作原理了 - 苏苏喂苏苏+ - 博客园

kafka的入门操作:

kafka安装和启动 - OrcHome

生产数据——工作流程分析

我们看上面的架构图中,producer就是生产者,是数据的入口。注意看图中的红色箭头,producer在写入数据的时候永远找的是leader,不会直接将数据写入follower!那leader怎么找呢?写入的流程又是什么样的呢?我们看下图:

发送的流程就在图中已经说明了,就不单独在文字列出来了!需要注意的一点是,消息写入leader后,follower是主动的去leader进行同步的!producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!写入示意图如下:

上面说到数据会写入到不同的分区,那kafka为什么要做分区呢?相信大家应该也能猜到,分区的主要目的是:

  1. 方便扩展。因为一个topic可以有多个partition,所以我们可以通过扩展机器去轻松的应对日益增长的数据量。
  2. 提高并发。以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。

1、写入指定的partition,顺序排列

熟悉负载均衡的朋友应该知道,当我们向某个服务器发送请求的时候,服务端可能会对请求做一个负载,将流量分发到不同的服务器,那在kafka中,如果某个topic有多个partition,producer又怎么知道该将数据发往哪个partition呢?kafka中有几个原则:

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

2、如何确保数据不丢失

保证消息不丢失是一个消息队列中间件的基本保证,那producer在向kafka写入消息的时候,怎么保证消息不丢失呢?其实上面的写入流程图中有描述出来,那就是通过ACK应答机制!在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为01all

  • 0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。
  • 1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。
  • all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低。

最后要注意的是,如果往不存在的topic写数据,能不能写入成功呢?kafka会自动创建topic,分区和副本的数量根据默认配置都是1。

消费数据

对于某一个topic来说,如果有多个partition,读取是并行的,但是对于单独的一个partition来说,读取是顺序的,按照时间顺序,最老的数据先被读出来

 

在实际的应用中,消费者组的consumer的数量与partition的数量一致是比较理想的情况,多出来的消费者不消费任何partition的数据。

consumer消费数据后,会向kafka提交committed offsetconsumer下一次消费数据时,会从committed offset位置开始读取

committed offset分为以下几种情况:

  1. 最多一次:当消息到达消费者时,马上committed offset,如果此时消费者程序宕机,这条消息将不会再被处理,造成数据丢失。
  2. 最少一次:当消费者消费完数据,再进行committed offset,如果消费程序崩溃(没消费完),消费者重新启动时,还会再次去读取一次数据。这个时候,我们需要确保当前数据不会影响系统数据的准确性,比如,如果有3条message,前两条已经插入了数据库,此时程序崩溃,第二次读取时,我们不应该再向数据库插入相同的数据,应该把插入数据改成修改数据,尽最大可能的减少重复消费对系统的影响。
  3. 有且只有一次:此种场景比较难以实现。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部