flink exactly-once系列目录:

一、两阶段提交概述

二、TwoPhaseCommitSinkFunction与FlinkKafkaProducer源码分析

三、StreamingFileSink源码分析

四、事务性输出实现

五、最终一致性实现

一、flink Exactly-Once与At-Least-Once

关于消息的消费、处理语义可以分为三类:

1. at most once : 至多一次,表示一条消息不管后续处理成功与否只会被消费处理一次,那么就存在数据丢失可能

2\. exactly once : 精确一次,表示一条消息从其消费到后续的处理成功,只会发生一次

3\. at least once :至少一次,表示一条消息从消费到后续的处理成功,可能会发生多次

在我们程序处理中通常要求能够满足exectly once语义,保证数据的准确性,flink 通过checkpoint机制提供了Exactly-Once与At-Least-Once 两种不同的消费语义实现, 可以将程序处理的所有数据都保存在状态内部,当程序发生异常失败重启可以从最近一次成功checkpoint中恢复状态数据,通过checkpoint中barrier对齐机制来实现这两不同的语义,barrier对齐发生在一

image

个处理节点需要接收上游不同处理节点的数据,由于不同的上游节点数据处理速度不一致,那么就会导致下游节点接收到 barrier的时间点也会不一致,这时候就需要使用barrier对齐机制:在同一checkpoint中,先到达的barrier是否需要等待其他处理节点barrier达到后在发送后续数据,barrier将数据流分为前后两个checkpoint(chk n,chk n+1)的概念,如果不等待那么就会导致chk n的阶段处理了chk n+1阶段的数据,但是在source端所记录的消费偏移量又一致,如果chk n成功之后,后续的任务处理失败,任务重启会消费chk n+1阶段数据,就会到致数据重复消息,如果barrier等待就不会出现这样情况,因此barrier需要对齐那么就是实现exectly once语义,否则实现的是at least once语义。由于状态是属于flink内部存储,所以flink 仅仅满足内部exectly once语义。

二、两阶段提交2PC

在分布式系统中,可以使用两阶段提交来实现事务性从而保证数据的一致性,两阶段提交分为:预提交阶段与提交阶段,通常包含两个角色:协调者与执行者,协调者用于用于管理所有执行者的操作,执行者用于执行具体的提交操作,具体的操作流程:

1. 首先协调者会送预提交(pre-commit)命令有的执行者

2. 执行者执行预提交操作然后发送一条反馈(ack)消息给协调者

3. 待协调者收到所有执行者的成功反馈,则发送一条提交信息(commit)给执行者

4. 执行者执行提交操作

image

如果在流程2中部分预提交失败,那么协调者就会收到一条失败的反馈,则会发送一条rollback消息给所有执行者,执行回滚操作,保证数据一致性;但是如果在流程4中,出现部分提交成功部分提交失败,那么就会造成数据的不一致,因此后面也提出了3PC或者通过其他补偿机制来保证数据最终一致性,接下看看flink 是如何做到2PC,保证数据的一致性。

三、flink中两阶段提交

flink中两阶段提交是为了保证端到端的Exactly Once,主要依托checkpoint机制来实现,先看一下checkpoint的整体流程,

image

1\. jobMaster 会周期性的发送执行checkpoint命令(start checkpoint);

2.当source端收到执行指令后会产生一条barrier消息插入到input消息队列中,当处理到barrier时会执行本地checkpoint, 并且会将barrier发送到下一个节点,当checkpoint完成之后会发送一条ack信息给jobMaster ;

3\. 当DAG图中所有节点都完成checkpoint之后,jobMaster会收到来自所有节点的ack信息,那么就表示一次完整的checkpoint的完成;

4. JobMaster会给所有节点发送一条callback信息,表示通知checkpoint完成消息,这个过程是异步的,并非必须的,方便做一些其他的事情,例如kafka offset提交到kafka。

对比flink 整个checkpoint机制调用流程可以发现与2PC非常相似,JobMaster相当于协调者,所有的处理节点相当于执行者,start-checkpoint消息相当于pre-commit消息,每个处理节点的checkpoint相当于pre-commit过程,checkpoint ack消息相当于执行者反馈信息,最后callback消息相当于commit消息,完成具体的提交动作。那么我们应该怎么去使用这种机制来实现2PC呢?

flink 提供了CheckpointedFunction与CheckpointListener这样两个接口,CheckpointedFunction中有snapshotState方法,每次checkpoint触发执行方法,通常会将缓存数据放入状态中,可以理解为是一个hook,这个方法里面可以实现预提交,CheckpointListener中有notifyCheckpointComplete方法,checkpoint完成之后的通知方法,这里可以做一些额外的操作,例如FlinkKafakConsumerBase 使用这个来完成kafka offset的提交,在这个方法里面可以实现提交操作。

