我已经成功创建了一个具有 3 个主机的 WildFly 集群,该集群处于域模式。现在,我尝试获取 mod_cluster 子系统,中间不需要 apache 或其他服务器,据我所知这是可行的,但我没有找到任何最新文档来实现这一点。
我尝试了几种方法和配置,但都不起作用。应用程序和持久性单元在主服务器上部署和配置,并由主服务器复制到从服务器,并且上下文在所有服务器上均可访问。
但是,如果我尝试获取端口 80(负载均衡器)上的上下文,我得到的只是 404。此外,它不会显示无上下文请求的“欢迎使用 WildFly”启动页面,因此负载均衡器组不会“连接”到主服务器组及其部署的应用程序。
任何帮助都将不胜感激。这是我的拓扑: 图像
答案1
您不需要使用 Apache httpd 进行负载平衡,但您仍然需要使用负载平衡器。您可以启动专用的 Wildfly 服务器,它将作为您域内的负载平衡器。load-balancer
默认域配置文件 ( domain.xml
) 中有一个名为的现成配置文件。
在 HTTP 默认端口 (80) 上添加 WildFly 负载均衡器的步骤:
1)编辑-在元素domain.xml
中填写预期的端口号:socket-binding-group
load-balancer-sockets
<socket-binding-group name="load-balancer-sockets" default-interface="public">
<socket-binding name="http" port="80"/>
<socket-binding name="https" port="443"/>
<socket-binding name="mcmp-management" interface="private" port="${jboss.mcmp.port:8090}"/>
<socket-binding name="modcluster" interface="private" multicast-address="${jboss.modcluster.multicast.address:224.0.1.105}" multicast-port="23364"/>
</socket-binding-group>
2) 编辑-为您的负载均衡器domain.xml
添加新内容。为其使用配置文件和套接字绑定组。示例:server-group
load-balancer
load-balancer-sockets
<server-groups>
<server-group name="main-server-group" profile="ha">
<socket-binding-group ref="ha-sockets"/>
</server-group>
<server-group name="load-balancer-group" profile="load-balancer">
<socket-binding-group ref="load-balancer-sockets"/>
</server-group>
</server-groups>
3)编辑host.xml
- 添加一个将成为负载平衡器的新服务器 - 即将其添加到新的load-balancer-group
:
<servers>
<server name="server-one" group="main-server-group"/>
<server name="server-two" group="main-server-group" auto-start="true">
<socket-bindings port-offset="150"/>
</server>
<server name="load-balancer" group="load-balancer-group" auto-start="true"/>
</servers>
4)如果您在类似 Linux 的系统上使用低于 1024 的端口号,则使用特权系统帐户运行域(例如使用sudo
):
sudo bin/domain.sh
您的域(包括负载均衡器)现在应该已经成功运行。
更新 1:
故障排除
确保所有绑定接口都已正确发布(例如,private
负载均衡器上的接口!)
主控制器:
export MY_IP=192.168.105.1
bin/domain.sh --host-config=host-master.xml -b $MY_IP -bmanagement $MY_IP -bprivate $MY_IP
奴隶:
export MY_IP=192.168.105.2
bin/domain.sh --host-config=host-slave.xml -b $MY_IP -bmanagement $MY_IP -Djboss.domain.master.address=192.168.105.1
如果您将其用作负载均衡器的主机配置,请确保已向其中host-master.xml
添加接口。public
<interface name="public">
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>
如果您的环境不支持多播(例如云或 docker 环境),请使用静态 modcluster 发现配置:
bin/jboss-cli.sh <<EOT
embed-host-controller
/socket-binding-group=ha-sockets/remote-destination-outbound-socket-binding=proxy1:add(host=192.168.105.1, port=8090)
/profile=ha/subsystem=modcluster/proxy=default:write-attribute(name=advertise, value=false)
/profile=ha/subsystem=modcluster/proxy=default:list-add(name=proxies, value=proxy1)
EOT
使用简单<distributable/>
应用程序测试配置。我通常使用简单的请求计数器应用程序。它是一个单一的 JSP,因此很容易直接在 war 文件中检查其源代码:
wget https://github.com/kwart/secured-webapp-template/releases/download/single-jsp-counter-distributable/counter-distributable.war
bin/jboss-cli.sh <<EOT
embed-host-controller
deploy counter-distributable.war --server-groups=main-server-group
然后通过将浏览器指向http://192.168.105.1:8080/counter-distributable/并且http://192.168.105.1/counter-distributable/
答案2
附加信息:在 docker swarm 环境中的 wildfly 26 中,静态 modcluster 配置对我来说不起作用。
Docker Swarm 版本信息:
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
Server: Docker Engine - Community
Engine:
Version: 20.10.6
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 8728dd2
Built: Fri Apr 9 22:44:13 2021
OS/Arch: linux/amd64
Experimental: true
containerd:
Version: 1.4.4
GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
我必须将“任何”接口添加到domain.xml中:
<interfaces>
...
<interface name="any">
<inet-address value="0.0.0.0"/>
</interface>
</interfaces>
并更改主服务器和从服务器中的启动参数。
掌握:
export MY_IP=192.168.105.1
bin/domain.sh --host-config=host-master.xml -b $MY_IP -bmanagement 0.0.0.0 -bprivate $MY_IP
奴隶:
export MY_IP=192.168.105.2
bin/domain.sh --host-config=host-slave.xml -b $MY_IP -bmanagement 0.0.0.0 -Djboss.domain.master.address=192.168.105.1