kafka是消息中间件的一种,是一种分布式流平台,是用于构建实时数据管道和流应用程序。具有横向扩展,容错,wicked fast(变态快)等优点。
kafka中涉及的名词:
- 消息记录(record): 由一个key,一个value和一个时间戳构成,消息最终存储在主题下的分区中, 记录在生产者中称为生产者记录(ProducerRecord), 在消费者中称为消费者记录(ConsumerRecord),Kafka集群保持所有的消息,直到它们过期, 无论消息是否被消费了,在一个可配置的时间段内,Kafka集群保留所有发布的消息,不管这些消息有没有被消费。比如,如果消息的保存策略被设置为2天,那么在一个消息被发布的两天时间内,它都是可以被消费的。之后它将被丢弃以释放空间。Kafka的性能是和数据量无关的常量级的,所以保留太多的数据并不是问题。
- 生产者(producer): 生产者用于发布(send)消息
- 消费者(consumer): 消费者用于订阅(subscribe)消息
- 消费者组(consumer group): 相同的group.id的消费者将视为同一个消费者组, 每个消费者都需要设置一个组id, 每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费
- 主题(topic): 消息的一种逻辑分组,用于对消息分门别类,每一类消息称之为一个主题,相同主题的消息放在一个队列中
- 分区(partition): 消息的一种物理分组, 一个主题被拆成多个分区,每一个分区就是一个顺序的、不可变的消息队列,并且可以持续添加,分区中的每个消息都被分配了一个唯一的id,称之为偏移量(offset),在每个分区中偏移量都是唯一的。每个分区对应一个逻辑log,有多个segment组成。
- 偏移量(offset): 分区中的每个消息都一个一个唯一id,称之为偏移量,它代表已经消费的位置。可以自动或者手动提交偏移量(即自动或者手动控制一条消息是否已经被成功消费)
- 代理(broker): 一台kafka服务器称之为一个broker
- 副本(replica):副本只是一个分区(partition)的备份。 副本从不读取或写入数据。 它们用于防止数据丢失。
- 领导者(leader):Leader 是负责给定分区的所有读取和写入的节点。 每个分区都有一个服务器充当Leader, producer 和 consumer 只跟 leader 交互
- 追随者(follower):跟随领导者指令的节点被称为Follower。 如果领导失败,一个追随者将自动成为新的领导者。 跟随者作为正常消费者,拉取消息并更新其自己的数据存储。replica 中的一个角色,从 leader 中复制数据。
- zookeeper:Kafka代理是无状态的,所以他们使用ZooKeeper来维护它们的集群状态。ZooKeeper用于管理和协调Kafka代理
kafka功能
发布订阅:生产者(producer)生产消息(数据流), 将消息发送到到kafka指定的主题队列(topic)中,也可以发送到topic中的指定分区(partition)中,消费者(consumer)从kafka的指定队列中获取消息,然后来处理消息。
流处理(Stream Process): 将输入topic转换数据流到输出topic
连接器(Connector) : 将数据从应用程序(源系统)中导入到kafka,或者从kafka导出数据到应用程序(宿主系统sink system), 例如:将文件中的数据导入到kafka,从kafka中将数据导出到文件中
kafka中的消息模型
队列:同名的消费者组员瓜分消息
发布订阅:广播消息给多个消费者组(不同名)
知识点总结:
1. kafka主要特征
kafka具有近乎实时性的消息处理能力,面对海量数据,高效的存储消息和查询消息。kafka将消息保存在磁盘中,以顺序读写的方式访问磁盘,从而避免了随机读写磁盘导致的性能瓶颈
kafka支持批量读写消息,并且对消息批量压缩,提高了网络利用率和压缩效率
kafka支持消息分区,每个分区中的消息保证顺序传输,而分区之间可以并发操作,提高了kafka的并发能力
kafka支持在线增加分区,支持在线水平扩展
kafka支持为每个分区创建多个副本,其中只会有一个leader副本负责读写,其他副本只负责与leader副本同步,这种方式提高了数据的容灾能力,kafka会将leader副本均匀的分布在集群中的服务器上,实现性能最大化。
优点:
通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
高吞吐量 :即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
支持通过Kafka服务器和消费机集群来分区消息。
支持Hadoop并行数据加载。
kafka依赖zk,kafka的集群管理,负载均衡由zk实现。
另一观点:
快速:单一的Kafka代理可以处理成千上万的客户端,每秒处理数兆字节的读写操作。
可伸缩:在一组机器上对数据进行分区和简化,以支持更大的数据
持久:消息是持久性的,并在集群中进行复制,以防止数据丢失。
设计:它提供了容错保证和持久性
2.kafka的应用场景:
日志收集:一个公司的各种应用都可以作为生产者将日志吐到kafka,再由hbase,solr,es等来消费kafka的日志作统计,查错。
消息系统:解耦和生产者和消费者、缓存消息等。
用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告
3. kafka主题分区的作用
kafka的每个topic都可以分为多个partition,每个partition都有多个replica(副本),每个分区中的消息是不同的,提高了并发读写的能力,而同一分区的不同副本中保存的是相同的消息,副本之间是一主多从关系,其中leader副本处理读写请求,follower副本只与leader副本进行消息同步,当leader副本出现故障时,则从follower副本中重新选举leader副本对外提供服务。这样,通过提高分区的数量,就可以实现水平扩展,通过提高副本数量,就可以提高容灾能力
4. consumer水平扩展如何实现
kafka支持consumer水平扩展,可以让多个consumer加入一个consumer group,在一个consumer group中,每个分区只能分配给一个consumer,当kafka服务端增加分区数量进行水平扩展后,可以向consumer group中增加新的consumer来提高整个consumer group的消费能力,当consumer group 中的一个consumer出现故障下线时,会通过rebalance操作下线consumer,它负责处理的分区将分配给其他consumer。。。
5. 消息的顺序
kafka保证一个partition内消息是有序的,但是并不保证多个partition之间的数据有顺序,每个topic可以划分成多个分区,同一个topic下的不同分区包含的消息是不同的,每个消息在被添加到分区时,都会被分配一个offset,它是此消息在分区中的唯一编号,kafka通过offset保证消息在分区内的顺序,offset顺序不跨分区,即kafka只保证在同一个分区内的消息是有序的
6. 为了避免磁盘被占满,kafka会周期性的删除陈旧的消息,删除策略是什么
一种是根据消息保留的时间
一种是根据topic存储的数据大小
7. 什么是日志压缩
在很多场景中,消息的key与value之间的对应关系是不断变化的,消费者只关心key对应的最新value,此时,可以开启kafka的日志压缩功能,kafka会在后台启动一个线程,定期将相同key的消息进行合并,只保留最新的value值
8. 什么是broker?作用是什么?
一个单独的kafka server就是一个broker,broker主要工作就是接收生产者发过来的消息,分配offset,之后保存到磁盘中。同时,接收消费者、其他broker的请求,根据请求类型进行相应的处理并返回响应,在一般的生产环境中,一个broker独占一台物理服务器。
9. 同一分区的多个副本包括的消息是否一致?
每个副本中包含的消息是一样的,但是再同一时刻,副本之间并不是完全一样的
10. ISR集合是什么?谁维护着?如何维护?
ISR(In-Sync Replica)集合表示的是目前可用并且消息量与leader相差不多的副本集合,这是整个副本集合的一个子集
ISR集合的副本必须满足:副本所在节点必须维持着与zookeeper的连接;副本最后一条消息的offset与leader副本最后一条消息的offset之间的差值不能超出指定的阈值
每个分区的leader副本都会维护此分区的ISR集合,写请求首先由leader副本处理,之后follower副本会从leader副本上拉取写入的消息,这个过程会有一定的延迟,导致follower副本中保存的消息略少于leader副本,只要未超出阈值都是可以容忍的。
ISR应该总是包含所有的副本,直到出现真正的故障。如果一个副本从leader中脱离出来,将会从ISR中删除。
11.kafka 保证消息不丢失。原因如下有:
1)生产者如果异步发送,会造成消息丢失,发送的过程中kafka会先把消息缓存起来。然后批量发送。 若批量发送之前client宕机会造成消息丢失。生产者不丢失消息需要同步发送
2)kafka服务器默认异步刷盘,先刷到系统页缓存,然后再刷新到日志文件。页缓存的数据可能会丢失。解决可以同步的方式刷盘,但是这样效率很低,比rabbitmq低。
对于我说的第二点有点问题。在配置ack=all , lsr=2 是 ,可以保证页缓存数据不丢失。
结论:如果想要确保消息不丢失,需要kafka producer配置成同步方式。选用rabbitmq
消息系统的使用
1.解耦:在开始开发时,可以将产出的不一定明确的数据放入消息系统,这样可以保证最大程度的解耦和性,如果事soa或者微服务架构的话,其他模块想要有交集的时候直接去访问消息系统就可以,两个系统之间会保证独立,不回产生交集。
2.缓冲:数据可以不必直接存入数据库,这样减少了数据库的压力,小程度的减少了成本。
3.异步:生产者可以直接将数据放入消息系统不必立即处理,等待其他消费者来接收和处理数据。
4.顺序保证:大多数消息队列都是顺序的,保证了数据的顺序性。
各种消息系统
kafka:快速持久化,高可用,分布式,订阅式,高吞吐量,系统开销据说是0(1),我也看不出来。。。是由zk管理的,zk会从所有节点中选出一个leader来,负载均衡估计做的也很好,每个partition中的消息是顺序消费的。
activeMq:没用过,
rabbitMq:对路由比较好吧,封装好之后由用户去配置路由,消息会达到指定的地方。
redis:一个内存数据库,kv型的,轻量级的,如果数据个体小应该会很快。
12.Kafka服务器能接收到的最大信息是多少?
Kafka服务器可以接收到的消息的最大大小是1000000字节。
13.解释Kafka的Zookeeper是什么?我们可以在没有Zookeeper的情况下使用Kafka吗?
Zookeeper是一个开放源码的、高性能的协调服务,它用于Kafka的分布式应用。
不,不可能越过Zookeeper,直接联系Kafka broker。一旦Zookeeper停止工作,它就不能服务客户端请求。
Zookeeper主要用于在集群中不同节点之间进行通信
在Kafka中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取
除此之外,它还执行其他活动,如: leader检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。
14.解释Kafka的用户如何消费信息?
在Kafka中传递消息是通过使用sendfile API完成的。它支持将字节从套接口转移到磁盘,通过内核空间保存副本,并在内核用户之间调用内核。
15、解释如何提高远程用户的吞吐量?
如果用户位于与broker不同的数据中心,则可能需要调优套接口缓冲区大小,以对长网络延迟进行摊销。
16、解释一下,在数据制作过程中,你如何能从Kafka得到准确的信息?
在数据中,为了精确地获得Kafka的消息,你必须遵循两件事: 在数据消耗期间避免重复,在数据生产过程中避免重复。
这里有两种方法,可以在数据生成时准确地获得一个语义:
每个分区使用一个单独的写入器,每当你发现一个网络错误,检查该分区中的最后一条消息,以查看您的最后一次写入是否成功
在消息中包含一个主键(UUID或其他),并在用户中进行反复制