【问题标题】:Questions about setting up Apache Ignite in Docker-Compose关于在 Docker-Compose 中设置 Apache Ignite 的问题
【发布时间】:2019-01-16 22:42:46
【问题描述】:

进一步了解我的更新场景...

我正在尝试在我们的 Docker-compose 环境中设置 Apache Ignite,并且对 Ignite 以及如何配置它有一些疑问。

  1. 如果我在项目中有 Maven 依赖项,那么下载和运行 Apache Ignite 二进制文件的目的是什么?我是否需要在每个模块中也运行 Ignite,还是仅仅拥有足够的依赖项?

  2. Ignite 节点的每个实例是否都需要关联配置,它们之间有何不同?

  3. 我有一个 Docker-Compose 文件,其中包含两个服务,一个拉入 Ignite 容器,一个 Java shell 允许我运行/测试我的模块。在我的 shell 中,当我运行 compose 服务时,我的测试似乎发现了 ignite 服务。当我从 IntelliJ 运行测试时,它没有发现其他 Ignite 服务器。

我的撰写服务:

  #Ignite
  ignite:
    image: apacheignite/ignite
    environment:
      - IGNITE_QUITE=false
    #volumes:
    #  - ./project/src/test/resources/ignite.xml:/opt/ignite/apache-ignite-fabric/config/default-config.xml
    ports:
      - 11211:11211
      - 47100:47100
      - 47500:47500
      - 49112:49112

  # Java Shell
  java:
    image: local/java
    build:
      context: .
    command: /bin/bash
    volumes:
      - .:/project
    depends_on:
      - ignite
    ports:
      - 8000:8000
      - 8080:8080
      - 1099:1099

我在测试中使用的 Ignite 配置:

 <bean id="ignite.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>
                                <!--
                                Explicitly specifying address of a local node to let it start and
                                operate normally even if there is no more nodes in the cluster.
                                You can also optionally specify an individual port or port range.
                                -->
                                <value>127.0.0.1</value>

                                <!--
                                IP Address and optional port range of a remote node.
                                You can also optionally specify an individual port.
                                -->
                                <value>127.0.0.1:47500..47509</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

我的测试:

@Test
    //@Ignore
    public void should_run_cluster()
    {
        try (Ignite ignite = Ignition.start("ignite2.xml"))
        {
            IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCacheName");

            // Store keys in cache (values will end up on different cache nodes).
            for (int i = 0; i < 10; i++)
            {
                cache.put(i, Integer.toString(i));
            }

            for (int i = 0; i < 10; i++)
            {
                System.out.println("Got [key=" + i + ", val=" + cache.get(i) + ']');
            }
        }
    }

根据我所做的,当从 IntelliJ 运行它时,我似乎能够与 Ignite 节点对话,但它拒绝节点加入集群。

我尝试过从 Java 服务公开端口(不同的端口号,不只公开内部等),但没有成功。

如果我尝试将我的配置附加到 Ignite 服务,它完全不起作用。

我的最终目标是使用 Docker-Compose 设置环境,我可以在本地加入以进行测试,但最终将其移至 ECS/Fargate。

我确信我的配置搞混了,如果有任何帮助,我们将不胜感激......

----- 更新-----

所以,我已经能够使用 localhost/127.0.0.1 从 IntelliJ 连接到 Ignite,并在容器网络中使用 compose 服务名称“ignite”。

这是正确的方法吗?我看不到如何在不使用令牌替换 (${port}) 的情况下为每个节点使用相同的配置,因为我似乎需要为 DiscoverySpi 和 CommunicationSpi 设置一个唯一的端口值。

此外,当从我的客户端(在本例中为 JUnit)连接时,建立初始连接需要很长时间。

那么,我现在的问题是,这是否是配置 Ignite 的正确方法?

“点燃”服务(在 Compose 中):

  ignite:
    image: apacheignite/ignite
    environment:
      - IGNITE_QUIET=false
    volumes:
      - ./project/src/test/resources/ignite-main.xml:/opt/ignite/apache-ignite-fabric/config/default-config.xml
    ports:
      - 11211:11211
      - 47100:47100
      - 47500:47500
      - 49112:49112

