gpt4 book ai didi

java - JBoss 集群和 Lighttpd 负载平衡显示不一致的行为

转载 作者:搜寻专家 更新时间:2023-11-01 03:53:34 24 4
gpt4 key购买 nike

问题

我们有两个 JBossAS 4.2.3 安装在不同的机器上,它们是集群的。我们还利用充当负载平衡器的 Lighttpd,它位于我们的 Tomcat 服务器(Tomcat 服务器未集群)和 JBoss 服务器之间。一旦所有服务器都启动并运行,应用程序就会完美运行。如果我关闭一台 JBoss 服务器,请求将按预期重定向到另一台服务器。注销应用程序后我的问题开始了。在尝试重新登录到应用程序时,我收到一个异常,提示 Tomcat 无法连接到已关闭的服务器。

服务器设置

  1. Machine01 - Tomcat7
  2. Machine02 - Tomcat7
  3. Machine03 - JBoss 4.2.3
  4. Machine04 - JBoss 4.2.3
  5. Machine05 - Lighttpd 1.4.28

其他信息

  • 所有机器都使用 Ubuntu 12.04 操作系统。
  • JBoss 机器集群。
  • EAR 被放置在 all/deploy 文件夹中。
  • 使用以下命令启动 JBossAS - ./run.sh -b 0.0.0.0 -c all --partition=SomePartitionName &>/dev/null &
  • Tomcat7 作为服务运行,因此它们作为 sudo service tomcat7 start 启动。
  • Lighttpd 配置为用作 JBoss 机器的负载平衡器。
  • lighttpd 上的 mod_proxy 配置如下:

    server.modules += ( "mod_proxy" )
    proxy.balance = "fair"
    proxy.server = ( "" => (( "host" => "Machine03", "port" => 1100 ),
    ( "host" => "Machine04", "port" => 1100 ))
  • jndi.properties 具有以下条目

    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
    java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
    java.naming.provider.url=Machine05:80

无法弄清楚为什么,在我关闭一台机器并从应用程序注销后,Tomcat 不再具有对 JBoss 机器的代理引用。

最佳答案

我现在已经解决了。感谢smallworld为我指明了正确的方向。发生的事情是我们正在缓存从 jndi 查找中获得的远程接口(interface)。现在据我了解,这个远程接口(interface)只指向集群中的一个特定服务器。 (我们认为远程接口(interface)足够智能,可以识别服务器已关闭。看起来这种智能在您进行查找时具有初始上下文的某个地方)。因此,一旦服务器关闭,对该远程接口(interface)进行的任何 ejb 调用都会连接到被关闭的服务器。因此,为了解决这个问题,我们停止缓存远程接口(interface),并在每次需要该 EJB 的服务时进行查找。如果任何服务器关闭,查找将返回启动并运行的服务器的远程接口(interface)。有了这个,集群就可以完美地工作了!所以,你们的代码应该是这样的:

    // Some where at class level we have the following map declared
private static final Map remoteEJBHashMap = new HashMap(100, 0.9f);

public static final <T> T getEJBInterface(String jndiLookupName) {
String jndiName = jndiLookupMap.get(jndiLookupName);
T ejbInterface = null;
//T ejbInterface = (T) remoteEJBHashMap.get(jndiLookupName);
//if (ejbInterface == null) {
try {
ejbInterface = (T) ctx.lookup(jndiName);
} catch (NamingException e) {
throw new RuntimeException(e);
}
//remoteEJBHashMap.put(jndiLookupName, ejbInterface);
//}
return ejbInterface;
}

注释行是导致问题的行。现在唯一留给我研究的是如果有更好的解决方案。

关于java - JBoss 集群和 Lighttpd 负载平衡显示不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16607113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com