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连接到已经存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表的所有变更内容。
- Connector API
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监控管理