大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 生产者

3.2.1 分区策略 
1)分区的原因 
(1)方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic又可以有多个 Partition 组成,因此整个集群就可以适应任意大小的数据了; 
(2)可以提高并发,因为可以以 Partition 为单位读写了。 
2)分区的原则 
我们需要将 producer 发送的数据封装成一个 ProducerRecord 对象。 


 
(1)指明 partition 的情况下,直接将指明的值直接作为 partiton 值; 
(2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值; 
(3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,也就是常说的 round-robin 算法。 

3.2.2 数据可靠性保证 
为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到
producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果
producer 收到 ack,就会进行下一轮的发送,否则重新发送数据。 

1)副本数据同步策略  

 Kafka 选择了第二种方案,原因如下: 
1.同样为了容忍 n 台节点的故障,第一种方案需要 2n+1 个副本,而第二种方案只需要 n+1个副本,而 Kafka 的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。 
2.虽然第二种方案的网络延迟会比较高,但网络延迟对 Kafka 的影响较小。 
2)ISR 
 采用第二种方案之后,设想以下情景:leader 收到数据,所有 follower 都开始同步数据,但有一个 follower,因为某种故障,迟迟不能与 leader 进行同步,那 leader 就要一直等下去,直到它完成同步,才能发送 ack。这个问题怎么解决呢?  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。 
3)ack 应答机制 
对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,所以没必要等 ISR 中的 follower 全部接收成功。 所以 Kafka 为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡,选择以下的配置。 

acks 参数配置: 
acks: 
0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据; 
1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower同步成功之前 leader 故障,那么将会丢失数据; 

acks = 1 数据丢失案例

-1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成数据重复。 

acks = -1 数据重复案例

4)故障处理细节 

    Log文件中的HW和LEO

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同步数据。 

注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。 
3.2.3 Exactly Once 语义 
将服务器的 ACK 级别设置为-1,可以保证 Producer 到 Server 之间不会丢失数据,即 At  Least Once 语义。相对的,将服务器 ACK 级别设置为 0,可以保证生产者每条消息只会被发送一次,即 At Most Once 语义。 At Least Once 可以保证数据不丢失,但是不能保证数据不重复;相对的,At Least Once可以保证数据不重复,但是不能保证数据不丢失。但是,对于一些非常重要的信息,比如说交易数据,下游数据消费者要求数据既不重复也不丢失,即 Exactly Once 语义。在 0.11 版本以前的 Kafka,对此是无能为力的,只能保证数据不丢失,再在下游消费者对数据做全局去重。对于多个下游应用的情况,每个都需要单独做全局重,这就对性能造成了很大影响。 0.11 版本的 Kafka,引入了一项重大特性:幂等性。所谓的幂等性就是指 Producer 不论向 Server 发送多少次重复数据,Server 端都只会持久化一条。幂等性结合 At Least Once 语义,就构成了 Kafka 的 Exactly Once 语义。即: 
At Least Once + 幂等性 = Exactly Once 
要启用幂等性,只需要将 Producer 的参数中 enable.idompotence 设置为 true 即可。Kafka的幂等性实现其实就是将原来下游需要做的去重放在了数据上游。开启幂等性的 Producer 在初始化的时候会被分配一个 PID,发往同一 Partition 的消息会附带 Sequence Number。而Broker 端会对<PID, Partition, SeqNumber>做缓存,当具有相同主键的消息提交时,Broker 只会持久化一条。 但是 PID 重启就会变化,同时不同的 Partition 也具有不同主键,所以幂等性无法保证跨分区跨会话的 Exactly Once。 

总结一句话:这个幂等性只能解决单次会话数据不重复,根据这个PID Partition  SeqNumber三个条件确定是不是同一条数据,来保证数据不重复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学(转载)

