apache ignite_Apache Ignite本机持久性,简要概述

apache ignite

通过将数据的工作集放入系统内存中,内存中方法可以达到极高的速度。 当所有数据都保存在内存中后,就不再需要处理使用传统旋转磁盘引起的问题。 例如,这意味着无需维护数据的其他缓存副本并管理它们之间的同步。 但是这种方法还有一个缺点,因为数据仅在内存中,如果整个集群都终止了,数据将无法生存。 因此,根本不认为此类数据存储具有持久性。

在这篇博客文章中,我将努力探索Apache Ignite的本机持久性新功能,并提供清晰易懂的图片,说明Apache Ignite的本机持久性如何工作。

在大多数情况下,您不能(不应)将整个数据集存储在应用程序的内存中,大多数情况下,应该存储相对较小的热数据或活动数据子集,以提高应用程序的性能。 其余数据应存储在低成本磁盘或磁带中的某个位置以进行归档。 有两种主要的内存数据库存储需求:

  • 如果需要将内存数据库重新加载到内存中,则永久介质可以存储已提交的事务,从而保持持久性并用于恢复目的。
  • 永久存储,用于保存整个内存数据库的备份副本。

永久存储或媒体可以是任何分布式或本地文件系统,SAN,NoSQL数据库,甚至是RDBMS(例如Postgres或Oracle)。 Apache Ignite(从1.5版开始)提供了一种优雅的方式来连接持久性数据存储(例如RDBMS或NoSQL DB,例如Mongo DB或Cassandra)。 RDBMS中的持久性通常是瓶颈,并且您永远不会在系统中获得水平扩展。 有关更多信息,我建议您阅读“ 使用Apache Ignite进行高性能内存计算 ”一书中的示例章节。

因此,从版本2.1.0开始 ,Apache Ignite提供了与ACID和SQL兼容的磁盘存储,该磁盘存储与Ignite的持久性内存透明集成,作为可选的磁盘层,用于存储SSD,Flash,3D XPoint和其他类型的非易失性数据和索引仓库。

Apache Ignite本机持久性使用新的持久性内存架构 ,该架构允许存储和处理数据以及在内存和磁盘上建立索引。 只要启用该功能,Apache Ignite就会根据其容量将超数据集存储在磁盘上,并将一部分数据存储在RAM中。 如果RAM中缺少数据子集或索引,则耐用内存将从磁盘中取出数据,如下图所示。

数据也可以存储在中央磁盘存储中,所有Ignite节点都连接在中央磁盘存储中,如下所示。

在开始之前,让我们在沙箱中介绍项目的先决条件:

  1. Apache Ignite版本2.1.0
  2. JVM 1.8
  3. Apache Maven版本> 3.0.3
  4. *基于nix的操作系统

安装。

基本上有两种使用Apache Ignite的方法:

  • 下载二进制发行版,然后将归档文件解压缩到操作系统中的某个位置,然后使用spring config文件运行./ignite.sh bash脚本。
  • 使用所需的Apache Ignite依赖关系创建一个maven项目,通过java代码配置节点并运行它。

在这里,我将使用第一个选项。

第1步。

  • 下载 Apache Ignite二进制发行版,并将发行版解压缩到沙箱中的某个位置。
  • 修改IGNITE_HOME / examples / config / persistentstore / example-persistent-store.xml文件,并注释高速缓存配置的以下部分。
<property name="cacheConfiguration">
<list><bean class="org.apache.ignite.configuration.CacheConfiguration"><property name="name" value="testCache"/><property name="backups" value="1"/><property name="atomicityMode" value="TRANSACTIONAL"/><property name="writeSynchronizationMode" value="FULL_SYNC"/><property name="indexedTypes"><list><value>java.lang.Long</value><value>org.apache.ignite.examples.model.Organization</value></list></property></bean></list>
</property>

请注意,要启用Ignite本机持久性,只需传递以下配置(PersistentStoreConfiguration的实例),该配置已在example-persistent-store.XML文件中进行了预配置。

<property name="persistentStoreConfiguration">
<bean class="org.apache.ignite.configuration.PersistentStoreConfiguration"/>
</property>
  • 从IGNITE_HOME目录运行以下命令。
./ignite.sh $IGNITE_HOME/examples/config/persistentstore/example-persistent-store.xml
Step 2. create a Maven project with the following command.
mvn archetype:create -DgroupId=com.blu.imdg -DartifactId=ignite-persistence
  • 在pom.xml中添加以下依赖项
