Weblogic教程

Session 复制

Session 复制的原理

HTTP 会话状态复制

WebLogic Server 使用两种方法来跨集群复制 HTTP 会话状态:

内存中复制

使用内存中复制时,WebLogic Server 会将会话状态从一个服务器实例复制到另一个服 务器实例。主服务器在客户端首先连接的服务器上创建主会话状态,在集群中的另一个 WebLogic Server 实例上创建次级副本。该副本总是保持最新状态,当主服务器失败时可以 使用该副本。

基于 Session 的持久化

WebLogic Server 可以将 Session 持久性化到文件或者 JDBC 数据源,从而达到在各个 服务器实例之间共享 Session 信息的目的。

HTTP 会话复制流程

代理连接过程

当 HTTP 客户端请求 Servlet 时,HttpClusterServlet 将该请求代理传输到 WebLogic Server 集群。HttpClusterServlet 维护集群中所有服务器的列表以及访问集群 时要使用的负载平衡逻辑。在上面的示例中,HttpClusterServlet 将客户端请求路由到了 WebLogic Server A 承载的 Servlet。WebLogic Server A 成为了承载该客户端的 Servlet 会话的主服务器。

为了对该 Servlet 提供故障转移服务,主服务器将客户端的 Servlet 会话状态复制到 集群中的某个次级 WebLogic Server。这样可确保即使在主服务器失败(例如由于网络失败) 时该会话状态的副本仍存在。在上面的示例中,服务器 B 被选择为次级服务器。

Servlet 页通过 HttpClusterServlet 返回到客户端,然后客户端浏览器收到指令,写 入列出该 Servlet 会话状态主位置和次级位置的 Cookie。如果客户端浏览器不支持 Cookie,WebLogic Server 则可以使用 URL 重写来代替。

使用 URL 重写跟踪会话副本

WebLogic Server 的默认配置使用客户端 Cookie 来跟踪承载客户端 Servlet 会话状 态的主服务器和次级服务器。如果客户端浏览器禁用了 Cookie 的使用,WebLogic Server 还可以使用 URL 重写来跟踪主服务器和次级服务器。使用 URL 重写时,两个位置的客户端 会话状态都会嵌入到在客户端和代理服务器之间传递的 URL 中。为了支持此功能,您必须 确保在 WebLogic Server 集群上启用了 URL 重写。有关如何启用 URL 重写的说明,请参 阅“使用会话和会话持久性”中的使用 URL 重写功能。

代理故障转移过程

如果主服务器失败,HttpClusterServlet 就使用客户端的 Cookie 信息来确定承载会 话状态副本的次级 WebLogic Server 的位置。HttpClusterServlet 会自动将客户端的下一 个 HTTP 请求重定向到次级服务器,故障转移对于客户端是透明的。

发生失败之后,WebLogic Server B 成为承载 Servlet 会话状态的主服务器,并且会 创建新的次级服务器(在上面示例中为服务器 C)。在 HTTP 响应中,代理会更新客户端的 Cookie 来反映新的主服务器和次级服务器,以考虑后续故障转移的可能性。

在由两个服务器组成的集群中,客户端将以透明方式故障转移到承载次级会话状态的服 务器。但是,客户端会话状态的复制不会继续,除非另一个 WebLogic Server 变为可用状 态并加入该集群。例如,如果原始主服务器重新启动或重新连接网络,则会使用它来承载次 级会话状态。

Session 复制的配置

内存中复制

要配置内存中复制,请执行下列操作:

  • 配置代理服务器(如果适用)。

  • 配置复制组和(或)计算机(可选)。

  • 在 weblogic.xml 部署描述符中指定持久性类型:

配置内存中复制会话持久性:

<session-descriptor>
<persistent-store-type>replicated</persistent-store-type>
</session-descriptor>

可选参数:

  • memory - 禁用持久性会话存储。

  • replicated - 与 memory 相同,但会话数据将在集群服务器之间复制。

  • replicated_if_clustered - 如果 Web 应用程序部署在集群服务器上,则按有效 的 persistentstore-type 复制;否则按默认值 memory 复制。

  • sync-replication-across-cluster - 复制将在集群内同步发生。

  • async-replication-across-cluster - 复制将在集群内异步发生。

配置 JDBC 复制

要配置 JDBC 复制,请执行下列操作:

1. 在数据库中创建表。

2. 创建对数据库具有读/写权限的连接池。

3. 在 weblogic.xml 部署描述符中配置会话持久性。

配置会话持久性的示例:

<session-descriptor> 
<persistent-store-type> jdbc</persistent-store-type> 
<persistent-store-pool> SessionDS</persistent-store-pool> 
<persistent-store-table> WL_SERVLET_SESSIONS</persistentstore-table> 
</session-descriptor>

JDBC 持久性表配置

必须存在名为 WL_SERVLET_SESSIONS 且具有读/写访问权限的数据库表:

列标题 列数据类型
WL_ID 可变宽度,最多 100 个字符
WL_CONTEXT_PATH
WL_IS_NEW numeric,20 位
WL_ACCESS_TIME numeric,20 位
WL_SESSION_VALUES BLOB,非常大
WL_IS_VALID char,1 个字符
WL_CREATE_TIMEW numeric,20 位

在映射到会话持久性连接池的数据库中,需要配置一个名为 WL_SERVLET_SESSIONS 的 表,该表将包含所有活动会话对象的值。指定有权访问此表的用户,需要对该表具有读/写/ 插入/删除访问权限才能有效地管理对象。该表需具有以下 8 列:

• WL_ID - 会话 ID,与 WL_CONTEXT_PATH 一起用作数据库主键。可变宽度字母数字数 据类型,最多 100 个字符。

• WL_CONTEXT_PATH - 上下文。此列与 WL_ID 一起用作主键。可变宽度字母数字数据 类型,最多 100 个字符。

• WL_IS_NEW - 只要 Servlet 引擎将会话分类为“新”状态,此值就为 True。含一个 字符的列。

• WL_CREATE_TIME - 最初创建会话的时间。Numeric 数据类型列,20 位。

• WL_IS_VALID - Servlet 可以访问会话时,该值为 True。用于并发访问。含一个字 符的列。

• WL_SESSION_VALUES - 实际会话数据。BLOB 列。

• WL_ACCESS_TIME - 上次访问会话的时间。Numeric 数据类型列,20 位。

• WL_MAX_INACTIVE_INTERVAL - 从客户端请求到会话失效之间的时间(秒)。负时间 值表明会话永不超时。Integer 数据类型列。

创建此表的 SQL 语句示例如下(适用于 Oracle):

create table wl_servlet_sessions ( wl_id VARCHAR2(100) NOT NULL,
wl_context_path VARCHAR2(100) NOT NULL, wl_is_new CHAR(1),
wl_create_time NUMBER(20), wl_is_valid CHAR(1), wl_session_values LONG
RAW, wl_access_time NUMBER(20), wl_max_inactive_interval INTEGER,
PRIMARY KEY (wl_id, wl_context_path) );

配置文件持久性

要为 Web 应用程序配置基于文件的会话持久性,请执行下列操作:

1. 创建一个集群上的所有服务器都可共享访问的文件夹。

2. 在 weblogic.xml 部署描述符中指定 file 持久性类型:

配置会话持久性的示例:

<session-descriptor>
<persistent-store-type>file</persistent-store-type>
<persistent-store-dir>shared folder location</persistentstore-dir>
</session-descriptor>

关注微信获取最新动态