KAFKA讲解

1.简介

kafka是linkedin使用Scala编写具有高水平扩展和高吞吐量的分布式消息系统。
kafka 对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。
无论kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性,为集群保存一些meta信息。
用scala高水平扩展
kafka唯一根据Topic进行归类。
主流MQ对比
在这里插入图片描述

从吞吐量上说 Kafka>RockMQ>RabbitMQ>ActiveMQ
大数据量的情况下一般用Kafak和RockMQ因为擅长支持集群,ActiveMQ和RabbitMQ不擅长,即使集群的情况下不支持动态扩容。落地情况kafka和RockMQ存储到磁盘,可以支持持久比如过几天访问可以访问到。从可靠性,一致性 (RocketMQ事务支持的比较好,kafka不是很好)RockeMQ>kafka 比如如日志的情况下可以用Kafka丢一2条数据可以,金融情况下用RocketMQ。

1.1kafka主要特性:

kafka是一个流处理平台,流平台需要如下特性:

  • 可以发布和订阅流数据,类似于消息队列或者企业级消息系统。
  • 可以容错的方式存储流数据。
  • 可以在流数据产生时就进行处理。
    kafka适合什么样的场景?
  • 基于kafka,构造实时流数据管道,让系统或应用之间可靠地获取数据。
  • 构建实时流式应用程序,处理流数据或基于数据做出反应。
    patition:为了让数据能够均匀分布于多台集群,将数据进行分片,每个parttion是一个顺序地,不可变地record序列,parttion中地record会被分配一个自增长地id,我们成为offset。
    reolication:实际上是对数据备份,可以帮我们提高数据的可靠性,可以提高并发度:既可以读取分片和备份信息
    同一partion有序(数据往后面追加偏移量),不同partion无序,消费不同分区不知道是哪一个分区,从整个topic层面,kafka的数据顺序丢失
    在分区加上offset能确认唯一一条数据。
    Record每条记录都有key、value、timestamp三个信息,key在kafka中并不能通过key检索数据,value真正想要存储到kafka当中地数据。
    在这里插入图片描述
    kafka异常重启consumer时通过记录消费话题记录开始消费。

1.2Kafka核心API

四个核心API

  • Producer API
    允许一个应用程序发布一串流式地数据到一个或多个Kafka topic.

  • Consumer API
    允许一个应用程序订阅一个或多个topic,并且对发布给他们的流式数据进行处理。

  • Streams API
    允许一个应用程序作为一个流处理器,消费一个或者多个topic 产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。

    • Connector API
      运行构建并运行可重用的生产者或消费者,将Kafka topics连接到已经存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表的所有变更内容。

Producer API
Producer 会为每个partition维护一个缓冲,用来记录还没有发送的数据,每个缓冲区大小用batch.size指定,默认值为16k.
linger.ms为,buffer中的数据在达到batch.size前需要等待的时间
acks用来配置请求成功的标准。
在这里插入图片描述
在这里插入图片描述

2.kafka使用场景

2.1消息系统

消息系统被用于各种场景,如何解耦数据生产者,缓存未处理的消息。kafka可作为传统的消息系统的替代者,与传统消息系统相比,kafka有更好的吞吐量、更好的可用性,这有利于处理大规模的消息。
根据经验,通常消息传递对吞吐量要求较低,但可能要求较低的端到端延迟,并经常依赖kafka可靠durable机制。
这方面,kafka可以与传统的消息传递系统(ActiveMQ和RabbitMQ)

2.2日志聚合

日志系统一般需要如下功能:日志的收集、清洗、聚合、存储、展示。

kafka常用来替代其他日志聚合解决方案。
和Scribe、Flume相比,kafka提供同样的性能、更健壮的堆积保障、更低的端到端延迟。
日志落地,导致kafka做日志聚合更昂贵。

kafka可实现日志的清洗(需要编码)、聚合(可靠但昂贵)、存储。
ELK是现在比较流行的日志系统。在kafka的配合下才更成熟的方案,kafka在ELK技术栈中,主要起到buffer的作用,必要时可进行日志的汇流。

2.3存储系统

写入到kafak中的数据时落地到了磁盘上,并且有冗余备份,kafak允许producer等待确认,通过配置,可实现知道所有的replication完成复制才算写入成功,这样可保证数据的可用性。

kafka认真对待存储,并允许client自行控制读取位置,你可以认为kafka是一种特殊的文件系统,它能够提高性能、低延迟、高可用的日志提交存储。
在这里插入图片描述

3台和4台都只能down1台效率高些 能down1台效率还高些。

在这里插入图片描述
消费者集群相同自由当groupid相同,才会组成集群且不能重复消费

在这里插入图片描述

zookeeper和客户端保持长连接,通过临时节点可以

在这里插入图片描述
在写入一半成功后,刚好读取未成功的节点时候,读取zk读取flower时候会转发给leander,leader在发起读取,有一半的节点读取数据的时候
在这里插入图片描述

通过zk临时节点建立心跳
在这里插入图片描述

_consumer_offsers只有重启的时候有作用或监控的时候。
在这里插入图片描述

3. kafka问题

3.1kafka数据丢失

   kafka是追加文件后面写的,是有顺序的,数据库mysql,oracle是无序的。而且kafak也有用到内存所以kafka比数据库的快。

kafka会有数据丢失问题影响到了数据的可靠性,保证吞吐量。
解决方案:1.用RocketMQ就是从这一点出发进行的改造,2.进行多个备份,ack=all时候即当一台机器使用也不会丢。
在这里插入图片描述

3.2kafka是基于磁盘的吗?kafka机器不需要消耗内存?

Kafka也是用内存,使用的时操作系统的page cache内存
page cache vsJVM进程内cache内存
1.jvm对象存储松散,通常使数据所占内存加倍,通过OS缓存二进制数据更紧凑
2.用JVM内存cache数据,容易导致GC,使用page cache缓存,不存在GC问题。
3.若JVM维护了进程内存cache,若需要写磁盘,pagecache会在缓存一份,导致内存折半
4.使用JVM进行内存cache,重启broker时需重新加载数据(加载10G的数据,可能需要10min)page cache不需要重新加载。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.3kafka监控管理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值