https://blog.csdn.net/Delicious_Life/article/details/106889968

目录

分区策略

高可用处理

Exactly Once解决消息重复发送的问题

分区策略

生产者放到broker中的数据为什么要分区存储?

1.方便在集群中扩展

2.更小的存储数据单元,可以提高并发

分区存储的原则

1.如果生产者指定放到broker的哪个partition中了,那就会按指定的分区存储

2.如果生产者没有指明partition但存储的内容含有key,则把key的hash值与broker的分区数进行取模,然后放到对应分区中

3.如果既没有指明partition也没有存储key,则第一次存储会随机生成一个整数,让这个整数和partition数取模,然后放到对应的分区中。第二次存储时再第一次随机生成的随机数上自增再取模执行同样的操作。

高可用处理

为什么生产者放到broker中这一环节需要进行高可用处理

为保证producer发送的数据,能可靠的进入到指定的broker分片中,broker的每一个分片收到producer发送的数据后都需要向producer发送ack(确认收到标志),如果producer收到ack,就会进行下一轮发送,否则重新发送数据。

发送ack产生的问题:何时发送?

kafka发送ack策略

kafka的默认设置为当所有的从节点都同步完主节点后再向producer发送ack确认标志。所有的从节点理想情况下同步后即发送ack,但要是有从节点网络延迟大,或者出现从节点宕机呢?这样就会增大了producer收到ack的时长。

为了解决这个问题,kafka提供了ISR队列

什么是ISR队列

leader维护了一个动态的in-sync replica set(ISR),意为和leader保持同步的follower集合。当ISR中的follower完成数据同步后,leader就会给follower发送ack,如果follower长期未向leader同步数据,则该follower将被踢出ISR,该事件阀值由replica.lag.time.max.ms参数设定,leader发生故障,就会从ISR中选举新的leader

ack的应答机制

为了提高ack的响应效率,对于某些不太重要的数据,对数据的可靠性要求不高,能够容忍数据的少量丢失,所以没必要等到ISR中的follower全部接收成功,因此kafka提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡,可以做以下参数的调整:

0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker在没接收完直接就返回ack,当 broker 故障时有可能会丢失数据;

1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,但此时broker的主从同步尚未成功,如果在 follower同步成功之前 leader 故障,那么将会丢失数据;

-1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后,broker向producer发送 ack 之前,leader 发生故障,broker集群会选出一个新leader,producer由于没有收到ack而重发给新leader,这样就会造成数据重复。

保证丢失的最小分片数

LEO :指的是每个副本最大的 offset ;
HW :指的是消费者能见到的最大的 offset ,ISR  队列中最小的 LEO 。
(1 )follower  故障
follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后,follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。等该 follower  的 LEO  大于等于该 Partition 的 的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了。
(2 )leader  故障
leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性,其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据。注意: 这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

Exactly Once解决消息重复发送的问题

将ack设置为-1,可以保证producer到broker之间不会丢失数据,即At Least Once。相对的,将ack设置为0,可以保证生产者每条消息只会发送一次,即At Most Once。

At Least Once可以保证数据不丢失,但不能保证数据不重复;At Most Once可以保证数据不重复,但不能保证数据不丢失。如何保证数据既不丢失也不重复呢?Exactly Once

Kafka在0.11版本之后引入了“幂等性”的概念,幂等性指producer不论向broker发送多少次重复的数据,broker都会保存1条,幂等性结合了At Least Once构成了Exactly Once

启用幂等性需要将producer的参数enable.idompotence设置为true。开启幂等性的producer在初始化时会分配一个PID,发往同一个partition的消息会附带Sequence Number。而broker端会对<PID,Partition,SeqNumber>做缓存,当具有相同主键的消息提交时,broker只会持久化一条,但如果broker因宕机或重启导致PID变化就会重新生成PID,不同的partition也有不同主键,这种跨分区,跨会话的Exactly Once无法解决消息重复。

