Weblogic中的load banlance问题

在一个复杂的企业应用环境中,往往一个application server无法承担所有的服务请求,所以很多企业都为此架起了多个服务器实例。这些服务器实例结合在一起,可以组织成一个强健的企业运行环境,它易于扩展、支持load banlance, 支持fail over, 可以做到backend server的failure对于客户是透明的。这样的一个企业环境就是我们常说的Cluster。Weblogic Cluster提供了多种load banlance的可能, 比如web application请求处理,可以通过proxy来实现(e.g. apache, HttpClusterServlet, IIS), 不同的J2EE Component在Weblogic有不同的load banlance实现.下面我们来逐一看看,

1: Http请求通过proxy实现的load banlance

当客户端通过proxy访问Cluster中的业务页面时,proxy通过自身的算法(round-robin)来实现load banlance.当然这些请求要求是从不同的客户端(或者不带session的同一客户端的请求)发起的.对于同一客户端,如果页面中使用了 session, 那么Weblogic 通过session粘连来实现同一客户端的请求会被dispatch到primary server上.如果primary server无法提供服务,那么请求会被dispatch到其他server上。session粘连可以通过以下几种方式实现:

1.1:browser支持cookie的话,weblogic会把jsession id写入到cookie中,下次请求提交的时候jseeion id会被提交到proxy端,proxy通过jseeion id 来决定请求的dispatch。

1.2:browser不支持cookie,server端在处理返回页面时,调用response.encodeURL()来将session id附在url上。

1.3:post-data方式,直接将session作为数据,post到proxy端。

我们来看看weblogic提供的HttpClusterServlet是如何实现load banlance的,

public synchronized Server next() {
       if (list.size() == 0) return null;
       if (index == -1) index = (int)(java.lang.Math.random() * list.size());
       else index = ++index % list.size();
       Object[] servers = list.values().toArray();
       return (Server) servers[index];
}

HttpClusterServlet维护一个managed servlet list,每当一个请求被dispatch到某个managed server后,server list的index加1,这样在下次dispatch请求的时候,请求将会被dispatch到server list中的其他server上去。逻辑很简单,但基本也实现了load banlance功能。

2:InitialContext的load banlance

我们知道,每次我们需要获取jdbc connection, jms connection,ejb stub这类RMI Object的时候,我们都要初始化一个上下文,问题是我们初始化上下文的时候,连接的到底是哪个managed server?

初始化上下文的时候,我们需要提供一个provider url, 如下:

PROVIDER_URL = "t3://localhost:7011";

这种写法很简单,直接连接7001对应的server, 但如果写法如下呢?

CLUSTER_PROVIDER_URL="t3://localhost:7011,localhost:7021";

这时候,load banlance就又来了。10个客户端(weblogic server或者thin client)new 10个InitialContext的话,这10个客户端将55分别连接到后端的两台server上去。实际上客户端在new InitialContext的时候,weblogic会创建一个T3连接到对应的managed server上(RJVMConnection),注意这个RJVMConnection是个长连接,在同一个JVM中,连向同一managed server的连接只有一个。即如果一个客户端,连续new 10个 InitialContext, 这10个Context实际上是同一对象,weblogic server这时根本不会和后端的server通讯,因为对象已经在client JVM中有了。

new InitialContext的load banlance算法基本和proxy的算法一样,都是维护一个server list, 通过index递增的方法实现。不同的是:在连接某个managed server的connection遇到peer gone的时候, proxy可以recover server list, 而jndi context的load banlance算法则不能。也就是说如果后端有三个managed server, server1, server2相继出现故障的话,所有客户端的context将都会连接到server3, 即使server1, server2能够恢复过来,后续请求也不会连接到他们,除非server3后来出现问题。

值得一提的是:context所有的相关操作时server affinity的,而非load banlance。比如:2个客户端分别new了个context, 分别连接到server1和server2上,连接到server1的context,做了10次lookup,那么这10次操作,都在server1上完成,不会在server2上作任何操作。所以说jndi级别的load banlance不是绝对均衡的。

时间: 2024-10-30 23:55:43

Weblogic中的load banlance问题的相关文章

WebLogic中的一些基本概念

