《apache kafka 实战》读书笔记

断断续续看了点书,写个博客记录下,图片是百科找的,博客内容都是我比较感兴趣的,书里很多内容都特别详细,感兴趣的可以去买来阅读。

<第一章 认识apache kafka>

kafka核心功能?

高性能的消息发送与高性能的消息消费

消息引擎系统?

1.消息队列模型,提供了点对点的消息传递方式

生产者发布一条消息只能被一个消费者消费

2.发布/订阅模型(kafka 引入消费者组来支持这种模型)

生成者发布一条消息可以被多个消费者消费

kafka为什么高吞吐,低延时?

1.持久化数据只是将数据写入到OS的页缓存,由OS决定数据什么时候写入磁盘,页缓存在内存中分配,写入速度快,不直接与磁盘打交道,都交给了OS

2.写入操作采用追加(append)方式,只能在日志文件啊末尾追加消息,顺序写磁盘速度快

3.消费者读取消息时,会优先从页缓存中读取,"命中"的话直接网络发送socket。大量使用页缓存,"命中率"高。

基本术语?

1,消息:由消息头部(CRC码,时间戳,key长度,value长度等等),key,value组成,key用来对该条消息进行partition,决定该消息保存在topic的哪个partition

2,topic:逻辑概念,代表一类消息,可以理解为;消息被生产者发送到的地方

3,partition:一个topic可以由一个或多个partition,单纯地为了提升系统的吞吐量,做分布式用,每个partition有自己的唯一的下标,从0开始

4,offset:partition每条消息都有一个唯一的偏移量,从0开始递增(与消费者维护的offset不一样)

5,replica:副本,防止数据丢失,分为leader和follower,follower不响应客户端的消息写入和消息消费请求,只是被动的向leader同步数据,一旦leader挂掉,从follower选举出新leader

6.ISR:同步副本集合,kafka为每个partition动态的维护一个replica集合,只有该集合中的replica才能被选举成leader,正常情况下,partition所有的replica都在ISR中,当某些replica进度"落后"leader大于某个值时,会被提出ISR,当重新追上时,会再次加入到ISR中

<第二章 kafka发展历史>

kafka版本迁移?

版本功能变化说明
0.8增加了备份机制使kafka成为分布式消息引擎解决方案
0.9.x使用java重写了consumer消费者组的offset可以不用通过zk保存,存在topic中
0.10.x增加了kafka streams组件增加流式数据处理功能
0.11.x增加了对事务的支持以及精准一次处理语义正式支持Exactly-Once

0.9.x版本的producer?

将待发送的消息封装成一个ProducerRecord对象,然后使用KafkaProducer.send()进行发送,KafkaProducer拿到消息后,先对其进行序列化,然后根据元数据信息确定目标分区,最后写入内存缓冲区,同时,KafkaProducer还有一个专门的Sender I/O线程,负责将缓冲区数据分批次发给broker。

producer较旧版本优点?

1,发送过程分为两个线程,一个主线程和Sender I/O线程

2,完全异步发送,回调机制用来判断发送是否成功

3,分批次发送,提高吞吐量

4,更合理的分区策略,旧版本对于没key的消息,会发送到固定分区,0.9.x采用轮询方式

0.9.x版本的consumer?

消费者组的offset不依赖于zk旧版,大量的zk I/O会成为系统瓶颈,将消息封装到ConsumerRecord对象,然后使用KafkaConsumer.poll()进行拉取数据,

consumer较旧版本优点?

1.,摒弃了消费不同分区时采用多线程的思想,只使用一个线程可以管理不同broker的多个socket

2,摆脱了offset对zk的依赖

<第三章 kafka线上环境部署>

暂时还不知道写啥。

<第四章 producer开发>

暂时还不知道写啥。

<第五章 consumer开发>

暂时还不知道写啥。

<第六章 kafka 设计原理>

一.broker端设计

1.副本与ISR

只有leader副本对外提供服务,而其它follower副本只是被动地向leader副本同步数据

ISR,为partition动态维护的同步副本集合,leader副本也在ISR中,只有ISR中的副本可以选举leader

High watermark,高水印值,超过该值的消息被视为“未提交成功”的,决定了consumer能够获取到的消息最大offset

uncommitted,未提交的消息,表示producer已发送到leader副本,而ISR中别的副本还未全部同步,也表示还未给客户端发response的消息

log end offset,日志末端位移,LEO,该值表示的位置是下一条消息要写入的位置

当leader副本接收到消息时,先更新自己的LEO,然后followe副本向leader副本请求数据后也更新follower的LEO,只有ISR的所有副本更新了自己LEO后,leader副本才将HW值向右移动,后给客户端发送写入成功。

ISR副本中什么原因导致follower被"踢出"该队列?

1.follower副本请求速度跟不上leader的接收速度
2.follower由于某些原因(GC等),一段时间内未向leader请求数据                                                                                                3.新增的副本

0.9.x版本之前对于ISR设置?

replica.lag.max.messages,该值检测如果LEO落后消息数达到该值被踢出

replica.lag.time.max.ms,该值用于检测如果follower副本多长时间以内未向leader请求数据,则被踢出

0.9.x版本之后对于ISR设置?

replica.lag.time.max.ms,该值默认10s,如果follower副本落后leader副本持续时间超过该值,被踢出

2.水印和LEO

如果把LEO和HW看作两个指针,它们的定位是不同的,任意时刻,HW指向是实实在在的消息,而LEO总是指向下一条待写入的消息的,也就是说LEO指向的位置是没有的消息的,上面那张图则表示为:HW为7,LEO为15,则消费者可消费的消息数为0-7 8条消息,而8-14是生产者已提交leader,而ISR集合别的follower还未全部请求的数据。

LEO更新机制?

1. follower副本的LEO更新机制?

follower副本的LEO属性,一份保存在leader副本所在的broker,另一份保存在follower副本所在的broker,为什么保存两份?kafka需要利用前者来确定leader副本的HW值,利用后者来帮助follower副本更新HW值

保存在follower副本所在broker的follower副本LEO更新时机?

当follower副本向leader副本请求数据后,向底层log写数据时,更新其LEO值

保存在leader副本所在broker的follower副本LEO更新时机?

当leader处理follower数据请求时,首先从log读取数据,然后更新LEO值,再发数据给follower。

2. leader副本LEO更新时机?

当接收到producer发的消息时,会更新自己的LEO

HW更新机制?

1.follower副本的HW更新时机?

follower副本更新LEO后,一旦写完log数据,更新HW值,具体方法是:比较当前follower副本LEO值与刚请求数据时leader的HW值,取小值作为follower副本的HW值,也就是follower副本的HW值不会大于leader副本的HW值

2. leader副本的HW更新时机?

正常情况:producer向leader写入数据时,更新完LEO后,查看HW是否更新

leader处理完follower副本数据请求后,查看HW是否更新

异常情况:某follower副本成为leader副本

某broker副本被踢出ISR时

具体方法:比较ISR中所有副本的LEO值(保存在leader副本所在broker的follower副本LEO),取最小的值作为HW值

因此分区的HW实际上是所有ISR副本LEO的最小值

 

                                                                                                                                                                                         

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值