Kafka中Producer与Broker之间的交互相关推荐

  1. linux和安卓交互,Android中webview和js之间的交互及注意事项

    1.Android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...

  2. linux 中kafka发送数据,C++ 向kafka中发送数据

    kafka是一个分布式流处理的平台,通过kafka我们可以发布和订阅流式记录.有关kafka的介绍可以参考官网或者这篇文章https://juejin.im/post/6844903495670169 ...

  3. kafka中文文档new comsumer配置参数

    该文档对应的是 kafka安装目录/config/consumer.properties文件的内容,也是适用于java客户端.由于原英文版的文档从句太多太难理解,我花了四天时间翻译了一份中文文档,希望 ...

  4. kafka消息服务的producer、broker、consumer的配置

    2019独角兽企业重金招聘Python工程师标准>>> server.properties配置: server.properties中所有配置参数说明(解释)如下列表: 参数 说明( ...

  5. 057 Java中kafka的Producer程序实现

    1.需要启动的服务 这里启动的端口是9092. bin/kafka-console-consumer.sh --topic beifeng --zookeeper linux-hadoop01.ibe ...

  6. 3 在统一建模语言中(UML)中,( )用于描述系统与外部系统及用户之间的交互

    标签: 软考初级程序员易错题,计算机基础, 面向对象基础,统一建模语言 (UML) 在统一建模语言中(UML)中,( )用于描述系统与外部系统及用户之间的交互. 问题1 A.对象图 B.类图 C.用例 ...

  7. kafka中controller的作用_Kafka 常见问题汇总

    Kafka 如何做到高吞吐.低延迟呢? 这里提下 Kafka 写数据的大致方式:先写操作系统的页缓存(Page Cache),然后由操作系统自行决定何时刷到磁盘. 因此 Kafka 达到高吞吐.低延迟 ...

  8. Kafka中topic的Partition,Kafka为什么这么快,Consumer的负载均衡及consumerGroup的概念(来自学习笔记)

    1.1. Kafka中topic的Partition  在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic ...

  9. kafka中文文档(0.10.0)

    kafka中文文档(0.10.0) 作者:链上研发-老杨叔叔 时间:2016-07-22 版本:Apache Kafka 0.10.0 (2016年5月底发布) .目录 kafka中文文档0100 目 ...

  10. 干趴面试官系列 | 请你简述一下Kafka中的分区分配

    欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-partition-assignors/ "请你简述一下Kafka ...

最新文章

  1. 学历高和学历低的眼界差距有多大?
  2. 百度ACE智能交通能提升最高30%城市通行效率,刚刚拿下世界互联网大会最高荣誉...
  3. 实践作业4:Web测试实践(小组作业)每日任务记录3
  4. ajax获取单选按钮的值_【自学C#】|| 笔记 31 控件,按钮
  5. 用zlib库读取单个压缩文档[转]
  6. 软件研发作为一项工程而言,纳闷!
  7. mysql中like,limit,union及union all查询
  8. 手机测试移动网速的软件,移动测试网速(中国移动在线测速)
  9. 金士顿U盘修复工具Kingston Format Utility
  10. 小米手机开发者选项在哪?小米手机怎么打开开发者选项
  11. gm220s路由器怎么设置_教你netgear无线路由器怎么设置全图解教程
  12. 二维图像中Mat::setp、Mat::step1理解
  13. 三元运算 微信小程序_微信小程序 三元运算符 条件语句if和循环语句for(三目运算+hidden)...
  14. Mysql中时间格式转换
  15. IT圈持续部署并不是毫不费力 确是不平凡
  16. ASP.NET MVC-4种过滤器
  17. 在线Excel框架——luckysheet
  18. Java web批量导入excel表格的数据进入数据库的实现
  19. 4月第2周业务风控关注 |互联网信息服务投诉平台正式上线试运行
  20. 培训班的同学,拜托不要把用人单位想得那么傻,好不好?! 自由飞

热门文章

  1. 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)
  2. Apache环境利用.htaccess文件设置域名301跳转(不带www跳转到带www)
  3. python regularexpress1
  4. 在windows server上配置java jdk后,可能要些时间生效。
  5. 关于宏定义的一些用法
  6. hdu--1869--见过最好听的题名附送1870
  7. layui日期输入框
  8. 使用Jmeter对API进行性能测试
  9. luogu1970 花匠
  10. UVa 674 Coin Change(完全背包)