Apache ignite 计算广播

问题描述 投票:0回答:1

我正在尝试 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));
        }
    }
}
ignite distributed-computing apacheignite
1个回答
0
投票

正如您所知,在一台物理(或虚拟)服务器上运行 2 个 Ignite 节点通常是一个糟糕的选择!为什么?正常部署是在一台物理服务器上有 1 个实例,在另一台物理服务器上有第二个实例。创建指定 1 个备份的缓存。在此部署场景中,如果一台主机(物理服务器)出现故障,那么您仍将拥有一个可运行的集群,其中的所有数据都位于剩余的一台服务器上。同样在该部署场景中端口可以全部为普通端口。希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.