文档章节

Apache Ignite事务架构:2阶段提交协议

李玉珏
 李玉珏
发布于 2018/02/28 16:37
字数 1186
阅读 647
收藏 3

本系列文章中,会详细介绍Ignite如何管理键-值API的事务,以及它支持的部分机制和协议,下面是本系列要覆盖的主题:

  • Ignite事务和2阶段提交协议;
  • 并发模型和隔离级别;
  • Ignite持久化层中的事务处理(WAL、检查点及其他);
  • 第三方持久化中的事务处理

在第一篇文章中,我们会先讨论2阶段提交协议(2PC),然后看一下它如何处理各种类型的集群节点。

2阶段提交协议(2PC)

在一个分布式系统中,一个事务可能涉及多个集群节点,很显然,这在确保所有相关节点上的数据一致性方面,面临一些挑战。比如,如果一个节点故障,事务可能在该节点上没有提交。在这个场景中,一个广泛使用的确保一致性的方法就是2阶段提交协议。 顾名思义,它有两个阶段,准备提交,下面看一下细节:

图1:准备阶段

先看一下准备阶段,图1中,有一个示例网络,它由一个客户端(事务发起方),2个主节点和4个备节点组成。 Ignite使用一个分布式哈希表来决定数据在集群中如何分布(分区),集群中中每个主备节点都持有数据的一部分,这些节点会维护一个节点及其拥有的分区的内部分布式哈希表,主备节点只是指向数据所在的位置,主节点就是数据主拷贝所在的位置。如果主节点不可用并且备节点存在的话,数据仍然是可用的。 注意,Ignite没有纯粹的主节点或者备节点,每个节点默认既是主节点,又是备节点,它是一组分区的主节点又是其他分区的备节点。 在图1中,还有一些箭头来显示不同类型节点间的各种消息流:

  1. 客户端发送一个准备消息(1 Prepare)给事务涉及的所有主节点;
  2. 主节点获得所有的锁(取决于事务为悲观还是乐观),然后转发准备消息(2 Prepare)给所有的备节点;
  3. 每个节点会给客户端一个确认(3 ACK, 4 ACK),即所有的锁已经成功获得然后事务准备提交。

图2:提交阶段

下一阶段,会执行提交阶段。在图2中,会看到一个类似于准备阶段的消息流:

  1. 客户端发送提交消息(5 Commit)给事务涉及的所有主节点;
  2. 主节点提交事务并且转发提交消息(6 Commit)给所有的备节点,然后备节点提交事务;
  3. 每个节点返回事务提交成功的确认消息给客户端(7 ACK, 8 ACK)。

这里可能发生许多故障,比如备节点故障,主节点故障,或者甚至客户端故障,我们后续会研究这些场景,然后在其它文章中介绍Ignite如何进行应对。

节点类型

前面的讨论中提到了集群节点的各种类型,客户端节点(事务发起方)在Ignite社区中通常称为近端节点,而其它节点成为远端节点,如图3所示:

图3:节点类型

通常来说,应用会通过客户端节点接入集群,应用和客户端节点的职责分工如下:

  1. 应用调用方法:
  • txStart()
  • cache.put()
  • cache.get()
  • tx.commit()
  1. 客户端节点管理其他的操作:
  • 事务初始化
  • 事务状态跟踪
  • 发送准备和提交消息
  • 协调整个事务过程

下面是Ignite文档中的一小段示例代码,显示了事务的执行方式:

try (Transaction tx = transactions.txStart()) {

    Integer hello = cache.get("Hello");
  
    if (hello == 1)
        cache.put("Hello", 11);
  
    cache.put("World", 22);
  
    tx.commit();
}

本例中会看到,可以通过txStart()方法开始事务,可以通过tx.commit()方法提交事务。相应的,在try块体中,代码在Hello键上执行了一个**cache.get()操作,然后,然后判断值是否为1,如果是,那么通过cache.put()将值改为11,然后通过cache.put()**在缓存中写入另一个键-值对。

总结

在第一篇文章中,快速地预览了2阶段提交协议,然后描述了Ignite的处理方式,在本系列的下一部分中,会看到乐观和悲观锁模型还有隔离级别。

本文译自GridGain的技术布道师Akmal B. Chaudhri的博客

© 著作权归作者所有

李玉珏

李玉珏

粉丝 364
博文 76
码字总数 143787
作品 0
沈阳
架构师
私信 提问
Apache Ignite事务架构:第三方持久化的事务处理

本文是Ignite事务架构系列的最后一篇文章,在之前的文章中,讨论了与键值API的事务处理有关的一系列主题。 第一篇文章中,主要介绍了二阶段提交协议及其工作方式; 第二篇文章中,介绍了锁模...

李玉珏
2018/04/16
0
0
Ignite内存计算平台与Oracle TimesTen Scaleout对比

1.产品介绍 Ignite Ignite内存计算平台是一个高性能、集成化、混合式的企业级分布式架构解决方案,功能强大,有先进的集群管理功能,对于分布式内存数据库、流处理技术、分布式计算、分布式服...

李玉珏
2018/08/09
0
0
内存数据组织 - Apache Ignite

1.Ignite是什么? Apache Ignite是一个以内存为中心的分布式数据库、缓存和处理平台,支持事务、分析以及流式负载,可以在PB级数据上享有内存级的性能。 1.1.Ignite定位 Ignite是不是内存数据...

匿名
2015/01/10
0
8
全面对比,深度解析 Ignite 与 Spark

经常有人拿 Ignite 和 Spark 进行比较,然后搞不清两者的区别和联系。Ignite 和 Spark,如果笼统归类,都可以归于内存计算平台,然而两者功能上虽然有交集,并且 Ignite 也会对 Spark 进行支...

编辑部的故事
2018/09/13
0
0
GridGain 确认 Apache Ignite 性能是 Hazelcast 的 2 倍

针对由 Hazelcast 的CEO,Greg Luck先生撰写的一篇有煽动性的博客,指责 Apache Ignite 社区"伪造"测试结果,该博客引发了一些混乱,我觉得我有必要澄清一下。 老实说,对于从Hazelcast看到这...

oschina
2016/02/24
4.1K
4

没有更多内容

加载失败,请刷新页面

加载更多

巨杉Tech | 微服务趋势下的数据库设计与应用简析

上周五(7月12日)巨杉数据库参与了由得到App主办八里庄技术沙龙活动,分享主题是关于分布式数据库架构与实战。 以下就是根据巨杉数据库现场分享的内容进行的分享实录整理。 巨杉数据库简介 ...

巨杉数据库
17分钟前
9
0
借助URLOS快速安装AliSQL

环境需求 最低硬件配置:1核CPU,1G内存(1+1)提示:如果你的应用较多,而主机节点的硬件配置较低,建议在部署节点时开通虚拟虚拟内存; 生产环境建议使用2G或以上内存; 推荐安装系统:Ubu...

躲猫猫_007
19分钟前
0
0
DM 源码阅读系列文章(九)shard DDL 与 checkpoint 机制的实现

作者:张学程 本文为 DM 源码阅读系列文章的第九篇,在 上篇文章 中我们详细介绍了 DM 对 online schema change 方案的同步支持,对 online schema change 同步方案以及实现细节等逻辑进行了...

TiDB
21分钟前
0
0
mysql指令

mysql指令 连接数据库 mysql -h 127.0.0.1 -u root -p -h : 数据库地址 -u : 用户名 -p : 密码 显示所有数据库 show databases; //显示所有数据库use XXX; //使用指定数据库show t...

xiaobai1315
24分钟前
0
0
C++STL常见面试题

1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,...

shzwork
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部