1.概述
本篇博客将对Ignite的基础环境、集群快照、分布式计算、SQL查询与处理、机器学习等内容进行介绍。
2.内容
2.1 什么是Ignite?
在学习Ignite之前,我们先来了解一下什么是Ignite?首先,Ignite是Apache开源的顶级项目之一。Ignite 内存数组组织框架是一个高性能、集成和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不同的数据源之间提供高性能、分布式内存中数据组织管理的功能。
2.2 安装环境要求
Apache Ignite官方在如下环境中进行了测试:
- JDK:Oracle JDK8、11或17,Open JDK8、11或17,IBM JDK8、11或17;
- OS:Linux(任何版本),Mac OS X(10.6及以上),Windows(XP及以上),Windows Server(2008及以上),Oracle Solaris;
- 网络:没有限制(建议10G甚至更快的网络带宽);
- 架构:x86,x64,SPARC,PowerPC。
支持Docker、DEB/RPM、Kubernetes、虚拟机等安装模式。
2.3 Ignite启动和停止
节点的类型有两种:服务端节点和客户端节点。服务端节点参与缓存、计算的执行、流数据处理等。客户端节点提供远程接入服务端的能力,有完整的Ignite API支持,包括近缓存、事务、计算、流处理、服务等。所有的节点默认都以服务端模式启动,客户端模式需要显式指定。
1.启动服务端节点
执行如下所示命令:
ignite.sh path/to/configuration.xml
2.启动客户端节点
执行如下Java代码片段:
IgniteConfiguration cfg = new IgniteConfiguration(); // 开启客户端模式 cfg.setClientMode(true); // 启动客户端 Ignite ignite = Ignition.start(cfg);
3.停止服务节点
强制停止某个节点时,可能会导致数据丢失或数据不一致,甚至会使节点无法重启。当节点没有响应且无法正常关闭时,应将强制停止作为最后的手段。正常停止可以使节点完成关键操作并正确完成其生命周期,执行正常停止的正确过程如下:
- 使用以下方法之一停止节点:
- 以编程方式调用Ignite.close();
- 以编程方式调用System.exit();
- 发送用户中断信号。Ignite使用JVM关闭钩子在JVM停止之前执行自定义逻辑。如果通过运行ignite.sh来启动节点并且不将其与终端分离,则可以通过按下Ctrl+C来停止节点。
- 从基线拓扑中删除该节点。如果启用了基线自动调整,则可以不执行此步骤。
从基准拓扑中删除节点将在其余节点上开始再平衡过程。如果计划在停止后立即重启该节点,则不必进行再平衡。在这种情况下,请勿从基准拓扑中删除该节点。
2.4 集群快照
Ignite 提供了使用Ignite Persistence为部署创建完整集群快照的能力 。Ignite 快照包括持久在磁盘上的所有数据记录的一致的集群范围副本以及恢复过程所需的一些其他文件。快照结构类似于 Ignite Persistence 存储目录的布局,但有几个例外。让我们以这个快照为例来回顾一下结构:
work └── snapshots └── backup23012020 └── db ├── binary_meta │ ├── node1 │ ├── node2 │ └── node3 ├── marshaller │ ├── node1 │ ├── node2 │ └── node3 ├── node1 │ └── my-sample-cache │ ├── cache_data.dat │ ├── part-3.bin │ ├── part-4.bin │ └── part-6.bin ├── node2 │ └── my-sample-cache │ ├── cache_data.dat │ ├── part-1.bin │ ├── part-5.bin │ └── part-7.bin └── node3 └── my-sample-cache ├── cache_data.dat ├── part-0.bin └── part-2.bin
- 快照位于该目录下,并work\snapshots命名为Ignite 的工作目录。backup23012020work
- 快照是为 3 节点集群创建的,所有节点都在同一台机器上运行。在此示例中,节点被命名为node1、node2和node3,而在实践中,名称等于节点的 一致 ID。
- my-sample-cache快照保留缓存的副本。
- 该文件夹将数据记录的db副本保存在文件中。只要当前还原过程不需要预写和检查点,就不会将其添加到快照中。part-N.bincache_data.dat
- binary_meta和目录存储元数据和特定于marshaller编组器的信息。
注意:通常快照分布在整个集群中 前面的示例显示了为在同一台物理机上运行的集群创建的快照。因此,整个快照位于一个位置。在实践中,所有节点都将运行在不同的机器上,快照数据分布在集群中。每个节点保存一段快照,其中包含属于该特定节点的数据。恢复过程解释了如何在恢复过程中将所有段连接在一起。
2.4.1 配置
1.快照目录
默认情况下,快照的一部分存储在各个 Ignite 节点的工作目录中,并使用 Ignite Persistence 保存数据、索引、WAL 和其他文件的相同存储介质。由于快照可以消耗与持久性文件已经占用的空间一样多的空间,并且可以通过与 Ignite Persistence 例程共享磁盘 I/O 来影响应用程序的性能,因此建议将快照和持久性文件存储在不同的媒体上。
2.快照执行池
默认情况下,快照线程池大小的值为4。减少快照创建过程中涉及的线程数会增加拍摄快照的总时间。但是,这会将磁盘负载保持在合理的范围内。
2.4.2 创建快照
Ignite 提供了几个用于创建快照的 API。
1.使用控制脚本
Ignite 提供了支持以下列出的与快照相关的命令的控制脚本:
# Create a cluster snapshot named "snapshot_09062021" in the background: control.(sh|bat) --snapshot create snapshot_09062021 # Create a cluster snapshot named "snapshot_09062021" and wait for the entire operation to complete: control.(sh|bat) --snapshot create snapshot_09062021 --sync # Create a cluster snapshot named "snapshot_09062021" in the "/tmp/ignite/snapshots" folder (the full path to the snapshot files will be /tmp/ignite/snapshots/snapshot_09062021): control.(sh|bat) --snapshot create snapshot_09062021 -dest /tmp/ignite/snapshots # Cancel a running snapshot named "snapshot_09062021": control.(sh|bat) --snapshot cancel snapshot_09062021 # Kill a running snapshot named "snapshot_09062021": control.(sh|bat) --kill SNAPSHOT snapshot_09062021
2.使用JMX
使用该SnapshotMXBean接口通过 JMX 执行特定于快照的过程:
方法 | 描述 |
createSnapshot(String snpName) | 创建快照 |
cancelSnapshot(String snpName) |
取消节点上的快照已启动其创建 |
3.使用Java API
此外,还可以在 Java 中以编程方式创建快照:
CacheConfiguration<Integer, String> ccfg = new CacheConfiguration<>("snapshot-cache"); try (IgniteCache<Integer, String> cache = ignite.getOrCreateCache(ccfg)) { cache.put(1, "Maxim"); // Start snapshot operation. ignite.snapshot().createSnapshot("snapshot_02092020").get(); } finally { ignite.destroyCache(ccfg.getName()); }
2.4.3 检查快照一致性
通常所有集群节点都运行在不同的机器上,并且快照数据分布在整个集群中。每个节点都存储自己的快照段,因此在某些情况下,可能需要在从快照恢复之前检查快照的数据完整性和整个集群的数据一致性。
对于这种情况,Apache Ignite 提供了内置的快照一致性检查命令,使您能够验证内部数据一致性,计算数据分区哈希和页面校验和,并在发现问题时打印结果。check 命令还将主分区的哈希值与相应的备份分区进行比较,并报告任何差异。
2.4.4 从快照恢复
快照可以在停止的集群上手动恢复,也可以在活动的集群上自动恢复。下面描述了这两个过程,但是,最好只使用控制脚本中的恢复命令。
1.手动快照恢复过程
快照结构类似于 Ignite Native Persistence 的布局,因此对于手动快照还原,您必须仅在具有相同节点的相同集群consistentId和拍摄快照的相同拓扑上执行快照还原。如果您需要在不同的集群或不同的集群拓扑上恢复快照,请使用 自动快照恢复过程。
一般来说,停止集群,然后用快照中的数据替换持久化数据和其他文件,然后重新启动节点。
详细过程如下所示:
- 停止要恢复的集群
- 从检查点$IGNITE_HOME/work/cp目录中删除所有文件
- 在每个节点上执行以下操作:
- {nodeId}从目录中删除与 相关的文件$IGNITE_HOME/work/db/binary_meta。
- {nodeId}从目录中删除与 相关的文件$IGNITE_HOME/work/db/marshaller。
- {nodeId}删除与您的目录下相关的文件和子目录$IGNITE_HOME/work/db。db/{node_id}如果目录不在 Ignite 目录下,请单独清理该目录work。
- 将属于具有{node_id}快照的节点的文件复制到$IGNITE_HOME/work/目录中。如果该db/{node_id}目录不在 Ignitework目录下,那么您需要将数据文件复制到那里。
- 重启集群
2.自动快照恢复过程
自动恢复过程允许用户使用 Java API 或命令行脚本从活动集群上的快照恢复缓存组。
目前,此过程有几个限制,将在未来