kafka概念
MQ是什么
消息队列是一种在分布式和大数据开发中的中间件,使用消息队列进行缓冲,系统间的解耦,削峰和填谷
常见的消息队列分为两大类
至多一次:消息生产者将数据写入消息系统,然后由消费者负责去拉取消息服务器中的消息,一旦消息被确认消费之后 ,由消息服务器主动删除队列中的数据,这种消费方式一般只允许被一个消费者消费,并且消息队列中的数据不允许被重复消费。
没有限制:同上诉消费形式不同,生产者发布完数据以后,该消息可以被多个消费者同时消费,并且同一个消费者可以多次消费消息服务器中的同一个记录。主要是因为消息服务器一般可以长时间存储海量消息
kafka的工作形式
kafka集群:一个缓存消息的中间件,是以topic的形式去分类管理消息
生产者:负责发布消息到指定的topic里面,(一则消息record只能属于一个topic)
每一则消息(record):的组成是由key/value/timestamp(时间戳)组成
消费者想要消费topic里面的数据,就需要先订阅对应topic,消费者可以订阅多个topic,被消费者订阅的topic一旦产生了消息,消费者就能fetch抓取到
一个topic可以有多个partion(分区),分发消息策略:若消息发送至topic01,会将消息中的key做哈希算法然后对分区数取余,相同的key会落入相同的分区(hash是将相同的内容返回相同的hash值,不同的内容返回不同的hash值)
分区:在每一个topic中存多少份,且每个分区都会有一个broker(kafka的服务)担当该分区的leader,其他的broker担当该分区的follower
通俗易懂的理解就是:broker相当于家长, partion是孩子,例如broker0 可以打孩子,可以骂孩子,但是broker1和2就只能骂孩子,但不能打孩子。
对应的就是broker0能对part0做读和写的操作,broker1,2只能做读的操作,写的操作轮不到他们管
当broker0宕机,zookeeper会协调broker1,2中选举出一个leader,假如,broker2 被选出part0的leader,那么broker2可以同时对part0和part1进行读写。
当broker0重新启动后,集群会重新分配资源, 且broker0里的数据不是最新的,一定是一个follower
Kafka集群以Topic形式负责分类集群中的Record每一个Record属于一个Topic。每个Topic底层都会对应一组分区的日志用于持久化Topic中的Record。同时在Kafka集群中,
Topic的每一个日志的分区都一定会有1个Borker担当该分区的Leader,其他的Broker担当该分区的follower,Leader负责分区数据的读写操作,follower负责同步改分区的数据。
这样如果分区的Leader宕机,改分区的其他follower会选取出新的leader继续负责该分区数据的读写。其中集群的中Leader的监控和Topic的部分元数据是存储在Zookeeper中.
Kafka中所有消息是通过Topic为单位进行管理,每个Kafka中的Topic通常会有多个订阅者,负责订阅发送到改Topic中的数据。Kafka负责管理集群中每个Topic的一组日志分区数据。 生产者将数据发布到相应的Topic。负责选择将哪个记录分发送到Topic中的哪个Partition。例如可以round-robin方式完成此操作,然而这种仅是为了平衡负载。也可以根据某些语义分区功能(例如基于记录中的Key)进行此操作。 每组日志分区是一个有序的不可变的的日志序列,分区中的每一个Record都被分配了唯一的序列编号称为是offset,Kafka 集群会持久化所有发布到Topic中的Record信息,改Record的持久化时间是通过配置文件指定,默认是168小时。 log.retention.hours=168 Kafka底层会定期的检查日志文件,然后将过期的数据从log中移除,由于Kafka使用硬盘存储日志文件,因此使用Kafka长时间缓存一些日志文件是不存在问题的。
在消费者消费Topic中数据的时候,每个消费者会维护本次消费对应分区的偏移量,消费者会在消费完一个批次的数据之后,会将本次消费的偏移量提交给Kafka集群,因此对于每个消费者而言可以随意的控制改消费者的偏移量。 因此在Kafka中,消费者可以从一个topic分区中的任意位置读取队列数据,由于每个消费者控制了自己的消费的偏移量,因此多个消费者之间彼此相互独立。 Kafka中对Topic实现日志分区的有以下目的: - 首先,它们允许日志扩展到超出单个服务器所能容纳的大小。每个单独的分区都必须适合托管它的服务器,但是一个Topic可能有很多分区,因此它可以处理任意数量的数据。 - 其次每个服务器充当其某些分区的Leader,也可能充当其他分区的Follwer,因此群集中的负载得到了很好的平衡