第四、五章 Kafka高级API——生产者事务、数据同步机制

Kafka的幂等性,只能保证一条记录的在分区发送的原子性,但是如果要保证多条记录(多分区)之间的完整性,这个时候就需要开启kafk的事务操作。

在Kafka0.11.0.0除了引人的幂等性的概念,同时也引入了事务的概念。通常Kafka的事务分为生产者事务Only、消费者&生产者事务。一般来说默认消费者消费的消息的级别是read_uncommited数据,这有可能读取到事务失败的数据,所有在开启生产者事务之后,需要用户设置消费者的事务隔离级别。

isolation.level = read_uncommitted默认

该选项有两个值read_committed|read_uncommitted,如果开始事务控制,消费端必须将事务的隔离级别设置为read_committed
开启的生产者事务的时候,只需要指定transactional.id属性即可,一旦开启了事务,默认生产者就已经开启了幂等性。但是要求"transactional.id"的取值必须是唯一的,同一时刻只能有一个"transactional.id"存储在,其他的将会被关闭。

数据同步机制

Kafka的Topic被分为多个分区,分区是是按照Segments存储文件块。分区日志是存储在磁盘上的日志序列, Kafka可以保证分区里的事件是有序的。其中Leader负责对应分区的读写、Follower负责同步分区的数据,0.11版本之前Kafka使用highwatermarker机制保证数据的同步,但是基于
highwatermarker的同步数据可能会导致数据的不一致或者是乱序,在Kafka数据同步有以下概念.LEO: log end offset标识的是每个分区中最后一条消息的下一个位置,分区的每个副本都有自己的LEO.
HW: high watermarker称为高水位线,所有HW之前的的数据都理解是已经备份的,当所有节点都备份成功,Leader会更新水位线。
ISR:In-sync-replicas,kafka的leader会维护一份处于同步的副本集和,如果在’replica.lag.time.max.ms’时间内系统没有发送fetch请求,或者已然在发送请求,但是在该限定时间内没有赶上Leader的数据就被剔除ISR列表.在Kafka-0.9.0版本剔除 ‘replica.lag.max.messages’ 消息个数限定,因为这个会导致其他的Broker节点频繁的加入和退出ISR.

每个分区都有自己的leo:log end offset

数据同步机制HW

高水位

high watermarker称为高水位线,所有水位线之前的数据都是已经备份的,当所有节点都备份成功,leader会更新水位线
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
数据同步机制Leader Eposch

在这里插入图片描述
改进消息格式,以便每个消息集都带有一个4字节的Leader Epoch号.在每个日志目录中,会创建一个新的LeaderEpoch Sequence文件,在其中存储Leader Epoch的序列和在该Epoch中生成的消息的Start Ofset,它也缓存在每个副本中,也缓存在内存中。

follower变成Leader
当Follower成为Leader时,它首先将新的Leader Epoch和副本的LEO添加到Leader Epoch Sequence序列文件的末尾并刷新数据,给Leader产生的每个新消息集都带有新的“Leader Epoch标记。

Leader变成Follower
如果需要需要从本地的Leader Epoch Sequence加载数据,将数据存储在内存中,给相应的分区的Leader发送epoch请求,该请求包含最新的EpochIlb,StartOffset信息.Leader接收到信息以后返回该EpochIlD所对应的LastOffset信息,该信息可能是最新EpochlD的StartOffset或者是当前EpochIlD的Log End Offset信息。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值