“Ignite”服务配置(ignite-main.xml):

<property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="47500"/>
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>localhost</value>
                                <value>localhost:47500</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="localPort" value="47100"/>
            </bean>
        </property>

客户端 Ignite 配置 (ignite.xml):

<property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="localPort" value="47501"/>
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <value>localhost</value>
                                <value>localhost:47500</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
        <property name="communicationSpi">
            <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi">
                <property name="localPort" value="47101"/>
            </bean>
        </property>

客户端点燃测试用例:

私有静态Ignite 点燃;

@BeforeClass
public static void beforeAll()
{
    ignite = Ignition.start("ignite.xml");
}

@AfterClass
public static void afterAll()
{
    ignite.close();
}

@Test
public void should_prep_cluster()
{
    IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCacheName");

    // Store keys in cache (values will end up on different cache nodes).
    for (int i = 0; i < 10; i++)
    {
        cache.put(i, Integer.toString(i));
    }

    for (int i = 0; i < 10; i++)
    {
        System.out.println("Got [key=" + i + ", val=" + cache.get(i) + ']');
    }
}

【问题讨论】:

    标签: docker-compose ignite


    【解决方案1】:
    1. 这样您就可以使用任何模块集运行独立的 Ignite 节点,例如使用sqlline 对它运行 SQL,或者(在使用对等类加载时)使用连接的 Ignite 客户端执行几乎任何操作。但话又说回来,您可以直接从 Maven 项目运行 Ignite 节点(客户端或服务器),在这种情况下,您根本不需要二进制分发。

    2. 是的。除了不需要的节点属性或consistentId 之外,它们可能是相同的。

    3. 很难说。可以提供日志吗?我觉得懂容器的人可以不用日志检查,但我不能。

    【讨论】:

    • 感谢您的快速回复。所以#1是一个很好但不是必需的。只要在每个模块中都有 JAR,就应该连接并形成集群。什么是“一致 ID”?我在哪里都没见过?
    • 感谢您的参考。我读了一遍,看不出这对我的问题有什么帮助。是否有任何参考显示 Ignite 在 Docker 容器中运行(在 compose 中)并且有人从外部加入集群的完整示例?我几乎可以肯定这与我的 ignite 配置或暴露的端口有关。奇怪的是,在测试附加到集群的 compose 容器中运行所有内容。只有当 IntelliJ 在外部运行我的测试时,我才似乎看不到集群。
    • apacheignite.readme.io/docs/docker-deployment 但我敢肯定,如果您的内部 Docker 容器不知道其外部地址,您将会遇到问题。很遗憾,由于我不是 DevOps,因此无法进一步帮助您。
    【解决方案2】:

    作为@alamar 回答的补充:

    由于 Docker Compose 服务在单独的容器中启动,您不能使用 localhost127.0.0.1 来发现服务器节点。您可以链接 ignite 服务以便能够使用 DNS 名称ignite

    编写服务:

    # Ignite
    ignite:
      image: apacheignite/ignite
      environment:
        - IGNITE_QUIET=false
      # volumes:
      #   - ./project/src/test/resources/ignite.xml:/opt/ignite/apache-ignite-fabric/config/default-config.xml
      # It is not necessary to expose ports outside if they are only used inside docker-compose
      # ports:
      #   - 11211:11211
      #   - 47100:47100
      #   - 47500:47500
      #   - 49112:49112
    # Java Shell
    java:
      image: local/java
      build:
        context: .
      command: /bin/bash
      volumes:
        - .:/project
      links:
        - ignite
      ports:
        - 8000:8000
        - 8080:8080
        - 1099:1099
    

    客户端点火配置(ignite.xml):

    <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>ignite:47500</value>
                        </list>
                    </property>
                </bean>
            </property>
        </bean>
    </property>
    

    【讨论】:

    • 是的,当在容器中运行时,我确实使用了服务名称并且它有效,但由于我需要从我的 IDE 连接到容器,只是 Ignite 容器,因此我还需要公开端口那个。我正在寻找的是上述似乎有效的配置是否是设置 Ignite 的正确方法。 (我最初是在上面而不是在这里评论的)。
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2022-12-04
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多