1、什么是kafka?

Kafka是一种分布式的,基于发布/订阅的消息系统(消息队列)。

2、为什么要用kafka?

当业务逻辑变得复杂,数据量也会越来越多。此时可能需要增加多条数据线,每条数据线将收集到的数据导入到不同的存储和分析系统中。若仍使用之前的数据收集模式,则会出现以下问题:

1)生产者和消费者耦合度过高:当需要增加一个消费者时,所有的生产者都需要去改动,数据流水线扩展性差。

2)生产者消费者之间数据处理速率不对等:如果生产者的生产速率过高,可能会导致消费者压力过大,导致崩溃。

3)大量的并发网络连接对后台消费者不友好:大量生产者直接与消费者通信,对消费者造成过高的网络并发压力,会成为系统扩展中潜在的性能瓶颈;另外,大量并发生产者同时写入后端存储,可能会产生大量小文件,对Hadoop等分布式文件系统会造成存储压力。

分布式消息队列优点:降低耦合、异步执行、削峰填谷

3、kafka特点

1)高性能:相比于其他队列,Kafka拥有更高的性能和吞吐率。

2)良好的扩展性:采用分布式设计架构,数据经分片后写入多个节点,既可以突破单节点的存储处理的瓶颈,也可以实现高容错。

3)数据持久性:数据消息均会持久化到磁盘上,通过多副本避免数据丢失。采用顺序读写和批量写等机制,提高了磁盘操作效率。

4、kafka架构

​ Kafka采用了不同于其他队列push-push的架构,而是采用了push-pull架构。Producer直接将数据push给Broker,Consumer从Broker端pull数据。优势主要体现在以下两点:

1)Consumer可根据实际负载和需求获取数据,避免给Consumer带来太大压力。

2)Consumer自己维护已读消息的offset而不是由Broker维护,使Broker更加轻量级。

5、Producer

生产者,发布消息到Broker。

在Kafka中,每条数据被称为消息,每条消息表示为一个三元组:<topic, key, message>。

1)topic:表示该条消息所属的主题。topic是划分消息的逻辑概念,一个topic可以分布在多个Broker上。

2)key:表示该条消息的主键,Kafka会根据主键将同一topic下的消息划分为不同的分区。

​ 当用户写入一条消息时,会对key求Hash值,用该数对partition数量求模,得到的就是分区编号,之后网络告知Broker,Broker写到对应的partition中。

3)message:表示该条消息的值,该数值的类型为字节数组,可以是普通的字符串、JSON对象,或者经序列化框架序列化过后的对象。

6、Broker

1)Kafka中Broker一般会有多个来组成分布式高容错集群。

2)Broker的主要职责是接受Producer和Consumer的请求,并把消息持久化到磁盘。

3)Broker以topic为单位将消息分成不同的分区,每个分区有多个副本,通过数据冗余方式实现容错。

4)当partition中存在多个副本时,其中一个为leader,对外提供读写请求,其余为follower,不对外提供读写请求,只是同步leader中的数据,当leader出现问题时,通过选举算法将其中一个选举为leader。

5)Broker能保证同一topic下的同一partition内数据有序,无法保证partition之间的数据全局有序。

6)Broker以追加的方式将数据写入磁盘,且每个分区中的消息被赋予了唯一整数标识,称为offset。

7)Broker中保存的数据是有有效期的,如果超过了有效期,将磁盘中的数据移除以释放空间,在有效期内,Consumer可以任意重复读取不受限制。

7、Consumer

消费者,主动从Broker中拉取消息进行处理。

1)Consumer自己维护最后一个已读消息的offset。

2)Kafka允许多个Consumer构成一个Consumer Group,共同读取一个topic中的数据来提高效率。

3)Kafka可以自动为同一Group中的Consumer分摊负载,从而实现消息的并发读取。

4)Kafka在某个Consumer发生故障时,自动将它处理的partition转移给同组的其它Consumer来处理。

8、Zookeeper

1)Broker与Zookeeper:Broker会向Zookeeper进行注册,将自己的位置、健康状态、维护的topic和partition等信息写入Zookeeper,以便于其它可以发现获取这些数据。

2)Consumer与Zookeeper:Consumer Group利用Zookeeper保证组内的Consumer负载均衡。

9、关键技术点

1)可控的可靠性级别

​ Producer可以通过两种方式向Broker发送数据,同步和异步。其中异步方式通过批处理方式大大提高了写入效率。不管是以何种方式,Producer均能通过消息应答方式,在写效率和可靠性之间(二者是此消彼长的)做一个较好的权衡。

​ 目前支持三种消息应答方式,通过控制参数request.required.acks:

0:Produce向Broker发送消息后马上返回,无需等待写是否成功,效率最高但不能保证消息被成功接收且写入磁盘。

1:Produce向Broker发送消息后需要等待leader partition写入成功才会返回,不能保证follower partition写入成功,在相对高效的情况下保证至少写入成功一个节点。

-1:Produce向Broker发送消息后需要等待所有的partition写成功后才会返回,容错性高效率低,特别是在写入某个节点较慢时。

2)数据多副本

​ partition中存在多个副本其中一个为leader,对外提供读写请求,其余为follower,不对外提供读写请求,只是同步leader中的数据,当leader出现问题时,通过选举算法将其中一个选举为leader。

