我正在尝试 apache ignite,并且必须说 ignite 文档不完整。无论如何,我已经使用 docker images 2.14.0-arm14 设置了两个节点集群,并公开了两个 ignite 容器的所有端口,但是计算广播仅适用于具有默认端口的节点(与 ignite 默认值相同),但不适用于另一个容器。 Ignite 客户端能够发现 2 个节点,但计算仅在默认端口按原样公开的容器上触发。任何有关进一步解决此问题的指示,这只是一个 hello world 计算任务。 需要注意的事项。 Docker 设置良好。两个容器之间的网络桥接良好。服务器上的日志确实显示 2 个服务器,0 个客户端。 任何跨 2 个节点 docker 容器工作的 hello world 计算示例都将受到赞赏。
docker run --name ignite-node1 \
-p 47500:47500 -p 47100:47100 \
-d apacheignite/ignite:2.14.0-arm64
通过上述端口映射,我可以调用计算 API 并提交作业。然而,为了创建集群,当我启动具有不同端口映射的第二个容器时,计算将在具有默认端口的节点上执行(47500,但不在具有 47501 的容器上执行)。我看到日志消息表明两台服务器都被嵌入客户端发现,但随后收到错误消息“无法将消息发送到节点 id(ignite-node2 节点上的节点)。
docker run --name ignite-node2 \
-p **47501**:47500 -p **47101**:47100 \
-d apacheignite/ignite:2.14.0-arm64
下面是从 ignite 文档运行的示例。
public class HelloWorld {
public static void main(String[] args) throws IgniteException {
// Preparing IgniteConfiguration using Java APIs
IgniteConfiguration cfg = new IgniteConfiguration();
// The node will be started as a client node.
cfg.setClientMode(true);
// Setting up an IP Finder to ensure the client can locate the servers.
TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
ipFinder.setAddresses(Collections.singletonList("127.0.0.1:47500..47509"));
cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(ipFinder));
// Starting the node
Ignite ignite = Ignition.start(cfg);
// Create an IgniteCache and put some values in it.
IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCache");
cache.put(1, "Hello");
cache.put(2, "World!");
System.out.println(">> Created the cache and add the values.");
// Executing custom Java compute task on server nodes.
ignite.compute(ignite.cluster().forServers()).broadcast(new RemoteTask());
System.out.println(">> Compute task is executed, check for output on the server nodes.");
// Disconnect from the cluster.
ignite.close();
}
/**
* A compute tasks that prints out a node ID and some details about its OS and JRE.
* Plus, the code shows how to access data stored in a cache from the compute task.
*/
private static class RemoteTask implements IgniteRunnable {
@IgniteInstanceResource
Ignite ignite;
@Override public void run() {
System.out.println(">> Executing the compute task");
System.out.println(
" Node ID: " + ignite.cluster().localNode().id() + "\n" +
" OS: " + System.getProperty("os.name") +
" JRE: " + System.getProperty("java.runtime.name"));
IgniteCache<Integer, String> cache = ignite.cache("myCache");
System.out.println(">> " + cache.get(1) + " " + cache.get(2));
}
}
}
正如您所知,在一台物理(或虚拟)服务器上运行 2 个 Ignite 节点通常是一个糟糕的选择!为什么?正常部署是在一台物理服务器上有 1 个实例,在另一台物理服务器上有第二个实例。创建指定 1 个备份的缓存。在此部署场景中,如果一台主机(物理服务器)出现故障,那么您仍将拥有一个可运行的集群,其中的所有数据都位于剩余的一台服务器上。同样在该部署场景中端口可以全部为普通端口。希望有帮助!