一、什么是Kafka
一、概述
- Kafka是发布订阅模式的消息队列
- Kafka是由LinkedIn(领英)公司开发后来贡献给了Apache的消息队列
- Kafka的特征:
- 发布和订阅消息流
- 在存储消息流的时候要提供容错机制
- 当数据流出现的时候能够及时处理
- Kafka的应用场景:
- 能够在系统或者应用之间构建可靠的数据传输的实时流管道
- 能够构建一个转化或者应对数据流的实时流应用
- Kafka是利用了Scala语言构建的,Scala天然支持并发和吞吐,保证Kafka的并发量和吞吐量是比较高的,实际过程中,Kafka的吞吐量是在60~80M/s - Kafka底层采用了零拷贝的技术
- Kafka在收到数据之后会把数据写入本地磁盘上保证数据不丢失。默认情况下,Kafka不会清理写入的数据
- Kafka中不存在单点故障
- Kafka集群中可以随时动态增删节点
- Kafka中存在副本策略
二、Kafka的基本概念
- broker:
- 就表示Kafka中的节点
- 每一个broker都需要给一个编号,这个编号只要不相同的就可以
- topic:
- 作用是用于对数据进行分类的
- 在Kafka中,每一条数据都要发送到一个指定主题中
- 每一个主题对应一个到多个partition
- 当删除主题的时候,这个主题所对应的目录并不会被立即删除,而是被标记为删除状态,等待一分钟左右会将标记的目录删除
- 如果需要删除操作立即生效,需要将delete.topic.enable设置为true
在config目录下的server。。。。文件
- partition:
- 每一个partition对应一个目录
- 如果有多个Kafka节点,分区会平均分到每一个节点上,这样设计的目的是为了提高Kafka的吞吐量
- 如果出现了多个分区,则数据在向分区中写入的时候是轮训写入
- replicas:
- Kafka中,为了保证数据的可用,可以去设置多个副本
- 如果设置了多个副本,则副本是以分区为单位进行备份
- leader和follower
- 在Kafka中,如果设置了多个副本,则副本之间会自动通过Controller进行选举,选举出一个leader副本以及其他的follower副本
- 注意:leader和follower是指的副本之间的主从关系而不是Kafka节点之间的主从关系
- Producer和Consumer只和leader副本进行交互,不会和follower副本进行交互
- Controller:
- 用于进行leader副本和follower副本的选举
- Controller会在某一个Kafka节点上
- 如果Controller宕机,那么Zookeeper会在其他的Kafka节点上再来启动一个Controller进程
- Consumer Group:
- 默认情况下,每一个消费者对应一个消费者组
- 一个消费者组中可以包含1个到多个消费者
- 同一条消息可以被不同的消费者组订阅,但是同一个组内的消费者只能有一个去消费这个消息 - 组间共享,组内竞争
三、Kafka指令及数据同步
一、指令
指令
二、数据同步
- 生产者将数据写到leader副本上
- follower副本会给leader发送消息询问是否有需要更新的数据
- leader会把需要更新的数据发送给follower,并且等待follower的反馈
- 如果follower记录成功,则返回一个ack信号
- leader收到ack之后,会把follower副本所在的brokerid放入ISR队列中
- ISR是维系在Zookeeper上的,一旦leader副本lost,则Controller会优先从ISR中选择一个副本成为leader
四、Kafka和MQ的区别
Kafka和MQ的区别(这里从四个方面来讲解)
1)在架构模型方面,
RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制。
kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据;无消息确认机制。
2)在吞吐量,
rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘。
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。
3)在可用性方面,
rabbitMQ支持miror的queue,主queue失效,miror queue接管。
kafka的broker支持主备模式。
4)在集群负载均衡方面,
rabbitMQ的负载均衡需要单独的loadbalancer进行支持。
kafka采用zookeeper对集群中的broker、consumer进行管理,可以注册topic到zookeeper上;通过zookeeper的协调机制,producer保存对应topic的broker信息,可以随机或者轮询发送到broker上;并且producer可以基于语义指定分片,消息发送到broker的某分片上。
五、什么是零拷贝
零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。
零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。而且,零拷贝技术减少了用户应用程序地址空间和操作系统内核地址空间之间因为上下文切换而带来的开销。进行大量的数据拷贝操作其实是一件简单的任务,从操作系统的角度来说,如果 CPU 一直被占用着去执行这项简单的任务,那么这将会是很浪费资源的;如果有其他比较简单的系统部件可以代劳这件事情,从而使得 CPU 解脱出来可以做别的事情,那么系统资源的利用则会更加有效。综上所述,零拷贝技术的目标可以概括如下:
避免数据拷贝
①避免操作系统内核缓冲区之间进行数据拷贝操作。
②避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作。
③用户应用程序可以避开操作系统直接访问硬件存储。
④数据传输尽量让 DMA 来做。
将多种操作结合在一起
①避免不必要的系统调用和上下文切换。
②需要拷贝的数据可以先被缓存起来。
③对数据进行处理尽量让硬件来做。