kafka名词解释
broker: 消息中间件处理节点,一个kafka节点就是一个broker,一个或者多个broker组成一个kafka集群。
topic: 主题,kafka根据topic对消息进行归类,发布到kafka集群的每条消息都需要指定一个topic。
producer: 消息产生者,向broker发送消息的客户端。
consumer:消息消费者、从broker读取消息的客户端。
consumer group: 每个consumer属于一个特定的consumer group,一条消息可以发送到多个不同的consumer group,但一个consumer group只能有一个consumer能够消费该消息
partition: 物理上的概念,一个topic可以分为多个partition,每个partition内部是有序的。
Kafka 为每个主题维护了分布式的分区(Partition)日志文件,每个 Partition 在 Kafka 存储层面是 Append Log。
任何发布到此 Partition 的消息都会被追加到 Log 文件的尾部,在分区中的每条消息都会按照时间顺序分配到一个单调递增的顺序编号,也就是我们的 Offset。Offset 是一个 Long 型的数字。
我们通过这个 Offset 可以确定一条在该 Partition 下的唯一消息。在 Partition 下面是保证了有序性,但是在 Topic 下面没有保证有序性
消费模型:
推送模型(push):由消费代理吉利消费状态,消费代理将消息推送到消费者后标记这条消息为一杯消费,但这种方式由于消费进程挂掉或者网络原因无法很好的保消费者接受到消息,消费代理标记该消息一杯消费,这条消息就永久丢失了。另外采用push模式消息消费的速率完全由消费代理控制、一旦消费者发生阻塞就会出现问题。
拉取模型(poll): 有自己控制消费速度以及消费进度、消费者可以按照任意的偏移量进行消费。
高可靠分布式存储模型:
kafka中保证高可靠模型依靠的是副本机制,就算宕机也不会发生数据丢失。
高性能日志存储:
kafka一个topic下面所有的消息都是以partiton方式分布式存储在多个节点上的,每个partiton都会对应一个日志目录,在目录下面会对应多个日志分段(logsegment)。logsegment文件由两部分组成,分别是”.index“文件(索引文件)和".log"文件(数据文件)
由于kafka消息数据太大,如果全部建立索引既占空间又增加了耗时、所以kafka选择稀疏索引,索引可以直接进入内存、加快偏移查询速度。
副本机制:
kafka副本是多个服务端节点对其他节点的topic分区的日志进行复制。当集群某个节点故障,访问故障节点的请求会被转移到其他正常节点。
kafka中并不是所有副本都能替代主副本、所以在kafka的leader节点维护这一个ISR(in sync replicas)集合(正在同步集合)。
1、节点必须和ZK保持连接。
2、在同步过程中这个副本不能楼后主副本太多。
AR(Assigned Replicas)用来表示副本全集,osr用来表示由于楼后被踢出的副本集合。
公式如下: ISR=Leader+没有落后太多的副本;AR=OSR+ISR
zk在kafka中的作用:
1,配置管理
Topic的配置之所以能动态更新就是基于zookeeper做了一个动态全局配置管理。
2,负载均衡
基于zookeeper的消费者,实现了该特性,动态的感知分区变动,将负载使用既定策略分不到消费者身上。
3,命名服务
Broker将advertised.port和advertised.host.name,这两个配置发布到zookeeper上的zookeeper的节点上/brokers/ids/BrokerId(broker.id),这个是供生产者,消费者,其它Broker跟其建立连接用的。
4,分布式通知
比如分区增加,topic变动,Broker上线下线等均是基于zookeeper来实现的分布式通知。
5,集群管理和master选举
我们可以在通过命令行,对kafka集群上的topic partition分布,进行迁移管理,也可以对partition leader选举进行干预。
Master选举,要说有也是违反常规,常规的master选举,是基于临时顺序节点来实现的,词性序列号最小的作为master。而kafka的Controller的选举是基于临时节点来实现的,临时节点创建成功的成为Controller,更像一个独占锁服务。
6,分布式锁
独占锁,用于Controller的选举
早期版本的kafka用zk做meta信息存储,consumer的消费状态,group的管理以及 offset的值。考虑到zk本身的一些因素以及整个架构较大概率存在单点问题,新版本中确实逐渐弱化了zookeeper的作用。新的consumer使用了kafka内部的group coordination协议,也减少了对zookeeper的依赖