​ Kafka Broker的负载均衡实际上是对leader partition的负载均衡,保证leader partition在各个Broker上的数目尽可能相近。

3)高效的持久化机制

​ 为了应对大数据的场景,Kafka Broker直接将数据写入磁盘而不是内存。

​ Kafka Broker利用顺序写的方式写入磁盘,并结合offset方式大大提高了写的效率。

4)数据优化传输

批处理:为了降低单条消息传输带来的网络开销,Broker将多条消息组装在一起。Kafka对数据格式进行统一设计,避免数据格式转换带来的开销。

zero-copy:通常情况下,从磁盘中读取数据并发送出去需要经过4次拷贝(内核态->用户态应用->内核态->网卡),两次系统调用。

​ 通过zero-copy技术优化后,只需要经过3次拷贝(内核态->内核态->网卡),无需任何系统调用,大大提高发送效率。

可控的消息传递语义:

at most once:生产者在给消费者发送消息后就返回,这种情况下消费者可能成功接收到消息,也可能丢失。

at least once:生产者在给消费者发送消息后需要等待确认,如没确认则重新发送消息,这种情况下能保证消费者接收,但可能重复接收。

exactly once:消费者会且只会处理一次处理过的消息。

10、保证数据时序性

Broker能保证同一topic下的同一partition内数据有序,无法保证partition之间的数据全局有序。

1)所以应该把要保证时序性的数据放在同一partition内。

2)topic只有一个partition,保证了这个topic中所有数据有序。

内容来源书籍:《大数据技术体系详解 原理、架构与实践》 --董西成

Kafka原理笔记的更多相关文章

  1. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  2. Kakfa揭秘 Day1 Kafka原理内幕

    Spark Streaming揭秘 Day32 Kafka原理内幕 今天开始,会有几天的时间,和大家研究下Kafka.在大数据处理体系中,kafka的重要性不亚于SparkStreaming.可以认为 ...

  3. kafka 入门笔记 #1

    kafka 入门笔记(#1) 单机测试 下载版本,解压 tar -xzf kafka_2.11-0.10.1.1.tgz cd kafka_2.11-0.10.1.1 启动服务 Kafka用到了Zoo ...

  4. kafka原理和实践(一)原理:10分钟入门

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  5. kafka原理和实践(二)spring-kafka简单实践

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  6. kafka原理和实践(六)总结升华

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  7. kafka原理简介并且与RabbitMQ的选择

    kafka原理简介并且与RabbitMQ的选择 kafka原理简介,rabbitMQ介绍,大致说一下区别 Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和 ...

  8. kafka原理和实践(三)spring-kafka生产者源码

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  9. kafka原理和实践(四)spring-kafka消费者源码

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

随机推荐

  1. [Linux]Ansible自动化运维① - 入门知识

    目录 一.Ansible 概述 1.1 Ansible 是什么 1.2 Ansible 优势 1.3 Ansible 特性 二.Ansible 入门 2.1 Ansible 架构 2.2 Ansibl ...

  2. 企业该选择什么样的CRM系统

    不论您是需要CRM系统来优化业务流程,还是准备更换一款新的CRM系统,在这之前都应该先明确企业的需求,并了解CRM的哪些功能能够对企业有所帮助.例如,企业的管理者想了解每个销售人员的业绩情况,那么就应 ...

  3. mybatis源码简单分析

    mybatis入门介绍 /** * 1. 接口式编程 * 原生: Dao =====> DaoImpl * mybatis : Mapper =====> xxxMapper * 2. S ...

  4. 如何查看wsdl文档

    http://www.360doc.com/content/16/1027/00/37651083_601648996.shtml

  5. linux下的压缩命令 tar zip gunzip

    p.p1 { margin: 0; font: 12px Arial; color: rgba(5, 42, 136, 1) } p.p2 { margin: 0; font: 12px " ...

  6. php+swoole多线程的操作

    多个任务同时执行 比如,我们要对已知的用户数据进行判断,是否需要发送邮件和短信,如果需要发送则发送. 不使用多进程时,我们首先判断是否发送邮件,如果需要则发送:然后再判断是否需要发送短信,如果需要则发 ...

  7. FastTunnel-内网穿透原理揭秘

    之前写了一篇关于GVP开源项目FastTunnel的一篇介绍 <FastTunnel-开源内网穿透框架>,只简单介绍了使用方法,不少伙伴对其原理表示好奇,今天画抽空了一下其内部实现原理流程 ...

  8. Linux | 命令的参数

    命令的参数 格式:command parameters --> 命令参数 短参数 在短参数中,字母的大写效果是不同的,比如大写 T 和小写 t 的含义通常是不同的. 一个短参数 最常用的参数形式 ...

  9. 前端009-vue框架

    vue-admin-element https://panjiachen.github.io/vue-element-admin-site/zh/ 基于vue的生态做的很好,提供的很多的文档,中文.并 ...

  10. Spring Boot(一):如何使用Spring Boot搭建一个Web应用

    Spring Boot Spring Boot 是Spring团队旗下的一款Web 应用框架 其优势可以更快速的搭建一个Web应用 从根本上上来讲 Spring Boot并不是什么新的框架技术 而是在 ...