消息队列有了解过么?
答:Kafka是一个消息队列,可以实现发布订阅模式,在异步通信或者生产者和消费者之间需要解耦的场景经常使用,可以对数据流进行处理等。
Kafka为什么这么快?
- 顺序读写磁盘:消息在磁盘中的方式是顺序读写的,磁盘的顺序读写速度超过内存的随机读写
- 页缓存:页缓存是操作系统实现的一种主要的磁盘缓存,一次用来减少对磁盘I/O的操作。
- 零拷贝:零拷贝是指数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手,零拷贝大大提升了应用程序的性能,减少了内核和用户模式之间的上下文切换。
Kafka的特性?
- 支持批量读写消息
- 支持消息的快速持久化
- 支持消息分区,并且支持在线增加分区,提高了并发能力
- 支持为每个分区创建多个副本
Kafka中的核心概念?
- 生产者(Producer):生产消息,并且按照一定的规则(分区分配规则)推送到Topic分区中
- 消费者(Consumer):从Topic中拉去消息并进行消费,消费者自行维护消费消息的位置(offset)
- 主题(Topic):存储消息的逻辑概念,是一个消息集合,Kafka根据topic对消息进行归类,发布到Kafka集群的每个消息都需要指定一个topic
- 分区(Partition):每个Topic可以划分为多个分区,每个消息在分区中都会有唯一编号的offset,Kafka通过offset保证消息在分区中的顺序,同一Topic的不同分区可以分配在不同的Broker上。
- 副本(replica):Kafka对消息进行冗余备份,每个分区有多个副本,每个副本中包含的消息是一样的,每个副本都会选举出一个Leader副本,其余为Follower副本,Follower副本仅仅是将数据从Leader副本拉到本地,然后同步到自己的Log中。
- 消费者组(Consumer Group):每个Consumer都属于一个Consumer Group,每个消息只能被consumer group中的一个Consumer消费,但可以被多个consumer group消费。
- Broker:一个单独的Server就是一个Broker,主要用来接收生产者发送过来的消息,分配offset,并且保存到磁盘中。
- Cluster&Controller
简单介绍下Kafka的副本机制?
在分布式的存储中,进行冗余备份是一种常见的设计,主要的设计方案有同步复制和异步复制。
同步复制:当所有的follower副本都将消息复制完成,这条消息才会被认为是提交完成,一旦有一个follower副本出现故障,就会导致消息无法提交,极大地影响了系统的性能。
异步复制:当Leader副本接收到生产者发送的消息后就认为当前消息提交成功,follower副本异步的从Leader副本同步消息,但是不可以保证同步速度,当leader副本突然宕机的时候,可能follower副本的消息落后太多,导致消息的丢失。
kafka引入了ISR集合:ISR集合表示“当前”,“可用”且消息量与Leader相差不多的副本集合,需要满足如下条件:
- 副本所有节点必须维持着与Zookeeper的链接
- 副本最后一条信息的offset与Leader副本的最有一条消息的offset之间的差值不能超过指定的阈值。
优点:
- 同步复制会导致高延迟,异步复制可能会造成消息的丢失;
- Kakfa引入的ISR集合解决了同步复制和异步复制的缺点
- 当Follower副本延迟过高时,会被踢出ISR集合,避免了高延迟的Follower副本影响整个kafka集群的性能
- 当Leader副本所在的Broker宕机,会优先将ISR集合中的Follower副本选举为Leader。
Kafka消息传输的三大语义:
- At most once:最多一次,消息可能会丢失,但是绝对不会重复传输。
- At least once:最少一次,消息绝不会丢失,但有可能会重复
- Exactly once:恰好一次,每条消息可宁会被传输一次而且仅传输一次。
Kafka中关于可靠性的配置:
答:kafka中有一些关于可靠性配置的参数,
request.required.acks:当producer向leadrt发送数据时,可以通过request.required.acks参数来设置数据可靠性的级别:
- 1(默认):这意味着producer在ISR的leader已成功收到数据并得到确认,如果Leader宕机,则会丢失数据
- 0:这意味着producer无需等待来自broker的确认而继续发送下一批消息。这种情况下数据传输效率最高,但数据可靠性是最低的。
- -1:producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。但是这样也不能保证数据不丢失。比如当ISR中只有leader时,(ISR的成员由于某些情况会增加也会减少,最后就剩下一个leader),这样就变成ack=1的情况。
消息队列篇
原文:https://www.cnblogs.com/shine-rainbow/p/12452284.html