<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-core</artifactId><version>2.1.0</version></dependency><dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-spring</artifactId><version>2.1.0</version></dependency><dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-indexing</artifactId><version>2.1.0</version></dependency>
  • 创建具有以下内容的Java类。
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello Ignite");// create a new instance of TCP Discovery SPITcpDiscoverySpi spi = new TcpDiscoverySpi();// create a new instance of tcp discovery multicast ip finderTcpDiscoveryMulticastIpFinder tcMp = new TcpDiscoveryMulticastIpFinder();tcMp.setAddresses(Arrays.asList("localhost")); // change your IP address here// set the multi cast ip finder for spispi.setIpFinder(tcMp);// create new ignite configurationIgniteConfiguration cfg = new IgniteConfiguration();cfg.setClientMode(true);// set the discovery§ spi to ignite configurationcfg.setDiscoverySpi(spi);// Start igniteIgnite ignite = Ignition.start(cfg);ignite.active(true);// get or create cacheIgniteCache cache = ignite.getOrCreateCache("testCache");// put some cache elementsfor (int i = 1; i <= 100; i++) {cache.put(i, Integer.toString(i));}// get them from the cache and write to the consolefor (int i = 1; i <= 100; i++) {System.out.println("Cache get:" + cache.get(i));}ignite.close();}
}

请注意,我们使用Ignite客户端模式来处理数据。 运行HelloWorld应用程序后,应在缓存中插入100个元素(缓存名称
testCache )。

第三步

  • 让我们使用ignitevisor命令工具检查数据。 在ignitevisor命令工具中使用cache -scan命令。 您应该在控制台中得到类似的插图。 缓存中的所有100个元素。
    • 现在,让我们看看引擎盖下发生了什么。
du -h .

您应该在控制台中得到如下所示的内容。

如果启用了Apache Ignite本机持久性,则Ignite将在所有群集节点上的内存和磁盘上持久存储所有数据和索引。

如果要通过目录db / 0_0_0_0_0_0_0__10_211_55_2_10_37_129_2_127_0_0_1_192_168_1_37_47500(在我的情况下),则将为每个缓存找到单独的文件夹。 名称为cache-testCache的文件夹将包含我们刚刚插入的所有缓存条目(100个元素)。

文件index.bin是缓存条目的索引,每个缓存元素都获取其各自的页面文件。 为什么会这样呢? 现在,Ignite体系结构是基于页面的体系结构。 让我们仔细看看,内存现在分为区域->区域分为段->段分为页。 页面可以交换到磁盘中。 页面可以存储:

  • 数据
  • 元数据
  • 指数

页面是固定长度的块,它还支持自动碎片整理。 如果仔细看一下页面大小,它们全都是14 KB。 每当Ignite需要从磁盘加载数据时,它只会加载页面文件,因此速度非常快。

同样,还有一个关于预写日志(WAL)的概念。 如果进行更新,则首先将更新内存中的数据并将页面标记为脏,然后将数据持久保存到预写日志中。 点燃只是将更新附加到WAL文件中。 WAL文件与Cassandra commitlog文件非常相似,但有一个区别。 Cassandra将并行写入内存和磁盘上的commitlog文件,另一方面,Ignite首先将数据更新到内存中,然后将数据附加到WAL中。 有关更多信息,我建议您看看
文档 ,这是非常详尽的。

第4步。

  • 重新启动Ignite节点,并检查缓存
    testCache
    点火器 。 您最终会惊讶地发现没有数据进入缓存。
  • 让我们稍微修改一下helloworld类,然后再次运行该应用程序,注释或删除以下代码片段,如下所示。
// put some cache elements
for (int i = 1; i <= 100; i++) {cache.put(i, Integer.toString(i));
}
Run the application and check the cache testCache through ignitevisor and you application console.

每当发生任何读取请求时,Ignite首先都会将数据检入内存。 如果内存中不存在该数据集,则Ignite立即从磁盘加载缓存条目并加载到内存中。 还要注意的是,所有条目都以堆的形式进入内存。

好处

