Kafka
一种分布式,基于发布/订阅消息系统,数据单位message,目标成为一个队列平台,不仅支持离线,还要支持在线
Kafka把数据往磁盘上写,但是在磁盘上存它的读写速度比内存快,这个依赖于预读和后写功能,但是这个预读和后写必须是按照顺序的方式,若没有顺序的方式优化的话,不存在什么预读和后写。
特点:
消息持久化(能落到磁盘)通过o(1)的磁盘数据结构提供数据的持久化
- 高吞吐量
- 分布式:扩展能力强
- 多客户端支持
- 实时性
基本组件
- Broker 每一台机器叫一个Broker
- Producer 日志消息的生产者,用来写数据
- Consumer 消息的消费者,用来读数据
- Topic 不同消费者制定Topic中去读,不同生产者往不同的Topic中写,一个Topic是由一个或多个Partition实现的
- Partition 在Topic基础上做了进一步区分分层,以文件夹的形式存在
Zookeeper 存储只kafka的Broker 和Consumer 的信息,
因为Broker和Consumer 之间存在一个负载均衡,依赖于Zookeeper,出现个别节点不稳定,会体现rebalance机制,但是Producer 和Broker不存在负载均衡
producer和Broker之间是一个push模式
consumer和Broker之间是一个pull模式
topic 分成多个partition的原因增加吞吐量
kafka 把更多的主导权交给了消费者(client 来保存各自的offset),kafka会保留该消息的所有信息,默认是7天,无论消费者是否消化消息,都会持久化一段时间
producer 有两种模式(producer.type=sync(同步),async(异步)):
- 同步模式 :实时
- 异步模式:达到一定条件(时间,数据量)
Consumer 和一个partition读数据,其它的Consumer是不允许再读数据的
Consumer Group 一个Consumer之间是不允许有重复的
partition 中对应多个segment ,segment 是partition内部的落地文件,要知道消息的消息号,使用二分法找到对应的segmentFile
kafka的交付保证:
at least once 策略:消息至少发送一次,如果消息未能接受成功,会出现重发的可能,保证消息不丢失,默认采用该策略,即在消费者端的处理顺序是获得消息—》处理消息—》保存位置。这可能导致一旦客户端挂掉,新的客户端接管时处理前面客户端已处理过的消息。
三种保证策略:
- At most once 消息可能会丢,但绝不会重复传输
- At least one。消息绝不会丢,但可能会重复传输
- Exactly once 每条消息肯定会被传输一次且仅传输一次
副本管理
- kafka将日志复制到指定服务器上(日志就是数据)
- 副本的单元是partition,正常情况下,每个分区有一个leader和0到多个follower,数据写的话只能写在leader上,读也是,针对partition 副本管理,如果一共有f+1个broker,允许挂掉f个
- ISR:kafka在zk动态维护了一个set(里面表示所有副本,都是跟上了leader的节奏),下面两种情况ISR需要删除
-
- 消息延迟
- 数据落后太多
kafka用两个条件保证活着
- Zookeeper注册的session还在且可以维护
- 如果是follower则能紧跟随leader,且不能落后太远
kafka使用in sync (ISR)来代替或者,如果follower卡住或者落后太远,则leader将移除同步列表中的in syn,至于落后多远由replica.lag.max.messages配置,如果设为4,表明follower不能落后于leader超过3个消息,否则从ISR中删除,判定为挂掉