文档章节

Apache Ignite基线拓扑释疑

李玉珏
 李玉珏
发布于 03/27 13:37
字数 2464
阅读 535
收藏 0

Ignite项目刚开源时,它被定义为一种纯粹的内存解决方案:一种分布式缓存,可将数据放入内存以加快访问速度。但随后在2017年推出了Apache®Ignite™2.1版本,它首次发布了Ignite的原生持久化模块,让Ignite可以作为一个完整的分布式数据库。从那以后Ignite就不再依赖于外部持久性存储机制,以及随之而来的数据库配置和管理问题。

Ignite原生持久化支持分布式ACID并且兼容SQL,可以与Ignite的固化内存架构透明地集成。Ignite持久化是可选的,可以打开和关闭,关闭时,Ignite就是一个纯粹的内存存储。

不过用户也对Ignite的持久化模式产生了一些疑问,例如:“如何防止脑裂情况下难以处理的数据冲突?”,“如果节点故障实际上不会丢失数据,那么如果不做分区再平衡,是否可以继续?“,”如何自动执行比如集群激活这样的操作?“

这些问题都需要给予解答。

Ignite的基线拓扑是服务端节点的一个集合,用于同时在内存和Ignite持久化中存储数据。基线拓扑中的节点在功能方面没有限制,并且也作为常规的服务端节点,充当Ignite中数据和计算的容器。

如果启用了Ignite持久化,则必须要有基线拓扑,它表示集群中将数据保存到磁盘上的一组服务端节点。

通常,当集群在Ignite持久化启用后的首次启动时,集群处于非激活状态,不允许任何CRUD操作。比如,如果尝试执行SQL或键值操作,会抛出异常,如下图所示:

这样做的目的是,在集群重启过程中,如果应用要修改还未加入集群、但是持有数据的节点上的数据时,避免可能出现的性能、可用性和一致性问题。因此需要为启用了Ignite持久化的集群定义基线拓扑,之后就可以手动或通过Ignite自动维护拓扑,下面会深入了解这个概念的细节,看看如何使用它。

基线拓扑:第一步

从概念上讲,内存模式集群是无状态的:没有专用节点,所有节点都是对等的,每个都可以被赋予缓存分区,获得计算任务,或者在其上部署服务。如果节点退出集群,则用户请求将由其它节点接管,并且已删除节点的数据将不再可用。

在持久化模式下,节点即使在重启后仍保持有状态,在启动期间,节点会从磁盘读取数据,并恢复状态。因此,节点的重新加载不需要从其它集群节点进行数据复制(也称为再平衡),在故障发生时存在于集群中的数据也将从本地磁盘恢复。

基线拓扑是将有状态的节点集(可在重启后恢复)与其它节点区分开来的机制,基线拓扑(后续称为“BLT”)其实就是配置了数据存储的节点标识符的集合。

持久化的数据:冲突保护

分布式系统的脑裂问题已经很难处理,但是在开启持久化的背景下变得更为危险,考虑一个简单的场景,比如有一个集群和一个复制缓存,然后执行以下操作:

  • 停止集群然后启动一个叫做子集A的子集群;
  • 更新缓存中的部分数据;
  • 停止该子集然后启动子集B;
  • 对同样的键执行其它一些更新操作。

因为Ignite工作于数据库模式,所以在第二个子集的节点被搁置后,更新不会丢失,如果我们再次运行第二个子集,这个数据仍然有效,恢复初始集群后,不同的节点可以包含相同键的不同值。

只是通过停止和运行节点,集群中的数据就已经处于未定义状态,这是不可能自动解决的,需要BLT来防止这种情况。

这个想法就是,在持久化模式下,集群需要另一个阶段:激活。

在第一次激活期间,在磁盘上创建并保存了第一个基线拓扑,其中包含了激活时集群中存在的每个节点的信息。

此数据还包括根据在线节点的ID计算的哈希值。如果在下次激活期间拓扑缺少某些节点(例如集群重新加载并且一个节点停止服务),则将再次计算哈希值,并将之前的值保存在相同BLT的激活历史记录中。

因此,基线拓扑维护了一个哈希链,描述了每次激活后的集群构成。

在阶段1和阶段3,启动节点子集后,需要激活不完整的集群,然后每个在线节点将在本地更新BLT,即向其中添加新的哈希。每个子集的所有节点都可以计算相同的哈希,但不同子集的哈希值会不同。

这时可能会猜到以下内容:如果某个节点尝试加入其它的组,则系统会认为其在该组之外已被激活,并且将拒绝访问。

