一, kafka中各组件的作用
(1)zookeeper;负责保存broker集群元数据,并对控制器进行选举等操作。
(2)producer;生产者,生产者负责创建消息,将消息发送到broker。
(3)broker;一个独立的kafka服务器被称作broker,broker负责接受来自生产者的消息,为消息设置偏移量,并将消息存储在磁盘,broker为消费者提供服务,对读取分区的请求做出响应返回已经提交到磁盘的上的消息。
(4)consumer;消费者,消费者负责从broker订阅并消费消息。
(5)consumer group;消费者组,消费者组一个消费者组可以包含一个或多个consumer,使用多分区+多消费者的方式可以极大提高数据下游的处理速度,同一个消费者组中的消费者不会重复消费数据,同样的不同消费者组中的消费者消费消息时互不影响,kafka就是通过消费者组的方式来实现消息P2P模式和广播模式。
(6)topic;主题,kafka中的消息以topic为单位进行划分生产者将消息发送到特定的topic,而消费者负责订阅topic的消息并进行消费。
(7)partition;分区,一个topic可以细分为多个分区每个分区只属于单个主题,同一个主题不同分区包含的消息是不同的,分区在存储层面可以看作是一个可追加的日志文件,消息在被追加到分区日志文件的时候会分配一个特定的偏移量(offset)。
(8)offset;offset是消息在分区中的唯一标识,kafka通过它来保证消息在分区内的顺序性。
(9)replication;副本,是kafka保证数据高可用的方式,kafka同一个partition的数据可以在多broker上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在broker崩溃或发生网络异常,kafka就会在controller的管理下会重新选择新的leader副本对外提供读写服务。
(10)record;实际写入kafka中并可以被读取的消息记录,每个record包含了key,value和timestamp。
(11)leader;每个分区多个副本的“主”leader,生产者发送的对象,以及消费者消费的对象都是leader。
(12)follower;每个分区多个副本中的“从”follower“,实际从leader中同步数据,保持和leader数据的同步,leader发生故障时,某个follower会成为新的leader。
二,kafka是如何做到高吞吐的?
1,磁盘顺序读取
2,零拷贝
3,分区分段+索引
4,批量压缩
5,页缓存技术
三,kafka如何保证对应类型的消息被写到相同的分区?
通过消息键和分区器来实现,分区器为键生成一个offset,然后使用offset对主题分区进行取模,为消息选取分区,这样就可以保证包含同一个键的消息会被写到一个分区上。
1,如果producerRecord没有指定分区,且消息的key不为空,则通过hash算法来计算分区分配。
2,如果producerrecord没有指定分区,且消息的key也是空,则用轮询的方式选择一个分区。
四,kafka是如何实现消息是有序的?有哪些算法?
kafka如何实现消息有序;
生产者;通过分区的leader副本负责数据以先进先出的顺序写入,来保证消息顺序性
消费者;同一个分区内的消息只能被一个group里的一个消费者消费,保证分区内消费有序。如果想要kafka全局有序,那么就设置一个生产者,一个分区,一个消费者
kafka有哪些算法;
轮询策略;将消息顺序分配到各个分区中假设有三个分区,第一天数据写入到分区0,第二条数据写入到分区1,第三条数据写入分区2,第四条数据写入分区0....
随机策略;将消息随机的放到任意一个分区上,本质上看随机策略也是力求将数据均匀地打散到各个分区,但从实际表现来看,它要逊色于轮询策略,所以如果追求数据的均匀分布,还是使用轮询策略比较好。事实上,随机策略是老版本生产者使用的分区策略,在新版本中已经改为轮询策略了
按消息键保序策略:Kafka允许为每条消息创建消息建,称为key,每个key可以代表具体的业务含义,如业务ID,用户ID等。一旦消息被定义了key,那么你就可以保证同一个key的所有消息都进入到相同的分区里面,由于每个分区下的消息处理都是有顺序额,故这个策略被称为按消息键保序策略。
五、简单阐述kafka的ISR机制?如何保证每个应用程序都可以获取到kafka主题中的所有消息,而不是部分消息?
在分区中,所有副本统称为AR(Assigned Replicas)【AR为指定副本】,Leader维护了一个动态的ISR,ISR是指与leader副本保持同步状态的副本集合。当然leader副本本身也是集合中的一员。当ISR中的follower完成数据同步之后,leader就会给follower发送ack,如果其中一个follower长时间未向leader同步数据,该follower将会被踢出ISR集合,该时间阈值由replica.log.time.max.ms参数设定。当leader发生故障后,就会从ISR集合中重新选择出洗的leader。
六、如何保证每个程序都可以获取到Kafka主题中的所有消息,而不是部分消息?
为每个应用程序创建一个消费者组,然后往组中添加消费者来伸缩读取能和处理能力,每个群组消费主题中的消息时,互不干扰。