借助Ignite本机持久性,现在您可以轻松地进行数据恢复备份,Denis Magda通过使用Ignite本机持久性撰写了一篇有关数据恢复的综合文章 。 我在这里必须提到的一件事是集群之间的数据复制。 通过使用Ignite本机持久性,现在您可以在线将数据从一个群集复制到另一个群集。 您可以使用任何基于磁盘的标准数据复制工具将已更改的数据集从主数据中心复制到备用数据中心或Ignite群集。

翻译自: https://www.javacodegeeks.com/2017/09/apache-ignite-native-persistence-brief-overview.html

apache ignite

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

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

相关文章

java编程九九乘法表_如何用JAVA语言编写一个九九乘法表

教一下学了JAVA語言的同学们撰写一个99玖玖乘决表方法进行设计构思&#xff1a;假如把99玖玖乘决报表中如“1*11”算式全部当作一个一字的笔画体得话&#xff0c;99玖玖乘决表可当作一个倾斜角二五长方形形&#xff0c;进行倾斜角二五长方形形可用两个for循环系统软件嵌套循环来…

python tkinter 安装_如何为Python安装tkinter?

如果你和我一样&#xff0c;由于你在I.S中的好朋友而在你的网络上没有根目录特权&#xff0c;而且你是在本地安装中工作的&#xff0c;你可能会在上面的方法上遇到一些问题。 我在谷歌上花了很长时间--但最终&#xff0c;这很容易。 要在Linux上本地安装(我将其安装到我的主目录…

Linux 命令之 more -- 显示文本文件内容/显示文件内容/查看文件内容

文章目录一、命令介绍二、常用选项三、命令内部操作快捷键四、参考示例&#xff08;一&#xff09;显示文件file的内容&#xff0c;显示之前先清屏&#xff0c;附已显示的百分比&#xff08;二&#xff09;显示文件file的内容&#xff0c;每10行显示一次&#xff0c;而且在显示…

java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索

java jigsawJava 9由于Jigsaw项目而延迟了很多次&#xff0c;您可能会听到很多关于模块&#xff0c;模块化和其他内容的信息&#xff0c;那么&#xff0c;这到底是什么呢&#xff1f; 什么是模块化&#xff0c;模块化平台是什么意思&#xff1f; Java平台模块系统&#xff08;J…

java conf_JAVA 解析、编辑nginx.conf详解

最近工程开发遇到一个需求&#xff1a;用Java去解析并编辑nginx.conf解析nginx.conf过程可以参考该项目的README.md下面举个列子说明一下该如何编辑nginx.conf。定义一个pojoimportcom.alibaba.fastjson.JSONArray;importcom.google.common.base.Strings;importlombok.Data;Dat…

mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

最近在线上环境遇到了一次SQL慢查询引发的数据库故障&#xff0c;影响线上业务。经过排查后&#xff0c;确定原因是&#xff1a;SQL在执行时&#xff0c;MySQL优化器选择了错误的索引(不应该说是“错误”&#xff0c;而是选择了实际执行耗时更长的索引)。排查过程中&#xff0c…

Linux 命令之 head -- 在屏幕上显示指定文件的开头若干行/显示文件开头内容/查看文件开头内容

文章目录命令介绍常用选项参考示例&#xff08;一&#xff09;显示前 3 行文件内容&#xff08;二&#xff09;显示文件名信息&#xff0c;并显示文件前两行&#xff08;三&#xff09;显示文件前5个字符命令介绍 head 命令用于显示文件的开头的内容。在默认情况下&#xff0c…

java登录界面命令_Java命令行界面(第25部分):JCommando

java登录界面命令JCommando 网站 上将JCommando描述为“命令行参数的Java参数解析器”。 JCommando读取XML配置以生成一个Java类&#xff0c;该类处理Java应用程序中的解析。 在提供XML配置的 Java命令行解析库的本系列文章中&#xff0c;以前涵盖的唯一基于Java的库是JSAP &am…

数据追加用什么函数_RL用算法发现算法:DeepMind 数据驱动「价值函数」自我更新,14款Atari游戏完虐人类!...

【新智元导读】击败卡斯帕罗夫的「深蓝」并不是真正的人工智能&#xff0c;它过度依赖了人类设计的规则&#xff0c;而最近DeepMind的一项深度强化学习新研究表明&#xff0c;不用人工介入&#xff0c;完全数据驱动&#xff0c;算法自己就能发现算法。「深蓝」并非以智取胜&…

Linux 命令之 tail -- 在屏幕上显示指定文件的末尾若干行/显示文件尾部内容/查看文件尾部内容