WebLogic 中的基本概念 上周参加了单位组织的WebLogic培训,为了便于自己记忆,培训后,整理梳理了一些WebLogic的资料,会陆续的发出来,下面是一些基本概念. Domain : 域是作为单元进行管理的一组相关的 WebLogic Server 资源.一个域包含一个或多个 WebLogic Server 实例,这些实例可以是群集实例.非群集实例,或者是群集与非群集实例的组合.一个域可以包含多个群集.域还包含部署在域中的应用程序组件.此域中的这些应用程序组件和服务器实例所需的资源和服

Weblogic中获取Server信息

在J2EE中我们经常需要获取到当前server的host和port等信息,比如在结构复杂的EJB程序中,进行一些remote调用,或者访问本机中的一个webservice组件,在weblogic中,如果设置了ListenAddress,那么localhost这个主机名是不可访问的,我们可以通过MBean去获取到server的信息,以获取server的ip和port为例: ObjectName rs = null; MBeanServer mbeanServer= (MBeanServer)con

JVM TI学习(1) 如何中断weblogic中stuck thread

JPDA(Java Platform Debugger Architecture)是sun推出的一套工具接口,有了这些接口,debugger.profile工具可以attach到target JVM,进而可以监控.调试我们的程序.JPDA包括三部分:JVM TI, JDI, JDWP.TI可以使用native语言,通过调用jvmti.c提供的系列库函数,实现debug工作,而JDI是TI面向Java开发人员提供的高层开发接口.TI代替了早期的DI,每个版本都做了一定的功能增强.随着JDK的发展,

关于在weblogic中异步调用webservice

这几天碰到个问题:在weblogic中调用async webservice,如果客户端不等待结果(比如服务器端因为某些原因,web service需要执行很长时间),直接退出的话,weblogic server是否保存调用结果,结果保存多长时间?如果这样的异常客户端很多,对服务器有什么负面影响,比如连接资源.内存开销等. 首先我们先阐述一下异步的概念 在weblogic webservice中,有两处异步的概念: 1:Synchronous request-response (the defau

Weblogic中因为IP变更导致SubCoordinator not available,Transaction Rollba

Weblogic中因为IP变更导致SubCoordinator not available,Transaction RollbackException问题调查 这几天在做一些Transaction方面的研究,碰到一个诡异的问题.问题大概是这样的,之前我的测试一直在公司做,今天把工作带到家里了,结果因为如下问题,导致我没法工作了. weblogic.transaction.RollbackException: SubCoordinator 'server_2+10.182.216.189:7021

关于weblogic中使用Dom4j、Xerces导致执行线程挂起的问题

这两天有客户跟我说了个问题,说他们发现weblogic不停的load class,最后线程都挂在了Zip Entry操作上.让他们做了thread dump, 开始以为跟JDK的IO性能有关系,因为我曾经在HP\AIX上都碰到过线程挂起在zip操作上的问题,最终客户通过调整OS参数后,问题得到解决.但在拿到thread dump后, 发现问题不是他们说的那样,thread trace如下: "ExecuteThread: '6' for queue: 'Out.Thread Pool'"

关于weblogic中使用prepared statement cache后操作DDL的问题

前几天有客户问我这么个问题,他们在weblogic中配置了prepared statement cache, 而他们应用中有操作DDL的地方,比如alter table什么的,这时候如果使用cached prepared statement的话,Oracle端会抛出SQLException: 违反协议.其实这个问题,weblogic 文档中已经有描述,如下: http://e-docs.bea.com/wls/docs81/ConsoleHelp/jdbc_connection_pools.ht

Linux/Unix中的load average

使用top命令时,我们会看到第一行有个 1 load average: 0.01, 0.01, 0.00 当然,别的命令也看的到,比如uptime,w. 使用strace追踪uptime很容易发现这三个数据来自/proc/loadavg文件.另几个命令也是通过读取这个文件得到的. 1 $ strace -eopen uptime 2 #省略掉无关内容 3 open("/proc/loadavg", O_RDONLY)         = 4 load average是什么: 三个数字分

在 Linux 系统中安装Load Generator ,并在windows 调用

原文地址:http://www.blogjava.net/qileilove/archive/2012/03/14/371861.html 由于公司需要测试系统的最大用户承受能力,所以需要学习使用loadrunner.在安装的时候碰到了不少问题,所以写下此文章总结遇到的问题以及解决方案,希望能帮到大家.也希望大家转载注明出处. Winsows 的Loadrunner 安装就不多讲了,这个太容易了. 以下是Linux 中安装 Load Generator 说明: Linux 系统版本:CentOS