Wildfly 9 - TCP上的mod_cluster

时间:2015-05-21 13:58:20

标签: wildfly mod-cluster

我们目前正在测试从Wildfly 8.2.0迁移到Wildfly 9.0.0.CR1(或从快照构建的CR2)。该系统是一个使用mod_cluster的集群,并且正在VPS上运行,实际上阻止它使用多播。

在8.2.0上,我们一直在使用以下运行良好的modcluster配置:

      <mod-cluster-config proxy-list="1.2.3.4:10001,1.2.3.5:10001" advertise="false" connector="ajp">
          <dynamic-load-provider>
              <load-metric type="cpu"/>
          </dynamic-load-provider>
      </mod-cluster-config>

不幸的是,在9.0.0上,不推荐使用proxy-list,服务器的启动将以错误结束。可怕的文档缺乏,但经过几次尝试后,我发现代理列表被替换为代理,这些代理是出站套接字绑定列表。因此,配置如下所示:

      <mod-cluster-config proxies="mc-prox1 mc-prox2" advertise="false" connector="ajp">
          <dynamic-load-provider>
              <load-metric type="cpu"/>
          </dynamic-load-provider>
      </mod-cluster-config>

以下内容应添加到相应的socket-binding-group中(在我的情况下为full-ha):

    <outbound-socket-binding name="mc-prox1">
        <remote-destination host="1.2.3.4" port="10001"/>
    </outbound-socket-binding>
    <outbound-socket-binding name="mc-prox2">
        <remote-destination host="1.2.3.5" port="10001"/>
    </outbound-socket-binding>

到目前为止一切顺利。在此之后,httpd集群开始注册节点。但是我从负载均衡器得到错误。当我查看/ mod_cluster-manager时,我看到了几行 Node REMOVED 行,并且还有很多错误,例如:

ERROR [org.jboss.modcluster] (UndertowEventHandlerAdapter - 1) MODCLUSTER000042: Error MEM sending STATUS command to node1/1.2.3.4:10001, configuration will be reset: MEM: Can't read node

在mod_cluster的日志中有等效的警告:

manager_handler STATUS error: MEM: Can't read node

据我所知,问题是虽然wildfly / modcluster能够连接到httpd / mod_cluster,但它不能以其他方式工作。不幸的是,即使经过广泛的努力,我也被困住了。

有人可以帮助为没有广告的Wildfly 9.0.0设置mod_cluster吗?非常感谢。

3 个答案:

答案 0 :(得分:2)

不需要对静态代理配置进行任何不必要的努力或不安。每个WildFly发行版都附带了描述xml子系统配置的xsd表。例如,使用WildFly 9x,它是:

WILDFLY_DIRECTORY/docs/schema/jboss-as-mod-cluster_2_0.xsd

它说:

<xs:attribute name="proxies" use="optional">
  <xs:annotation>
    <xs:documentation>List of proxies for mod_cluster to register with defined by outbound-socket-binding in socket-binding-group.</xs:documentation>
  </xs:annotation>
  <xs:simpleType>
    <xs:list itemType="xs:string"/>
  </xs:simpleType>
</xs:attribute>

以下设置开箱即用

  1. 下载wildfly-9.0.0.CR1.zip或使用./build.sh from sources
  2. 进行构建
  3. 假设您有两个框,Apache HTTP Server,其中mod_cluster充当负载平衡代理,而WildFly服务器充当工作者。 确保botch服务器可以在启用MCMP的VirtualHost的地址和端口(Apache HTTP Server端)以及WildFly AJP和HTTP连接器端上相互访问。常见的错误是将Wildfy binf归属于localhost;然后它将其addess作为localhost报告给驻留在不同方框中的Apache HTTP Server,这使得它无法联系WildFly服务器。沟通是双向的。
  4. 这是我默认wildfly-9.0.0.CR1.zip的配置差异。
  5. 328c328
    < <mod-cluster-config advertise-socket="modcluster" connector="ajp" advertise="false" proxies="my-proxy-one">
    ---
    > <mod-cluster-config advertise-socket="modcluster" connector="ajp">
    384c384
    < <subsystem xmlns="urn:jboss:domain:undertow:2.0" instance-id="worker-1">
    ---
    > <subsystem xmlns="urn:jboss:domain:undertow:2.0">
    435c435
    < <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:102}">
    ---
    > <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    452,454d451
    < <outbound-socket-binding name="my-proxy-one">
    < <remote-destination host="10.10.2.4" port="6666"/>
    < </outbound-socket-binding>
    456c453
    < </server>
    ---
    > </server>

    更改说明

    • proxies="my-proxy-one",出站套接字绑定名称;可能在这里更多。
    • instance-id="worker-1",工人的名字,a.k.a。JVMRoute
    • 偏移 - 您可以忽略,它仅适用于我的测试设置。偏移量不适用于出站套接字绑定。
    • <outbound-socket-binding name="my-proxy-one"> - 包含VirtualHost指令的Apache HTTP Server中EnableMCPMReceive的IP和端口。

    结论

    通常,这些MEM读取/节点错误消息与网络问题有关,例如, WildFly可以联系Apache,但Apache无法联系WildFly。最后但并非最不重要的是,可能发生Apache HTTP Server的配置使用PersistSlots指令并且发生了一些实质性的环境改变,例如,从mpm_prefork切换到mpm_worker。在这种情况下,MEM读取错误消息不会发送到WildFly,而是发送到需要删除的HTTPD / cache / mod_custer中的缓存slotmem文件。 在我的情况下,我确定它是网络。

答案 1 :(得分:2)

几周后,我回到了问题并找到了解决方案。问题当然是 - 在配置上与Wildfly的特定版本没有任何共同之处。具体模式:

域中有三个节点,每个节点有三个服务器。使用以下属性启动所有节点:

-Djboss.node.name=nodeX

...其中nodeX是特定节点的名称。但是,这意味着节点中的所有三个服务器都具有相同的名称,这正是负载均衡器的混乱。 一旦我删除了这个属性,一切都开始工作了。

答案 2 :(得分:2)

我遇到了Node Removed问题。 我设法使用以下作为instance-id

来解决它
<subsystem xmlns="urn:jboss:domain:undertow:2.0" instance-id="${jboss.server.name}">

我希望这会帮助其他人;)