kafka-理论

https://blog.csdn.net/congcong68/article/details/71915679

http://blog.jbomo.com/articles/2018/02/26/1519630193390.html

Kafka官方介绍:Kafka是一个分布式的流处理平台(0.10.x版本),在kafka0.8.x版本的时候,kafka主要是作为一个分布式的、可分区的、具有副本数的日志服务系统(Kafka™ is a distributed, partitioned, replicated commit log service), 具有高水平扩展性、高容错性、访问速度快、分布式等特性;主要应用场景是:日志收集系统和消息系统。

数据在Kafka上的分布简单描述图。

 

一个流处理平台具有三个关键能力:

·发布和订阅消息(流),在这方面,它类似于一个消息队列或企业消息系统。

·以容错的方式存储消息(流)。

·在消息流发生时处理它们。

2. 核心要点

1) kakfa的优势

应用于2大类应用

·构建实时的流数据管道,可靠地获取系统和应用程序之间的数据。

·构建实时流的应用程序,对数据流进行转换或反应。

2) 要点

·kafka作为一个集群运行在一个或多个服务器上。

·kafka集群存储的消息是以topic为类别记录的。

·每个消息(也叫记录record,我习惯叫消息)是由一个key,一个value和时间戳构成。

3) 四个核心API

·应用程序使用 Producer API 发布消息到1个或多个topic(主题)。

·应用程序使用 Consumer API 来订阅一个或多个topic,并处理产生的消息。

·应用程序使用 Streams API 充当一个流处理器,从1个或多个topic消费输入流,并生产一个输出流到1个或多个输出topic,有效地将输入流转换到输出流。

·Connector API允许构建或运行可重复使用的生产者或消费者,将topic连接到现有的应用程序或数据系统。例如,一个关系数据库的连接器可捕获每一个变化。

 

Client和Server之间的通讯,是通过一条简单、高性能并且和开发语言无关的TCP协议。除了Java Client外,还有非常多的其它编程语言的Client

 

 

3. 基本术语

1) Message(消息)

传递的数据对象,主要由四部分构成:offset(偏移量)、key、value、timestamp(插入时间); 其中offset和timestamp在kafka集群中产生,key/value在producer发送数据的时候产生。

2) Topic(主题)

Kafka将消息种子(Feed)分门别类,每一类的消息称之为一个主题(Topic).

3) Partition(分区)

具体维护Kafka上的消息数据的最小单位,一个Topic可以包含多个分区;Partition特性:ordered & immutable。(在数据的产生和消费过程中,不需要关注数据具体存储的Partition在那个Broker上,只需要指定Topic即可,由Kafka负责将数据和对应的Partition关联上)

Producer(生产者):负责将数据发送到Kafka对应Topic的进程

4) Producer(生产者)

发布消息的对象称之为主题生产者(Kafka topic producer)

5) Consumer(消费者)

订阅消息并处理发布的消息的种子的对象称之为主题消费者(consumers)

6) Consumer Group(消费者组)

每个consumer都属于一个特定的group组,一个group组可以包含多个consumer,但一个组中只会有一个consumer消费数据。

 

7) Broker(代理)

已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker). 消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。

 

 

二、Broker                                                                                                              
       Kafka 集群包含一个或者多个服务器,每个服务器都会标示为Broker。

     通过Server.properties中的broker.id 标识的。消息都会存储在这上面的。所以Broker数量(服务器)越多,集群的吞吐率就越高。

二、Topics and Logs                                                                                             
        不同的 producer生产的不同类的消费,Kafka通过Topics 区分不同类的消息,不同的Topics 的消息是分开存储的,存储在不同的Broker,每个Topics还可以进行分区存储(partition),分区数量可以一个或者多个组成的,在Server.properties配置log.dirs(kafka持久化数据存储的路径)数据目录下有对应的topic_name-partition_id文件

 

 1)消息被append到对应的partition中,每个partition的消息是有顺序的,Partition中的每条Message由offset来表示它在这个partition中的偏移量,这个offset不是该Message在partition数据文件中的实际存储位置,offset是partition中Message的id,partition是分段的,每个段叫LogSegment,包括了一个数据文件和一个索引文件。

          2) Kafka中Topics的消息,默认保留2天,两天过后会被删除,可以通过Server.properties配置log.retention.{ms,minutes,hours},也可以配置消息达到多大时被删除(log.retention.check.interval.ms)。默认保留2天,在这2天里,消息有没有被消费者消费,这个消息都存在,即使被消费了,这个消息也还是存在的,可以更改offset,重新消费消息。

       3)Kafka中Topic的存储消息,可以是分区的,并分布式的存储在不同的Broker上,Kafka的吞吐率可以水平扩展。

    4)Producer 和Consumer分开的处理,解耦
 

三、Producer 发布                                                    
 

   Producer 将消息发布到指定的Topic中。

     1)Topic多个分区时,消息根据SimplePartitioner的规则,采用hashcode的做模运算,把消息保存到对应的分区。

        2)可以指定相同的key,发送到相同的分区,并保证消息有顺序性。

 

四、Consumer                                                                                                         
        消息者,每个consumer属于一个特定的consuer group(消费者组),如果一个消费者不指定group,则默认一个group,同一个topic的一个消息只能被同一个consuer group内的一个consuer 消费,但多个consuer group可同时消息同一个消息。consuer 在消费消息时,保存了offset,会记录在zookeeper上,顺序的读取时offset会增大。

 

五、Replication                                                                                                        
           每个partition有对应的leader,leader负责了消息的读写操作,leader分布在broker。

      我们在创建Topics时会指定每个partition的副本数(default.replication.factor 配置),一个消息leader 和follower都有保存才算成功,leader如果挂了,Kafka保证读写可靠性,采用了ISR(in-sync replicas),新的Leader从ISR中选举出来,ISR所有副本能够及时的复制Leader日志的节点,follower如果采用同步复制,follower都复制完这条消息才会commit,极大的影响了Kafka的吞吐率,Kafka采用了异步的批量的复制Leader日志,每个partition保Leader计算每个副本和它相对落后的数量和在规定时间内不会向Leader获取消息的会更新ISR并移除这些follower:

      1)request.required.acks (0:代表不需要任何确认; 1:代表需要leader replica确认 ;-1:代表需要ISR中所有进行确的。

      2)replica.lag.max.messages:数量  只要follower相对Leader落后的数量,就会从ISR移除。

      3)replica.lag.time.max.ms:时间  规定时间内不会向Leader获取消息就会从ISR移除。
 

猜你喜欢

转载自blog.csdn.net/zhuchunyan_aijia/article/details/83090746