Kafka

什么是kafka?

  * 在证券交易所、银行和保险业中,处理实时支付和金融交易的能力过强。
  * 实时跟踪和监控汽车、卡车、车队和货物,如物流和汽车行业。
  * 从物联网设备或其他设备(如工厂和风电场)持续捕获和分析传感器数据。
  * 收集并立即响应客户的互动和订单,如零售业、酒店和旅游业以及移动应用程序。
  * 对住院病人进行监护,预测病情变化,确保紧急情况下及时治疗。
  * 连接、存储和提供公司不同部门产生的数据。
  * 作为数据平台、事件驱动架构和微服务的基础。

kafka有哪些特点?

kafka的基本架构?

* event: 一个事件记录了世界上或你的生意中“发生了什么事”的事实。在文档中也称为记录或消息。当你读或写数据给kafka,你这样做的形式是事件。从概念上讲,事件具有键、值、时间戳和可选的元数据头

* Producers: 是那些将事件发布(写入)到Kafka的客户机应用程序

* Consumers: 消费者是那些订阅(读取和处理)这些事件的应用程序。

在Kafka中,生产者和消费者完全解耦,彼此不可知,这是实现Kafka所熟知的高可伸缩性的关键设计元素。例如,生产者从不需要等待消费者。卡夫卡提供了各种各样的保证,比如能够精确地处理一次事件

* Topics: 类似于文件系统中的文件夹,事件就是该文件夹中的文件;事件被组织并持久地存储在Topic中。
* 一个Topic可以有零个、一个或多个生产者向其写入事件,也可以有零个、一个或多个消费者订阅这些事件

* Partition: 是物理上的概念,此处是kafka将一个topic的存放到多个partition,

kafka的工作原理?

  * 以集群的形式运行,可以包含一个或者多个server,这些server可以部署在多个云region或者数据中心
  * 其中一些服务器形成了存储层,称为代理。
  * 其他服务器运行Kafka Connect以持续导入和导出数据作为事件流,从而将Kafka与现有系统(如关系数据库以及其他Kafka集群)集成。
  * 为了让您实现任务关键型用例,Kafka集群具有高度的可伸缩性和容错性:如果它的任何一台服务器发生故障,其他服务器将接管它们的工作,以确保连续操作而不丢失任何数据。
 * 它们允许您编写分布式应用程序和微服务
 * 这些应用程序和微服务以并行、大规模和容错的方式读取、写入和处理事件流
 * 即使在出现网络问题或机器故障的情况下也是如此。
 * kafka包括一些如上描述的Clients,这是由kafka社区提供的几十个客户端扩充的:客户端可以用于java和scala,包括更高级别的kafka流库,如GO、Python、C/C++、以及许多其他编程语言以及REST API

kafka消息会不会丢失,如何保证不丢失?

 at most once
 at least once
 exectly-once

从生产者的角度看: * 使用in-sync方式,可以设置至少有一个副本同步成功,才返回发送成功,保证即使leader失败,消息也不会丢失。

kafka如何存储数据?

kafka如何保证高可用?

创建大量topic会不会影响kafka性能?

kafka如何发送消息,如何分配发送线程?

kafka如何消费消息,如何分配消费线程?

kafka与rocketmq与rabbitmq相比有哪些优缺点?

kafka如何rebalance

  组成员个数发生变化。例如有新的 consumer 实例加入该消费组或者离开组。
  订阅的 Topic 个数发生变化。
  订阅 Topic 的分区数发生变化

ISR原理

 1.producer联系zk识别leader
 2.向leader发送消息
 3.leadr收到消息写入到本地log
 4.follower从leader pull消息
 5.follower向本地写入log
 6.follower向leader发送ack消息
 7.leader收到所有follower的ack消息
 8.leader向producer回传ack
 和同步复制的区别在于,leader写入本地log之后,直接向client回传ack消息,不需要等待所有follower复制完成。

kafka的应用场景

Kafka 2.7 官方文档

kafka为什么要在topic里加入分区的概念

kafka 如何保证高性能

* Page Cache,其中文名称为页高速缓冲存储器,简称页高缓。page cache的大小为一页,通常为4K。在Linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问。 是Linux操作系统的一个特色。

使用Page Cache的好处如下

- I/O Scheduler会将连续的小块写组装成大块的物理写从而提高性能
- I/O Scheduler会尝试将一些写操作重新按顺序排好,从而减少磁盘头的移动时间
- 充分利用所有空闲内存
- 读操作可直接在Page Cache内进行。如果消费和生产速度相当,甚至不需要通过物理磁盘(直接通过Page Cache)交换数据

* Kafka收到数据后,写磁盘时只是将数据写入Page Cache,并不保证数据一定完全写入磁盘。从这一点看,可能会造成机器宕机时,Page Cache内的数据未写入磁盘从而造成数据丢失。但是这种丢失只发生在机器断电等造成操作系统不工作的场景,而这种场景完全可以由Kafka层面的复制机制去解决。如果为了保证这种情况下数据不丢失而强制将Page Cache中的数据Flush到磁盘,反而会降低性能。

* 如果数据消费速度与生产速度相当,甚至不需要通过物理磁盘交换数据,而是直接通过Page Cache交换数据。同时,Follower从Leader Fetch数据时,也可通过Page Cache完成
* Linux 2.4+内核通过sendfile系统调用,提供了零拷贝。数据通过DMA拷贝到内核态Buffer后,直接通过DMA拷贝到NIC Buffer,无需CPU拷贝。这也是零拷贝这一说法的来源。除了减少数据拷贝外,因为整个读文件-网络发送由一个sendfile调用完成,整个过程只有两次上下文切换,因此大大提高了性能。

* 从具体实现来看,Kafka的数据传输通过Java NIO的FileChannel的transferTo和transferFrom方法实现零拷贝

备注:从文件到socket的数据传输过程(有两次系统调用)

1. 操作系统从磁盘读数据到内核空间的pagecache;
2. 应用从内核空间读取数据到用户空间的buffer;The application reads the data from kernel space into a user-space buffer
3. 应用程序将数据写回内核空间到套接字缓冲区 The application writes the data back into kernel space into a socket buffer
4. 操作系统从套接字缓冲区复制数据到NIC buffer The operating system copies the data from the socket buffer to the NIC buffer where it is sent over the network
 * 发送端压缩,消费者解压缩
 * 支持GZIP,LZ4以及标准的压缩协议

如何判断kafka 节点存活

 是否与zk维持session
 如果是follower必须和复制leader,并且不能与leader相差太远,如果follower与leader滞后台远,则leader会将follower剔除,滞后参数为:replica.lag.time.max.ms