用Java客户端访问In-Memory Data Grid Apache Ignite
首先
为了学习内存数据网格,我尝试了一下Apache Ignite。
首先,我安装并在1个或2个服务器上启动它,然后尝试从Java程序中将其作为缓存服务器使用。
我也创建了一个关于Apache Ignite文件的链接集合,希望您能够参考。
- Apache Igniteに関するドキュメントへのリンク集
Apache Ignite 是什么?
Apache Ignite是一种实现内存数据网格的中间件。
内存数据网格是一种在多个服务器的内存中分散存储大量数据的技术。通过在内存中处理数据可以实现加速,这是其一大特点。
它的使用场景之一是作为分布式缓存来存储大量数据的数据库。
Apache Ignite可以以内存数据网格为核心,承担以下角色。
- インメモリデータベース/分散データベース
将In-Memory数据网格作为数据库处理。读写操作是分布式的,易于扩展,并且比Oracle等关系型数据库更快。目前的版本无法处理事务,但未来的版本可能会支持。
此外,数据被保存在内存中,但也可以持久化到文件系统(HDFS)。数据以与HDFS相似的结构保存在内存中,并且作为HDFS上文件的子集存在。
* 键值存储 (KVS)
准备了一个简单的API用于KVS,可用作分布式KVS。
- データベースキャッシング
可以将Oracle、Cassandra等数据库/NoSQL用作缓存。
- etc
请参考Apache Ignite的用例以获得更详细的信息。
另外,我在下方创建了各种信息链接的集合,供您参考。
有关Apache Ignite的文档链接汇总
执行环境
我使用Vagrant准备了CentOS 7的环境,并成功运行了Apache Ignite。由于有其他易于理解的网站详细介绍了CentOS 7的构建步骤,因此我将省略这部分。
我将尝试使用单机配置和集群配置(两台)进行测试。服务器包括以下两台。
192.168.20.71 点火服务器1
192.168.20.72 点火服务器2
安装OpenJDK
在Apache Ignite中,需要JDK,並且支援Oracle JDK和Open JDK兩種。本次使用Open JDK。
# yum -y install java-1.8.0-openjdk-devel
# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
我正在設置JAVA_HOME,並將Java的路徑添加到PATH。
# echo "export JAVA_HOME=$(readlink -e $(which java)|sed 's:/bin/java::')" > /etc/profile.d/java.sh
# echo "PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile.d/java.sh
# source /etc/profile
安装Apache Ignite。
从Apache Ignite的官网下载所需模块。选择下方的“二进制发布”选项。

我下载了最新版本的v2.6.0,以下是该版本。

