Wildfly 9 - mod_cluster 在 TCP 上

Wildfly 9 - mod_cluster on TCP

我们目前正在测试从 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 上代理列表已被弃用,服务器的启动将以错误结束。严重缺乏文档,但是经过几次尝试后,我发现代理列表已替换为出站套接字绑定列表的代理。因此,配置如下所示:

      <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>

并且应将以下内容添加到适当的套接字绑定组(在我的例子中是 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,但它不能以其他方式工作。不幸的是,即使经过大量努力,我还是卡住了。

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

静态代理配置无需任何不必要的努力或不安。每个 WildFly 发行版都带有 xsd 描述 xml 子系统配置的表格。例如,对于 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 or build with ./build.sh from sources
  2. 假设您有 2 个盒子,Apache HTTP Server mod_cluster 充当负载平衡代理,您的 WildFly 服务器充当工作人员。 确保 botch 服务器可以在启用 MCMP 的 VirtualHost 的地址和端口(Apache HTTP 服务器端)以及 WildFly AJP 和 HTTP 连接器端相互访问。常见的错误是将 WildFLy binf 到本地主机;然后它将其地址作为本地主机报告给驻留在不同盒子上的 Apache HTTP 服务器,这使得它无法联系 WildFly 服务器返回。通信是双向的。
  3. 这是我的配置与默认配置的差异 wildfly-9.0.0.CR1.zip

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.
  • offset -- 你可以忽略,它只是为了我的测试设置。偏移不适用于出站套接字绑定。
  • <outbound-socket-binding name="my-proxy-one"> - Apache HTTP 服务器中 VirtualHost 的 IP 和端口包含 EnableMCPMReceive 指令。

结论

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

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

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

-Djboss.node.name=nodeX

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

我运行进入Node Removed issue to。 我设法通过使用以下作为 instance-id

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

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