在Swarm集群上运行Ignite

时间:2018-01-15 10:36:55

标签: docker docker-swarm ignite

我试图在群集群上运行apacheignite / ignite图像。 当我扩展点火服务时,节点不会发现彼此。

这是我的stack.yml:

version: "3.3"
services:
  ignite:
    image: apacheignite/ignite
    dns: 172.26.80.129
    environment:
      - "CONFIG_URI=http://myserver.mycompany.com/ignite/config.xml"
    networks:
      - ignite-net
networks:
  ignite-net:
    driver: overlay

这是我的config.xml:

<?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">
    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="publicThreadPoolSize" value="1"/>
    <property name="discoverySpi">
        <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
            <property name="localPort" value="15900"/>
            <property name="localPortRange" value="79"/>
            <property name="ipFinder">
            <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                <property name="addresses">
                    <list>
                        <value>ignite:15900..15979</value>
                    </list>
                </property>
            </bean>
            </property>
        </bean>
    </property>
    <property name="peerClassLoadingEnabled" value="true"/>
    </bean>
</beans>

我做错了什么?

3 个答案:

答案 0 :(得分:1)

您应该使用多播发现,以便他们在不列出地址的情况下找到彼此。 org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder

或者,您应列出所有(或至少几个)地址:

            <property name="addresses">
                <list>
                    <value>node1.ignite:15900..15979</value>
                    <value>node2.ignite:15900..15979</value>
                    ...
                </list>
            </property>

请注意,所有节点都应该可以解析这些主机名。使用IP地址通常更容易。

然后再次,文档中有huge number of ways to do discovery

最后一个是,使用VM发现,Ignite具有一种模式,其中主机通过环境变量传递。要使用它,您应该完全删除addresses属性。并使用其他节点(或至少一个公共地址)的地址填充IGNITE_TCP_DISCOVERY_ADDRESSES env var。逗号分开。

答案 1 :(得分:0)

这是一个有效的解决方案。 我添加了一个使用Ignite集群的客户端服务,使其成为一个更现实的例子。

我不明白我的帖子中的问题是什么,但这是有效的。当缩放点火服务时,客户端会看到所有Ignite节点(包括ignite-master)。

警告:不得用于生产。 ignite-master容器是单点故障。向上或向下扩展此服务会导致整个群集失败。

stack.yml:

version: "3"
services:
  tomcat-client:
    image: me/myimage.ws
    depends_on:
      - ignite-master
    ports:
      - "15280:8080" 
    networks:
      - ignite-test-net
    environment:
      - CONFIG_URI=http://myserver.mycompany.com/ignite/config.xml
  ignite:
    image: apacheignite/ignite
    depends_on:
      - ignite-master
    environment:
      - "CONFIG_URI=http://myserver.mycompany.com/ignite/config.xml"
    networks:
      - ignite-test-net
  ignite-master:
    image: apacheignite/ignite
    environment:
      - "CONFIG_URI=http://myserver.mycompany.com/ignite/config.xml"
    networks:
      - ignite-test-net
networks:
  ignite-test-net:
    driver: overlay

和config.xml

<?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">
    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="publicThreadPoolSize" value="1"/>
    <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-master</value>
                    </list>
                </property>
            </bean>
            </property>
        </bean>
    </property>
    <property name="peerClassLoadingEnabled" value="true"/>
    </bean>
</beans>

答案 2 :(得分:0)

不幸的是,多播发现在Docker群集群中不起作用,但是对于少数点燃节点,您可以使用以下堆栈文件片段:

ignite:
 image: apacheignite/ignite
 hostname: node-{{ .Task.Slot }}
 deploy:
   replicas: 8

使用Task.Slot的模板占位符手动设置主机名。 这样的结果是,在您的堆栈中创建了8个服务任务,它们在群集中可以通过其主机名node-1node-2,...,node-8进行访问。 您可以将所有或某些这些主机名用于Iginite配置文件。

此解决方案不能替代生产级节点发现(可以通过Zookeeper,Consul等来实现),但是可以在基于Docker的小型Ignite环境中提供一定的灵活性。

相关问题