请将刚刚下载的”apache-ignite-fabric-2.6.0-bin.zip”上传到服务器,并使用以下命令将其解压到”/opt”目录下。
# cd /opt
# unzip /tmp/apache-ignite-fabric-2.6.0-bin.zip
# ln -s /opt/apache-ignite-fabric-2.6.0-bin/ /opt/apache-ignite
为了启动Apache Ignite,执行以下命令。
cd /opt/apache-ignite/bin
./ignite.sh
如果没有参数,将加载默认配置文件”/opt/apache-ignite/config/default-config.xml”并启动。
当成功启动时,会将以下信息输出到控制台。输出中显示”服务器数量=1″,确认已成功启动一台服务器。
[22:42:07] Ignite node started OK (id=9ae050e2)
[22:42:07] Topology snapshot [ver=1, servers=1, clients=0, CPUs=1, offheap=0.74GB, heap=1.0GB]
默认的配置文件如下所示。
您需要在”元素以下添加所需的配置,但默认情况下配置为空。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
Alter configuration below as needed.
-->
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"/>
</beans>
使用Java访问Apache Ignite缓存(单节点配置)。
我們會嘗試使用從剛剛啟動的Apache Ignite作為Java應用程式的快取伺服器。我們將使用Maven專案的Java應用程式,並在pom.xml中添加以下依賴關係。
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>2.6.0</version>
</dependency>
Java客户端根据Apache Ignite的示例程序创建了以下程序。
该程序将数据存入名为”put-get-example”的缓存中,然后获取并显示相同的数据。
import org.apache.ignite.Ignition;
import org.apache.ignite.client.ClientCache;
import org.apache.ignite.client.ClientException;
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.ClientConfiguration;
public class SimpleCacheApp
{
public static void main(String[] args) {
// 接続先のApache IgniteサーバのIPとポートを指定する。
ClientConfiguration cfg = new ClientConfiguration().setAddresses("192.168.20.71:10800");
try (IgniteClient igniteClient = Ignition.startClient(cfg)) {
final String CACHE_NAME = "put-get-example";
ClientCache<Integer, String> cache = igniteClient.getOrCreateCache(CACHE_NAME);
Integer key = 1;
String val = "put-get-test";
cache.put(key, val);
System.out.format("PUT [%s]\n", val);
String cachedVal = cache.get(key);
System.out.format("GET [%s]\n", cachedVal);
}
catch (ClientException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
实际结果如下:
我们可以确认已经成功地在缓存中put了名为“put-get-test”的数据,并能够使用get功能获取到其对应的值。
PUT [put-get-test]
GET [put-get-test]
为了确认在服务器端是否已经缓存了数据,我们可以尝试使用Ignite的命令行界面工具” Ignite Visor”。
まず、Visorを起動する。
# /opt/apache-ignite/bin/ignitevisorcmd.sh
Visorのコンソールが表示されるので、「open」コマンドでクラスタに接続する。
visor> open
Local configuration files:
+==========================================================================================+
| # | Configuration File |
+==========================================================================================+
| 0 | config/default-config.xml |
~~省略~~
設定ファイル一覧が表示されるので、現在使用しているデフォルトの「0 : config/default-config.xml」を選択します。
Choose configuration file number ('c' to cancel) [0]: 0
ここで「cache」コマンドを実行すると、キャッシュの状況が表示されます。
visor> cache
Time of the snapshot: 2018-08-18 03:18:21
+========================================================================================================================+
| Name(@) | Mode | Nodes | Entries (Heap / Off-heap) | Hits | Misses | Reads | Writes |
+========================================================================================================================+
| put-get-example(@c0) | PARTITIONED | 1 | min: 1 (0 / 1) | min: 0 | min: 0 | min: 0 | min: 0 |
| | | | avg: 1.00 (0.00 / 1.00) | avg: 0.00 | avg: 0.00 | avg: 0.00 | avg: 0.00 |
| | | | max: 1 (0 / 1) | max: 0 | max: 0 | max: 0 | max: 0 |
+------------------------------------------------------------------------------------------------------------------------+
可以看出,在「put-get-example」的缓存中存储了一个缓存项(参考Entries)。
将Apache Ignite配置为集群(2个节点)。
之前只有一个服务器配置,现在将尝试使用两台服务器进行配置。
将创建一个用于两台服务器配置的设置文件(default-config-cluster2server.xml)。
# cp -p /opt/apache-ignite/config/default-config.xml /opt/apache-ignite/config/default-config-cluster2server.xml
在TCP/IP发现模式下进行集群配置。
修改”default-config-cluster2server.xml”文件,并添加””。
虽然使用多播设置更简单,但此次将使用指定IP(192.168.10.71, 192.168.10.72)进行配置。
※补充:如果不进行任何设置,默认将使用多播方式运行。如果环境支持多播,就不需要进行任何配置。
在两台服务器上创建相同的文件(或者使用scp进行复制)。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
Alter configuration below as needed.
-->
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="discoverySpi">
<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
<property name="ipFinder">
<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
<property name="addresses">
<list>
<value>igniteserver1:47500..47509</value>
<value>igniteserver2:47500..47509</value>
</list>
</property>
</bean>
</property>
</bean>
</property>
</bean>
</beans>
这次将从Visor启动两个Apache Ignite节点。
为了通过Visor操作远程节点,需要能够通过ssh进行连接。
请使用以下命令进行设置。
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
パスフレーズなしで設定できることを確認します。
$ ssh igniteserver1
$ ssh igniteserver2
打开 Visor 控制台,并执行以下命令。
# /opt/apache-ignite/bin/ignitevisorcmd.sh
Visorのコンソールが表示されるので、「open」コマンドでクラスタに接続する。
visor> open
~省略~
| 6 | config/default-config-cluster2server.xml
~省略~
Choose configuration file number ('c' to cancel) [0]: 6
+------------------------------------------------------------------------------------+
| Status | Connected |
| Ignite instance name | <default> |
| Config path | /opt/apache-ignite/config/default-config-cluster2server.xml |
| Uptime | 00:00:00 |
+------------------------------------------------------------------------------------+
visor> start -h=192.168.20.71~72 -u=root -k=/root/.ssh/id_rsa -g=/opt/apache-ignite -c=config/default-config-cluster2server.xml
+-------------------------------+
| Successful start attempts | 2 |
| Failed start attempts | 0 |
+-------------------------------+
可以看到「成功的启动尝试」的数量为2,表明已经成功启动了两台服务器。
如果要结束所有节点,请执行以下命令。
visor> kill -k
Are you sure you want to kill ALL nodes? (y/n) [n]: y
You are about to kill ALL nodes. Are you 100% sure? (y/n) [n]: y
从Java程序连接到Ignite集群
在Ignite集群的节点中,有保存缓存的服务器节点和不存储数据的客户端节点。
通过Java程序连接到Ignite集群时,可以将其指定为客户端节点。
重点是使用”Ignition.setClientMode(true);”明确将其设置为客户端。
从服务器上获取”default-config.xml”文件,然后按照以下方式进行编码。程序可以读取”default-config.xml”文件中的配置信息,也可以在代码中进行配置,不使用配置文件。
在设计只连接一台的时候,我编写的程序也可以连接多台。但是当有一台宕机时,由于原因不明导致故障转移失败,所以我重新进行了改写。
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.client.ClientException;
public class SimpleCacheApp2Server
{
public static void main(String[] args) {
Ignition.setClientMode(true);
try (Ignite igniteClient = Ignition.start("default-config-cluster2server.xml")) {
final String CACHE_NAME = "put-get-example";
IgniteCache<Integer, String> cache = igniteClient.getOrCreateCache(CACHE_NAME);
Integer key = 1;
String val = "put-get-test";
cache.put(key, val);
System.out.format("PUT [%s]\n", val);
String cachedVal = cache.get(key);
System.out.format("GET [%s]\n", cachedVal);
}
catch (ClientException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
请参考
-
- Getting Started – Ignite公式サイト
- Apache IgniteをUbuntu Linux 16.04 LTSにインストールする