1. 别怕丢人&#xff0c;追求丢人是一种成功的尝试&#xff0c;至于为此笑话你的人&#xff0c;你可以把他们从你将来人生对手的名单中排除了&#xff0c;你也要为每一位上台唱歌的人鼓掌。2、你有足够的理由佩服每天早起的人&#xff0c;不信的话&#xff0c;你去做。做到后会…

自燃型员工的特点

自燃型员工的特点原文&#xff1a;https://mp.weixin.qq.com/s/SaQ_GG7CpPqdGc_l5jffag 稻盛和夫曾经说过&#xff0c;人分为三种&#xff1a; 一种是自燃型&#xff0c;自我驱动&#xff0c;自我燃烧&#xff1b; 第二种是点燃型&#xff0c;需要别人在背后推一把&#xff1b;…

MySQL定时备份实现

一、备份数据库 –all-databases 备份所有数据库 /opt/mysqlcopy/all_$(date “%Y-%m-%d %H:%M:%S”).sql 备份地址 docker exec -it 容器名称 sh -c "mysqldump -u root -ppassword --all-databases > /opt/mysqlcopy/all_$(date "%Y-%m-%d %H:%M:%S").sq…

POJ 1159 (DP)

题目&#xff1a;http://poj.org/problem?id1159 思路: 找出原串的最长回文子串&#xff0c;当然这里说的回文子串可以不连续。用原串的长度减去最长回文子串的长度即可得出结果。 设原串a[5001],它的反串为b[5001],求出a和b的最长公共子串的长度&#xff08;可以不连续&#…

新版本ISR 为啥 移除replica.lag.max.messages这个参数

ISR 上节我们涉及到ISR (In-Sync Replicas)&#xff0c;这个是指副本同步队列。副本数对Kafka的吞吐率是有一定的影响&#xff0c;但极大的增强了可用性。默认情况下Kafka的replica数量为1&#xff0c;即每个partition都有一个唯一的leader&#xff0c;为了确保消息的可靠性&am…

程序员健身的重要性

程序员健身的重要性人的身体就是人的灵魂最好的写照&#xff01; &#xff0d;&#xff0d;&#xff0d; 路德维系.维特根斯坦 健身不仅是保持健康体魄的关键要素之一&#xff0c;也是灵活的、具有创造性的脑力活动的基础。 &#xff0d;&#xff0d;&#xff0d; 约翰.肯尼迪 …

Java 8 中的哈希表

JDK 的代码是开源的&#xff0c;我们打开idea开发工具&#xff0c;引入jdk1.8 找到hashmap HashMap 是基于 HashTable 的一种数据结构&#xff0c;在普通哈希表的基础上&#xff0c;它支持多线程操作以及空的 key 和 value。 在 HashMap 中定义了几个常量: static final in…

NSJSONSerialization介绍

ios5中apple增加了解析JSON的api——NSJSONSerialization。网上已经有人做过测试&#xff0c;NSJSONSerialization在效率上完胜SBJSON、TouchJSON、YAJL、JSONKit、NextiveJson。详情见这里。既然apple为我们提供了这么良好的工具&#xff0c;我们没理由不用吧。 NSJSONSeriali…

开始新的blog之旅--flash3,0涂鸦板保存,撤销功能

一直以来都是在百度写的博客&#xff0c;今天不知道百度是哪抽风。居然把我的博客给封了&#xff0c;上贴吧去发泄一番&#xff0c;结果帖子都给删了。 不得不说你百度厉害&#xff0c;你自己犯的错误。让我们这些用户跟着受罪。我看今天很多博客都被封了&#xff0c;都不知道原…

JDK8HashMap的扩容核心解读,尾插法

看懂了JDK7Hashmap的扩容头插法&#xff0c;及其可能产生的循环引用问题&#xff0c;今天看看JDK8的HashMap扩容实现。采取的是用四个结点&#xff0c;两条链表完成重新分配位置&#xff0c;比较简单有趣。解析如下&#xff1a; //如果原来的table等于null&#xff0c;直接返回…