文章目录一、命令介绍二、常用选项三、参考示例&#xff08;一&#xff09;显示文件 file 的最后 10 行&#xff08;二&#xff09;显示文件 file 的内容&#xff0c;从第 20 行至文件末尾&#xff08;三&#xff09;显示文件file的最后10个字符&#xff08;四&#xff09;显示…

python的循环语句机制_Python-for循环的内部机制

Python中&#xff0c;使用for循环可以迭代容器对象中的元素&#xff0c;这里容器对象包括是列表(list)、元组(tuple)、字典(dict)、集合(set)等。但是&#xff0c;为什么这些对象可以使用for循环进行操作呢&#xff1f;首先&#xff0c;定义一个简单的类尝试一下&#xff1a;cl…

迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答

迈克尔 杰克逊mv在上一篇文章中&#xff0c;我们学习了如何解析过大的XML文件并将其转换为RxJava流。 这次让我们看一个大的JSON文件。 我们的示例将基于微小的colors.json&#xff0c;其中包含将近150种这种格式的记录&#xff1a; {"aliceblue": [240, 248, 255, …

@cacheable 是否缓存成功_缓存策略:如何使用缓存来减少磁盘IO?

现代的消息队列&#xff0c;都使用磁盘文件来存储消息。因为磁盘是一个持久化的存储&#xff0c;即使服务器掉电也不会丢失数据。绝大多数用于生产系统的服务器&#xff0c;都会使用多块儿磁盘组成磁盘阵列&#xff0c;这样不仅服务器掉电不会丢失数据&#xff0c;即使其中的一…

Linux 启动/停止/重启 SSH 进程,以及查看 SSH 进程状态的命令

请参考文章《Linux 启动/重启/关闭 MySQL 数据库的命令》

g++ 安装python_以后再也不用“教程”:让人举一反三的python配置环境过程 + 超简单原理概括!...

前言&#xff1a; 前一阵子至少指导了5位学弟学妹小伙伴配置 python 环境。两年前我入门 python 时&#xff0c;也得照着互联网上的资料&#xff0c;一步一步“照猫画虎”&#xff1b;为什么现在自己可以“凭感觉”一气呵成了呢&#xff1f;我想&#xff0c;原因必然是自己对于…

MacBook/MacOS/Mac OS 关于启动/停止/重启服务(进程/程序)的命令

文章目录使用命令 launchctl 停止某个进程使用命令 launchctl 启动某个进程使用命令 launchctl 查看某个进程是否启动使用命令 launchctl 停止某个进程 liaowenongdeair:bin root# sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist说明&#xff1a; .plist …

通过Java和Spring Boot应用程序将Gmail用作SMTP服务器

Gmail用户可以使用Gmail的SMTP服务器smtp.gmail.com从其Spring Boot应用程序发送电子邮件。 为此&#xff0c;让我们在应用程序中进行一些设置&#xff1a; 在application.properties文件中提供SMTP连接属性&#xff1a; spring.mail.hostsmtp.gmail.com spring.mail.username…

java面向对象类似atm的题_Java面向对象练习题之银行存取款

编写Java应用程序。首先定义一个描述银行账户的Blank类&#xff0c;包括成员变量“账号”和“存款余额”&#xff0c;成员方法有“存款”、“取款”和“余额查询”。其次&#xff0c;编写一个主类&#xff0c;在主类中测试Blank类的功能。String ZhangHao;double YuE;Blank(Str…

mongodb如何写入图片_CTO之瞳-数据库-MongoDB

MongoDB&#xff0c;常用的NoSql数据库&#xff0c;在https://db-engines.com/en/ranking 里被分类为文档型数据库。​本文从以下五个方面来了解MongoDB (和上一篇一样&#xff0c;基础操作请查询官方文档或者菜鸟教程&#xff09;使用场景存储引擎性能测试索引-B树分片与复制1…

技术停滞_检测和测试停滞的流– RxJava常见问题解答

技术停滞假设您有一个流以不可预测的频率发布事件。 有时您可以预期每秒会有数十条消息&#xff0c;但是偶尔几秒钟都看不到任何事件。 如果您的流是通过Web套接字&#xff0c;SSE或任何其他网络协议传输的&#xff0c;则可能会出现问题。 静默时间过长&#xff08;停顿&#x…