但是要注意,这种验证机制不会对脑裂场景中的冲突提供绝对保护。如果集群分成两半,例如每半部分至少保留一个分区的副本,并且这一半没有重新激活,可能会遇到每一半都发生相同数据冲突变化的情况。BLT与CAP定理不冲突,但通过显式管理错误保护用户免受冲突。

好处

除了防止冲突,BLT还可以增强一些很好的兼容性。

好处1:少一个手动动作。应在每次集群重启后手动完成上述激活; 没有“开箱即用”的自动化解决方案。使用BLT,集群可以独立决定是否需要激活。

虽然Ignite集群是一个弹性系统,可以自动添加或删除节点。BLT基于此,在数据库模式下,帮助用户维护稳定的集群配置。

首次激活集群时,新组成的基线拓扑会记住拓扑中应存在哪些节点。重新启动后,每个节点都会检查其它BLT节点的状态,一旦所有节点进入在线状态,集群将自动激活。

好处2:更节省网络资源。当然,这个想法建立在拓扑结构长期保持稳定的前提下。在BLT之前,如果节点从拓扑中退出哪怕10分钟,都会导致缓存分区再平衡以维持足够的备份。但是,如果节点几分钟内就能恢复,为什么要花费网络资源并拖慢整个集群的速度?基线拓扑就可以对这种情况进行优化。

集群默认会假定故障节点将很快恢复,此时间段内,某些缓存可以使用较少的备份,但不会导致服务减慢或停止。

管理基线拓扑

因此就可以知道,基线拓扑由第一次集群激活时自动配置,激活之后,在BLT中就持有了所有在线的服务端节点。

手工BLT管理是通过Ignite发行版的控制脚本实现的,相关的详细说明请参见这个文档

该脚本暴露了一个非常简单的API,仅支持三种操作:添加节点删除节点配置新的基线拓扑

虽然添加节点是一个相对简单的操作而没有重大风险,但是从BLT中删除节点就是一项更复杂的任务。在生产环境下执行此操作可能会导致竞争,即在最糟糕的情况下,整个集群可能会无响应。因此删除需要满足一个条件:要删除的节点必须处于离线状态,如果尝试删除在线节点,脚本将抛出异常从而终止。

从BLT中删除节点时,还需要手工执行一项操作:停止此节点。因为这种情况不常见,所以这点额外的工作也可以忽略不计。

用于BLT管理的Java接口甚至更简单:它只公开了一个方法,基于一个节点列表配置基线拓扑。

结论

维护数据的完整性工作必不可少,必须在任何数据存储中解决。关于分布式关系数据库,尤其是Ignite,这个任务变得更具挑战性,考虑一些实际的、数据完整性可能被破坏的场景,基线拓扑会提供很多的帮助。

Ignite还对性能高度重视,BLT还有助于显着节省资源并缩短系统响应时间。

原生持久化功能最近才实现,必将不断发展,变得更强大、更高效、更易于使用,而基线拓扑概念也会随之不断演变。

© 著作权归作者所有

李玉珏

李玉珏

粉丝 387
博文 79
码字总数 149758
作品 0
沈阳
架构师
私信 提问
加载中

评论(6)

h
hanson_lt
@李玉珏 您好,想跟你请教个问题: 我有两个ignite节点,partition方式部署、建表时 backup为1; 其中一台机器A断开连接,然后我终止了两个节点A和B进程; 由于是partition方式,所以我认定B有完整数据、  然后我启动了B,并且activate提供服务;  如果这时候我再启动另外一台A,会出现什么情况呢?会增量的reblance么? 还是说我需要清空A的数据,再加入节点?
Dmen时光
Dmen时光

引用来自“Dmen时光”的评论

李先生,你好!

关于JDBC客户端 (流模式(批处理模式)将数据注入Ignite集群)
jdbc:ignite:cfg://streaming=true:streamingFlushFrequency=1000@file :///etc/config/ignite-jdbc.xm下的file:///etc/config/ignite-jdbc.xm,的配置是例子的问题,原谅我一直测试失败,这个配置文件有相关的例子嘛~

引用来自“李玉珏”的评论

原则上就是一个正常的Ignite配置文件。
李先生,您好!
于JDBC客户端 (流模式(批处理模式)将数据注入Ignite集群)流模式
jdbc:ignite:cfg://streaming=true:streamingAllowOverwrite=true:transactionsAllowed=true:streamingFlushFrequency=1000:cache=drc_web_gzdx@file :conf/example-ignite.xml; JDBC流模式覆写配置无效,出现Exception in thread "main" java.sql.BatchUpdateException: javax.cache.CacheException: Duplicate key during INSERT [key=121312313]
李玉珏
李玉珏 博主

引用来自“Dmen时光”的评论

李先生,你好!