在2PC中提到如果对应流程2预提交失败,那么本次checkpoint就被取消不会执行,不会影响数据一致性,那么如果流程4提交失败了,在flink中可以怎么处理的呢? 我们可以在预提交阶段(snapshotState)将事务的信息保存在state状态中,如果流程4失败,那么就可以从状态中恢复事务信息,并且在CheckpointedFunction的initializeState方法中完成事务的提交,该方法是初始化方法只会执行一次,从而保证数据一致性。

flink的mysql两阶段提交_flink 两阶段提交相关推荐

  1. mysql 两阶段提交_两阶段提交(2PC)

    2PC两阶段提交协议: P-准备阶段(prepare) C-提交阶段(commit) 概念 在计算机部分关系数据库,如oracle和mysql中支持两阶段提交协议: 准备阶段(prepare phas ...

  2. 两阶段提交与三阶段提交

    两阶段提交是什么? 两阶段提交非常有名,其原因主要有两点: 一个是历史很悠久: 二是其定义是很模糊的,它首先不是一个协议,更不是一个规范,而仅仅是作为一个概念存在,故从传统的关系统数据库一致的最新的 ...

  3. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  4. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规 ...

  5. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究...

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规 ...

  6. 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]...

    1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...

  7. CAP原理,分布式一致性算法,两阶段提交,三阶段提交,Paxos,Raft,zookeeper的选主过程,zab协议,顺序一致性,数据写入流程,节点状态,节点的角色

    我们知道,一般在分布式应用都有CAP准则: C Consistency, 一致性,分布式中的各个节点数据保持一致 A availability 可用性,任何时刻,分布式集群总是能够提供服务 P par ...

  8. 分布式两阶段提交和三阶段提交

    随着大型网站的各种高并发访问.海量数据处理等场景越来越多,如何实现网站的高可用.易伸缩.可扩展.安全等目标就显得越来越重要. 为了解决这样一系列问题,大型网站的架构也在不断发展.提高大型网站的高可用架 ...

  9. 分布式事务:两阶段提交与三阶段提交

    两阶段提交与三阶段提交 分布式事务 二阶段提交 请求阶段 提交阶段 举例 故障分析 柜员侧出现故障或拒绝Proposal 第一阶段经理侧出现故障 第二阶段经理侧出现故障 二阶段提交存在的问题 三阶段提 ...

最新文章

  1. Tomaso Poggio:深度学习需要从炼金术走向化学
  2. python列表取出元素_python中的列表,添加元素,获取元素,删除元素,列表分片,常用操作符...
  3. 第三章 系统指令与汇编程序设计 3.1 单片机指令系统
  4. js jQuery取消添加超链接的方法小结
  5. HTML——meta标签
  6. 解决Driver/library version mismatch
  7. 如何限制修改IP地址
  8. 关于用Sql Server 2008 搭建一个多评委多客户端的比赛打分平台的整体构想
  9. Greedy Mouse 贪心的耗子 nyoj824(贪心算法)
  10. C语言常量定义#define和const区别解析
  11. 数据结构 复习攻略 新手必看
  12. Visio 2019 专业版安装教程
  13. usb声卡驱动_艾肯iCON ProDrive第三代USB声卡驱动全新发布!
  14. VS Code自定义代码颜色
  15. scratch打棒球游戏 电子学会图形化编程scratch等级考试四级真题和答案解析2019-12
  16. 法国物联网公司Sigfox 获1.6亿美元E轮融资
  17. 计算机主机上有几个按钮,电脑键盘各个按键有哪些作用 电脑键盘各个按键作用介绍...
  18. 线性代数——对向量的线性组合中的“线性”的理解
  19. crash工具分析sysdump使用
  20. 猫咪藏在哪个房间python_‎App Store 上的“敢问猫在何方 - 妈妈把我的猫咪藏起来了”...

热门文章

  1. 1.用于记录Lightroom的快捷键
  2. Linxu SSH登陆出现Access Denied错误的解决方法
  3. Outlook Add-in
  4. spack - 无法下载的包怎么办?
  5. 关于excel的导入与导出
  6. python集合是可变类型吗_python集合是可变类型吗
  7. 关于队里面最菜的在博客打卡第五十九天这件事
  8. 交换机cpu负载90%以上(二)【新任帮主】
  9. Ubuntu配置nginx
  10. 陕西理工大学计算机类专业怎么样,陕西理工大学怎么样 评价排名好不好(10条)...