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. 10、Jenkins配置

    10.0.服务器说明: 服务器名称 ip地址 slave-node1 172.16.1.91 10.1.持续集成: 1.什么是持续集成: 持续集成是一种软件开发时实践,即团队开发成员经常集成他们的工作 ...

  2. APDU:APDU常用指令

    APDU= ApplicationProtocol data unit, 是智能卡与智能卡读卡器之间传送的信息单元, (给智能卡发送的命令)指令(ISO 7816-4规范有定义) CLA INS P1 ...

  3. Docker:docker部署Sqlite3数据库

    1.依赖Ubuntu系统安装sqlite3生成镜像 dockerfile文件 FROM ubuntu:trusty RUN sudo apt-get -y update RUN sudo apt-ge ...

  4. Netty实现对Websocket的支持

    一.WebSocket的简介及优势 WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准.WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的 ...

  5. php结合redis实现高并发下的抢购、秒杀功能 (转)

      抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易 ...

  6. Linux学习之路第十天(网路配置)

    网路配置 Linux配置原理图(含虚拟机) 目前我们的网路配置采用NAT. 2.查看网络ip和网关 查看虚拟网络编辑器 修改ip地址(修改虚拟网卡的ip) 修改就完事了. 3.查看网关 Linux网络 ...

  7. XCTF_RE-Crc-300

    这题讲道理其实还算简单的,还以为是啥算法呢..吓我一跳..拖入ida之后,发现逻辑还是挺清晰的 这个是关键函数,第一个if就可以求出后10个字符是啥了.. 接下就是对一个列表的赋值,然后就是一个dow ...

  8. fastposter发布1.4.2 跨语言的海报生成器

    fastposter发布1.4.2 跨语言的海报生成器 fastposter发布1.4.2 跨语言的海报生成器,一分钟完成海报开发 future: 完善docker镜像 引入异步asyncio 升级p ...

  9. 「AGC025D」 Choosing Points

    「AGC025D」 Choosing Points 神仙构造题. 首先你会尝试暴力做,先随便选一个点,然后把当前能选得全选上,然后你发现这样样例都过不了. 然后我们可以这样考虑:你把距离为 \(\sq ...

  10. 你觉得我的这段Java代码还有优化的空间吗?

    上周,因为要测试一个方法的在并发场景下的结果是不是符合预期,我写了一段单元测试的代码.写完之后截了个图发了一个朋友圈,很多人表示短短的几行代码,涉及到好几个知识点. 还有人给出了一些优化的建议.那么, ...