kafka学习记录0

学习B站kafka视频总结。

1.kafka的作用

解耦 异步通信 峰值处理 缓冲 可恢复性

2.kafka的架构

producer

consumer/consumer group:消费者组,消费者组内的每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费。即一个分区能被多个消费者消费且这几个消费者分属不同消费者组。

borker:指的是一台kafka服务器,多个broker构成cluster,一个broker可容纳多个topic。

topic:一个队列,等同于数据库中的一个表

partition:一个topic包括多个partition,一个partition是一个有序的队列。

replica leader follower

2.5各组件在kafak集群中的作用

zooleeper:通过保存元数据信息,controlor的管理工作都依赖于zk,包括:broker注册信息,topic partition relication信息 消费者/组与partition的对应关系等,负责监听,brokers的controlor的选举和relica副本的leader的选举。

controller:负责管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作。

3.常见配置

同步策略相关配置(isr)

replica.lag.time.max.ms follower多长时间未向leader同步数据踢出isr的时间阈值。

幂等性设置

enable.idompotence设置为true,默认为fasle.

4.常见命令行操作

创建topic

查看topic列表

查看指定topic的信息

删除topic

启动生产者客户端

启动消费者客户端(从指定偏移量消费)

修改分区

5.kafka生产者

(1)分区策略

分区的原因:方便在集群中拓展 提高并发

分区的原则:可以指定分区;没有指定,但有key,根据key的hash值与partition数取余,判断paritition值;没指定,也没key,轮询,会在第一次初始化生产者时,随机生成一个整数,之后在这个整数基础上递增,除以partition数取余,确定partition值。

注:生产者向kafka发送的是一个producerrecord对象,这个对象的数据结构:topic(必选)

partitionid(可选) key(可选) value(必选) 如果partitionid 和key都有,则partitionid有效,key无效,即数据将发送到指定partition。

(2)数据可靠性保证

副本数据同步策略

生产者写入数据,收到数据后,回向生产者发送一个回调信息ack,且全部完成同步发送ack

isr

意为和leader保持同步的follower集合。

有三个可靠性级别:0:producer不需要等待broker的ack,会造成数据丢失

1:只需要确定写入leader就发送ack,会造成数据丢失

-1: 需要确认isr里的所有replication写入数据,会造成数据重复

(3)写入时发生故障的处理过程

leder故障:会从isr里再选出一个leader(leader挂掉后重新选举leader的过程:https://blog.csdn.net/qq_24699905/article/details/85708251),其余的follower会将对于当前leader的数据截掉,然后从leader中同步数据。

follower故障:被踢出isr,恢复后,如果数据比leader少从leader同步数据,如果比leader多,将多余数据截取掉,然后重新加入isr。

注:这种机制只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

(4)kafka的exactly once和at least once

将ack设置为1,能at least once,能保证数据不缺少,不能保证不重复。

kafka在0.11版本后,引入:幂等性。将enble.idompotence设置为true。

实现幂等性的原理:对初始化的producer分配一个pid,发送同一partition的消息附带一个sequencenumber,即(pid,partitionid,sequencenumber)作为主键,这样无法保证跨分区跨会话的exactly once。

6.消费者

(1)消费方配策略

roundrobin range 参考:https://blog.csdn.net/qq_26838315/article/details/106882579 讲解了两种分区策略的优缺点及适合的应用场景

(3)offset的维护

0.9版本之前将offset保存在zookeeper,之后默认保存在kafka的一个topic(_consumer_offset),在新版本中想把offset放在zk中,可consumer.properties设置:exclude.internal.topics=false,默认为true

(4)

7.kafka高效的原因

1.顺序读写:减少磁头寻址的时间

2.零复制技术:零拷贝

传统数据传递:

零拷贝技术的数据传递:

传统:整个过程经历两次context switch(上下文切换,一个线程切换到另外一个线程),四次system call。同一份数据在内核buffer与用户buffer之间重复拷贝。

零拷贝:努力实现在内存中完成数据交换,优化os系统的sendfile()方法,减少传统中2 3步骤,在内核去完成数据拷贝。

3.页缓存的使用:依赖页缓存,将数据写入页缓存,并添加标记,消费的数据时首先会查找页缓存,找到对数据进行标记,给下游,没找到则进行磁盘调度,尽量不与硬盘打交道,同时回收pagecache代价很小。避免的在jvm中内部缓存数据,避免jVM的gc,如果kafka重启,kafka的in-process cache会失效,但是os管理的pagecache不会。

注:详细介绍零拷贝和页缓存:https://blog.csdn.net/dshf_1/article/details/81044990

8.kafka的读写流程

参考这两篇文章吧:kafka存储机制与读写流程_weixin_34410662的博客-CSDN博客

http://www.manongjc.com/detail/6-dxfeymwaflrgbhd.html

9.kafka事务

kafka事务弥补kafka幂等性的不足,和读事务等,kafka的幂等性不能保证跨分区跨会话的exactly once。kafka事务引入transactionid与pid(幂等性也有,生产者重启初始化后会被分配一个pid)进行绑定,再加上幂等性的sequencenumber。

详细kafka事务详解可参考:https://www.cnblogs.com/felixzh/p/12777715.html ,包括kafka事务在java api中的使用,kafka事务的特性,kafka事务的集群配置 kafka事务的特性 kafka事务的原理(源码层次)式

kafka采用pull模式,拉的模式。

pull模式和push模式的对比,为什么选择pull模式。

采用pull也会有个问题:如果kafka没数据,消费者可能会陷入循环中,一直返回空数据。解决方法:kafka的消费者在消费数据时可设置一个参数timeout,如果没有数据可供消费,consumer会过一段时间再返回,这段时间即为timeout。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值