kafka应用场景
kafka是分布式消息系统,具有高吞吐量,可容错的发布-订阅消息系统。
应用场景:
- 用户活动追踪
- 日志聚合
- 限流削峰
高吞吐率实现:
- 顺序读写
- 零拷贝
- 批量发送
- 消息压缩
kafka基本概念
-
Topic,相当于消息的一个主题,标签
-
Partition,一个topic可以有多个partition,一个partition对应系统上的一个到多个目录。一个topic的partition数量应该是broker的整数倍。
-
segment,一个partition有多个segment组成,每个segment文件大小相等
文件由.log 和 .index文件组成,.index是存放.log文件中消息的索引
查看log文件:
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs-3/test-0/00000000000000000000.log --print-data-log
-
broker,kafka集群中的每个节点称为一个broker
-
producer,消息的生产者
-
consumer,消息的消费者,
- 一个消费者可以消费多个topic的消息,
- 一个消费者可以消费一个topic的多个partition的消息
- 一个partition允许多个消费者同时消费
-
consumer group,消费者组,kafka保证一个消息只会被一个组中的某一个kafka消费。
-
replicas of partition, 分区副本,为了防止消息丢失而创建的分区的备份。
-
partition leader,每个partition有多个副本,而读写操作只能发生在leader上
-
partition follower,所有follower都需要从leader同步消息,Leader与follower是主备关系,而非主从关系。
-
ISR, In-Sync-Replicas,是指副本同步列表
- AR,Assigned Replicas,在最初没有leader时,ISR=AR
- OSR,Outof-Sync-Replicas
- AR = ISR + OSR + Leader,ISR是存放在zk中的
-
offset,每条消息都有一个当前Partition下唯一的64字节的offset
-
broker controller, kafka集群中有一个broker会被选举出来,作为controller,负责管理整个集群的partition和replicas的状态
只有broker controller会向zookeeper中注册watcher
-
脑裂:(Brain Split),由于某种原因导致高可用集群中出现了两个master。zk的watcher机制及分布式锁会引发master的假死,从而导致脑裂。
-
HW(High Water-Mark)与 LEO(Log End Offset)
- HW 是kafka消费者可以消费到的最高partition的偏移量,HW保证了kafka集群中消息的一致性。
- LEO 是日志消息最后的偏移量
- 对于partition leader中新写入的消息,是不能立即被消费者消费的,只有当ISR中所有的partition follower消费之后,更新HW,写入ISR,此时消息才能被消费者消费。HW的更新速度取决于那个性能最差的broker
-
zookeeper
- zookeeper负则broker controller的选举
- partition leader是由 broker controller负责选举的
- zookeeper负则broker controller的选举
-
Coordinator
coordinator是用来管理消费者组的,是运行在每个broker上的group coordinator进程,主要负则offset的位移管理和rebalance,一个coordinator可以管理多个消费者组
-
rebalance
当消费者组中的消费者数量发生变化,或者topic中的partition数量发生变化,会导致partition的重新分配,这个过程叫做Rebalance.
rebalance可以给系统带来高可用性和伸缩性,但是在Rebalance期间,消费者是无法读取消息的,因此要避免不必要的Rebalance
引发Rebalance的情形:
- 消费者组中添加消费者
- 消费者取消订阅,关闭或崩溃
- 向一个topic中添加新的partition
- 当有broker挂了
-
offset commit
消费者从partition中取出一批消息放入buffer中进行消费,在规定的时间内(seession.timeout.ms)消费完消息后,会自动将其消费的commit提交给broker,broker可以判断哪些消息有被消费过,若在规定时间内没有消费完毕,其是不会提交offset的, 可以避免在Rebalance时重复消费。
注: 从kafka0.9开始,offset保存在brokers中,__consumers-offsets