领导者的资质——学习笔记(1)

领导者的资质——学习笔记&#xff08;1&#xff09;《领导者的资质》是稻盛和夫先生著作的一本书&#xff0c;书中的道理值得深深思考和体会&#xff0c;结合自己工作、生活中的一些事情&#xff0c;会有不同的感觉。本学习笔记特此记录书中重点的内容&#xff0c;供以后反复阅…

[转帖]ISE与Modelsim联合观察中间信号

如何仿真IP核&#xff08;建立modelsim仿真库完整解析&#xff09; 来源&#xff1a;http://www.ednchina.com/ART_49023_19_0_AN_7116cf44.HTM IP核生成文件&#xff1a;&#xff08;Xilinx/Altera 同&#xff09; IP核生成器生成 ip 后有两个文件对我们比较有用&#xff0c;假…

计算时间复杂度

步骤&#xff1a; 1、找到执行次数最多的语句 2、语句执行语句的数量级 3、用O表示结果 计算时间复杂度的3个出发点&#xff0c;掌握这三个出发点&#xff0c;那么一向搞不懂的时间复杂度就可以迎刃而解啦。 然后&#xff1a; 1、用常数1取代运行时间中的所有加法常数 2、…

领导者的资质——学习笔记(2):领导者的人格

领导者的资质——学习笔记&#xff08;2&#xff09;&#xff1a;领导者的人格在领导者的资质中&#xff0c;人格最为重要。领导者保持自己高层次的人格&#xff0c;是解决当前企业治理危机最根本性的方略。我们要时时事事思考“作为人&#xff0c;何为正确”不断自问自答&…

sql server 2008学习12 事务和锁

事务 事务的点: 1.begin tran 是事务开始的地方,也是 事务回滚的起点.也就说他会忽略这个起点之后的最终没有提交的所有语句, 2.commit tran 事务的提交 是一个事务的终点 当发出 commit tran命令时,可以认为 该事务是 持久的. 撤销已完成事务的唯一方法 是 发出一个新的事务.…

领导者的资质——学习笔记(3):领导者的十项职责

领导者的资质——学习笔记&#xff08;3&#xff09;&#xff1a;领导者的十项职责领导者必须向员工说明工作的目的意义&#xff0c;设定具体目标&#xff0c;制定相应的计划&#xff0c;怀着强烈的愿望&#xff0c;付出不亚于任何人的努力&#xff0c;表现出坚强的意志&#x…

漫画:什么是时间复杂度?

时间复杂度的意义 究竟什么是时间复杂度呢&#xff1f;让我们来想象一个场景&#xff1a;某一天&#xff0c;小灰和大黄同时加入了一个公司...... 一天过后&#xff0c;小灰和大黄各自交付了代码&#xff0c;两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒&#x…

Eclipse如何连接SQL Server 2005数据库

做管理系统当然少不了经常与数据库打交道&#xff0c;在网上搜了很多数据库版本都不小&#xff0c;大的有好几个G的&#xff0c;小的也有几百兆的&#xff0c;我这可怜的内存&#xff0c;最终找了个精简版中的精简版的Sql server2005&#xff0c;只有80几兆&#xff0c;本来只想…

NLP 最新进展

参考文献&#xff1a; •http://www.dataguru.cn/article-14237-1.html •https://zhuanlan.zhihu.com/p/46652512 •https://github.com/google-research/bert •https://allennlp.org/elmo •https://arxiv.org/pdf/1802.05365 •https://arxiv.org/abs/1810.04805

一句话评论设计模式六大原则

注&#xff1a;转自http://blog.csdn.net/jesse621/article/details/7216331 原则&#xff0c;故名思议则是本质的意思。所谓擒贼先擒王&#xff0c;研究设计模式自然要先了解设计原则&#xff0c;所有的模式都是在这些原则的基础之上发展起来的&#xff0c;有的是侧重一 个&am…