weblogic多服务器集群 seesion复制

转至:http://blog.csdn.net/mobicents/article/details/7067957

在Weblogic中,HttpSession Replication的方式是通过在weblogic.xml中的session-descriptor的定义persistent-store-type来实现的.persistent-store-type可选的属性包括memory,replicated,replicated_if_clustered,async-replicated,async-replicated-if-clustered,file,async-jdbc,jdbc,cookie,coherence-web.

·memory—Disablespersistentsessionstorage.

·replicated—Sameasmemory,butsessiondataisreplicatedacrosstheclusteredservers.

·replicated_if_clustered—IftheWebapplicationisdeployedonaclusteredserver,thein-effectpersistent-store-typewillbereplicated.Otherwise,memoryisthedefault.

·async-replicated—EnablesasynchronoussessionreplicationinanapplicationorWebapplication.See"AsynchronousHTTPSessionReplication"inPerformanceandTuningforOracleWebLogicServer.

·async-replicated-if-clustered—EnablesasynchronoussessionreplicationinanapplicationorWebapplicationwhendeployedtoaclusterenvironment.Ifdeployedtoasingleserverenvironment,thenthesessionpersistence/replicationdefaultstoin-memory.Thisallowstestingonasingleserverwithoutdeploymenterrors.

·file—Usesfile-basedpersistence(Seealsosession-descriptor).

·async-jdbc—EnablesasynchronousJDBCpersistenceforHTTPsessionsinanapplicationorWebapplication.SeeConfiguringSessionPersistence.

·jdbc—Usesadatabasetostorepersistentsessions.(seealsosession-descriptor).

·cookie—Allsessiondataisstoredinacookieintheuser'sbrowser.

·Coherence*-webFormoreinformation,seeUser'sGuideforOracleCoherence*Web.

Replicated,async-replicated只用部置集群在集群上,而replicated_if_clustered,async-replicated-if-clustered也可以部署在独立实例上。都不能只部署在集群的部分实例中上。

参考:http://docs.oracle.com/cd/E23943_01/web.1111/e13712/weblogic_xml.htm#i1071981

例如:

<?xmlversion="1.0"encoding="UTF-8"?>

<weblogic-web-appxmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-apphttp://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd">

<session-descriptor>

<!--<persistent-store-type>replicated</persistent-store-type>-->

<persistent-store-type>replicated_if_clustered</persistent-store-type>

<!--<persistent-store-type>memory</persistent-store-type>-->

<timeout-secs>60</timeout-secs>

</session-descriptor>

</weblogic-web-app>

1.LoadBlanace和SessionAffinity

由于这里的机制是主从备份,所以集群中只有两个实例会有同一HTTPSession的数据.当集群里的实例多于2个以上时,为了确保后续的HTTP请求能访问到Session数据,必须要求前置分发请求的loadbalancer支持sessionaffinity(stickysession/seamlesssession).SessionAffinity就是能够把特定Session的所有请求都路由到第一次创建Session的同一物理机器上;否则后续的请求就有可能不能够访问Session数据了.

如果设置成非Replication方式即memory模式,生成的JSESSIONID类似:

gGMWQy2LcSTHTSyLdyLpqYGskYpXPpRJkc2VB618mSKSQC9rgsCv!-1274119771!1353236040031

可以看出这个session被二个!分隔成三部分。第一部分应该是真正的sessionid,-1274119771是实例标识。而1353236040031为session创建时间。

一旦配置成Replicated模式,Weblogic会生成的SessionID类似:

sHkLQyQTnJQQ217Js7SmQL2x9hBb0JQ5hFm7n4QpNkZL7wMnLbPn!-9326295!959096067!1353236595093

这里出现三个!,第二,三部分为主备实例的标识。

SessionID格式的:sessionid!primary_server_id[!secondary_server_id]!creationTime

2.配置weblogicLoadBlanace

配置方式参考:http://guojuanjun.blog.51cto.com/277646/748768

1)通过http://localhost/Cluster/cluster.jsp访问,页面显示:

sessionId:

KSW2QyJFzVcnFxQTWpSLJLhJTTQsCzLGqlM1ShnCvSyKm2r4k29h!-1458785082!2113129367!1353238917906

sessionCreateTime:1353238917906

currentinstance:Server1

可以看到该session的primary_server_id为-1458785082,即Server1。(每个server的id是启动时生成的,所以也是变化,所以你的测试可能与我不一样。)secondary_server_id为2113129367,即server3.即server3是Server1的备点。

2)停止Server1,再次访问,页面显示:

sessionId:

KSW2QyJFzVcnFxQTWpSLJLhJTTQsCzLGqlM1ShnCvSyKm2r4k29h!2113129367!-481865348!1353238917906

sessionCreateTime:1353238917906

currentinstance:Server3

可以看到sessionId没有变化,而该session的primary_server_id为2113129367,即Server3。secondary_server_id为-481865348,即server0.即Server0是Server3的备点。

3)停止Server3,再次访问,页面显示:

sessionId:

KSW2QyJFzVcnFxQTWpSLJLhJTTQsCzLGqlM1ShnCvSyKm2r4k29h!-481865348!NONE!1353238917906

sessionCreateTime:1353238917906

currentinstance:Server0

可以看到sessionId没有变化,该session的primary_server_id为-481865348,即Server0。secondary_server_id为NONE,即该session没有备点.

通过测试我们大致可以猜出weblogicsession复制的基本思路:

1)每个实例都有两份Session数据。主数据和备份数据。

2)当请求的sessionId的primary_server_id为当前实例时,从主数据里获取session响应请求,否则进行3).

3)当请求的sessionId的secondary_server_id为当前实例时,从备份数据里取session响应请求。并修正该session的primary_server_id/secondary_server_id为自已及其的备点。

3.Weblogic支持的负载均衡

Weblogic支持两种机制的负载均衡

1)Proxyplug-ins

Weblogic内置插件,即http://guojuanjun.blog.51cto.com/277646/748768中提到的mod_wl.

如果一个实例失败,plug-in会定位该session的secondary_server,将请求发给它。

2)Hardwareloadbalancers

Hardwareloadbalancers,比如F5.这些第三方产品并不能按weblogic的意愿,定位session的secondary_server。他会随机选机选择一个可用实例发给他。然后该实例通过sessionid里的secondary_server_id,像secondary_server获取数据。

虽然weblogic允许这种请求的随机转发,但并不建议使用会话不亲和方式,因为这将带来数据并发和一致性问题。

参考文献:

1.http://blog.csdn.net/mobicents/article/details/7067957

2.http://docs.oracle.com/cd/E23943_01/wls.htm

3.http://stackoverflow.com/questions/6429990/weblogic-jsessionid

相关推荐