关于JDBC客户端 (流模式(批处理模式)将数据注入Ignite集群)
jdbc:ignite:cfg://streaming=true:streamingFlushFrequency=1000@file :///etc/config/ignite-jdbc.xm下的file:///etc/config/ignite-jdbc.xm,的配置是例子的问题,原谅我一直测试失败,这个配置文件有相关的例子嘛~
原则上就是一个正常的Ignite配置文件。
Dmen时光
Dmen时光
李先生,你好!

关于JDBC客户端 (流模式(批处理模式)将数据注入Ignite集群)
jdbc:ignite:cfg://streaming=true:streamingFlushFrequency=1000@file :///etc/config/ignite-jdbc.xm下的file:///etc/config/ignite-jdbc.xm,的配置是例子的问题,原谅我一直测试失败,这个配置文件有相关的例子嘛~
李玉珏
李玉珏 博主
Ignite数据分布中的两种模式,在2个节点的情况下:
分区:如果不考虑备份,那么每个节点大体上保存总体数据量的一半,但是不一定是严格数学意义上的对半分,只要加起来总数正确就是对的;
复制:实际上可以理解为一主一备,2个节点上的数据量是一样的。
zhiwen_wang
zhiwen_wang
hi 玉珏 我这集成ignite是集群模式,一共两个节点,但是两个节点上面的数据不同步.之前用的是PAREPLICATED模式,发现数据一致,后来换成了PARTITIONED模式. 现在 又出现了两个节点数据不一致的问题.请问一下这个问题该怎么解决呢?
搭建第一个Ignite集群时的注意事项

开发者在搭建第一个Ignite集群时,常常会遇到各种障碍,社区在收集了各种常见问题后,整理了一份检查清单帮助开发者,总之,本文的目的是帮助开发者在一开始就搭建一个正常的集群,走在正确的...

李玉珏
03/27
1K
3
Apache Ignite原生持久化概述

很多人会问,Ignite有没有持久化存储,或者说是不是一个单纯的内存存储? 答案是都有,Ignite的原生持久化可以打开,也可以关闭。这使得Ignite可以存储比可用内存量大得多的数据集,也就是说...

李玉珏
02/11
522
0
Apache Ignite 2.5.0 版本发布,千级节点伸缩性

Apache Ignite 2.5: 千级节点伸缩性 Apache Ignite的用户通常知道的两个关键点是-扩展性和性能。在很多分布式系统的整个生命周期中,通常会不停地改进性能,而对扩展性相关的改进次数,会比较...

李玉珏
2018/06/01
1K
10
Apache Ignite的Node.js客户端使用入门

介绍 Ignite原生提供了若干种主要编程语言的支持,最近,还通过瘦客户端技术对其它的编程语言提供了支持,其中在2.7版本中新增加的瘦客户端包括Python、PHP和Node.js。 瘦客户端具有如下的特...

李玉珏
02/13
267
0
Apache Ignite 2.5.0 版本发布,紧急问题修复

特性和改进 Apache Ignite Linux packages 2.6 update [#IGNITE-8807] Windows WSL configuration has to be added to Ignite configs [#IGNITE-8804] Support reuse of already initialized......

李玉珏
2018/07/19
3
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊rocketmq的pullThresholdForTopic

序 本文主要研究一下rocketmq的pullThresholdForTopic pullThresholdForTopic rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java publi......

go4it
15分钟前
6
0
sqlplus / as sysdba 没有权限

想通过如下命令登陆,这种方式是以操作系统权限认证的oracle sys管理员登陆 sqlplus / as sysdba BUT.... 提示我没有权限, 百度下是由于当前用户不在ora_dba用户组中 (我的环境是win10) ...

1只特立独行的猪
29分钟前
6
0
[2019好程序员大数据教程]SparkGraphx从入门到精通(33集视频+源码+笔记)

1、什么是Spark GraphX? Spark GraphX是一个分布式的图处理框架。社交网络中,用户与用户之间会存在错综复杂的联系,如微信、QQ、微博的用户之间的好友、关注等关系,构成了一张巨大的图,单...

好程序员官网
今天
9
0
DDD(十)--仓储

1、引言 DDD中的Repository(仓储):协调领域和数据映射层,利用类似与集合的接口来访问领域对象。——《领域驱动设计-软件核心复杂性应对之道》 仓储是DDD中产生的概念,也就是说,如果应...

MrYuZixian
今天
10
0
Jenkins的多种迁移方法

说明 Jenkins有时需要进行迁移,主目录会发生改变,本文主要讲解如何更改主目录。由于jenkins安装方式的不同,主目录也不一样。 本测试环境:Centos7.6 X64。注意:在更改主目录之前,请一定...

Elson
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部