一、简介
1.分布式消息系统 支持分区,多副本,多订阅者,基于zookeeper协调的分布式
2.消息队列作用:异步,削峰,解耦高吞吐,低延迟,每秒处理几十万条数据,延迟最低几毫秒,每个topic可以分多个区可扩展,支持热扩展,可持久化,高并发,支持数千个客户端同时读写
3.是一个存储系统,存储的数据形式为‘消息’(byte[]),类似于蓄水池,起到缓冲作用
二、使用场景
1.日志收集,可以收集log
2.消息系统
3.用户活动跟踪,记录用户的各种活动浏览记录等,装到数据仓库离线分析和挖掘
4.记录运维监控数据,收集各种分布式应用的数据,操作反馈报警和报告等
5.流式数据处理,如flink,spark streaming
三、重要参数
1.ack机制
topic的每个partition收到producer发送的数据后,都需要向producer发送ack,如果producer收到ack就会进行下一轮的发送,否则重新发送数据。
ack参数配置:producer返ack,0无落盘直接返,1只leader落盘然后返,-1全部落盘然后返
2.ISR机制(同步副本集)
leader中维护了一个动态的ISR,即与leader保持同步的follower集合,当ISR中的follower完成数据的同步之后,给leader发送ack,如果follower长时间没有向leader同步数据,则该follower将从ISR中被踢出。当leader发生故障之后,会从ISR中选举出新的leader。
四、数据一致性问题
LEO(Log End Offset):每个副本最后的一个offset
HW(High Watermark):高水位,指代消费者能见到的最大的offset,ISR队列中最小的LEO。
1.follower故障和leader故障
follower故障:follower发生故障后会被临时提出ISR,等待该follower恢复后,follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步,等待该follower的LEO大于等于该partition的HW,即follower追上leader之后,就可以重新加入ISR了。
leader故障:leader发生故障之后,会从ISR中选出一个新的leader,为了保证多个副本之间的数据的一致性,其余的follower会先将各自的log文件高于HW的部分截掉,然后从新的leader中同步数据。
这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。
五、幂等性
Kafka的幂等性实现实际是将之前的去重操作放在了数据上游来做,开启幂等性的Producer在初始化的时候会被分配一个PID,发往同一个Partition的消息会附带Sequence Number,而Broker端会对<PID,Partition,SeqNumber>做缓存,当具有相同主键的消息的时候,Broker只会持久化一条。
但PID在重启之后会发生变化,同时不同的Partition也具有不同的主键,所以幂等性无法保证跨分区跨会话的Exactly Once。
六、分区分配策略
1.Round-Robin
主要采用轮询的方式分配所有的分区,按照订阅的情况。
假设存在三个topic:t0/t1/t2,分别拥有1/2/3个分区,共有6个分区,分别为t0-0/t1-0/t1-1/t2-0/t2-1/t2-2,这里假设我们有三个Consumer,C0、C1、C2,订阅情况为C0:t0,C1:t0、t1,C2:t0/t1/t2。
此时round-robin采取的分配方式,则是按照分区的字典对分区和消费者进行排序,然后对分区进行循环遍历,遇到自己订阅的则消费,否则向下轮询下一个消费者。即按照分区轮询消费者,继而消息被消费。
2.Range
按照range的方式进行分配,本质上是以此遍历每个topic,然后将这些topic按照其订阅的consumer数进行平均分配,多出来的则按照consumer的字典序挨个分配,这种方式会导致在前面的consumer得到更多的分区,导致各个consumer的压力不均衡。
七、Kafka的高效读写
顺序写磁盘:写的过程是追加到文件末端,顺序写的方式,官网有数据表明,同样的磁盘,顺序写能够到600M/s,而随机写只有200K/s,这与磁盘的机械结构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。
八、零复制(零拷贝)技术
1.传统的读取数据并发送到网络的步骤
1.操作系统将数据从磁盘文件中读取到内核空间的页面进行缓存;
2.应用程序将数据从内核空间读入用户空间缓冲区;
3.应用程序将读到的数据协会到内核空间并放入socket缓冲区;
4.操作系统将数据从socket缓冲区复制到网卡接口,此时数据才能通过网络进行发送。
2.kafka的零拷贝技术
“零拷贝技术”只用将磁盘文件的数据复制到页面缓冲区一次,然后将数据从页面的缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面进行缓存),避免了重复复制操作。