在 Liberty 集群中共享内存网格数据

http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1303_qiuxl_liberty/1303_qiuxl_liberty.html

介绍

WebSphere Liberty Profile Server 介绍

Liberty 是一款全新的轻量级应用服务器, 具有以下几个方面的特点:

  1. 高 模块化——该功能允许用户根据自己应用程序的需求启用或者禁用相关的 feature(所谓 feature,在这里指的是运行应用程序所需要的各种资源的支持。比如,应用程序用到了 JSP,我们就需要启动 JSP 这个 feature,如果不在需要此 feature,就可以将其禁用。通过这种模块化的控制,我们可以按需启动不同的 feature,包括 JSP, Servlet, JPA 等等,这种控制是实现轻量级应用服务器的基础)。
  2. 轻量级—— Liberty 采用了多种技术进行瘦身和优化(主要是 OSGi 的应用),与传统的 WAS 相比,极大的减少了运行时的内存消耗。
  3. 高动态性——由于采用了 OSGi 的架构,程序员在开发的时候,可以动态修改配置文件,应用程序以及服务器的运行时信息,这些修改都是实时生效的,不需要重启服务器。
  4. 快速——由于采用了高模块化的设计,Liberty 应用服务器会“按需启动”,自身消耗的系统资源很少,对执行任务的反应时间也非常短,例如,一般来说 Liberty 的启动时间小于 5 秒。
  5. 配置简单——在整个开发过程中,用户只需要和一个配置文件(server.xml)打交道,而且配置的使用也非常灵活。

WebSphere eXtreme Scale 介绍

WebSphere eXtreme Scale 以内存网格的方式运行,动态处理、分区、复制和管理数以万计服务器上的应用程序数据和业务逻辑。提供事务完整性和透明的故障恢复功能,从而确保高可用性、 高可靠性和一致的响应时间。它可以监控和管理自己,支持扩大和缩小,可以自动从故障恢复。极大的扩大了应用程序可以支持的用户数量。用更少的时间服务更多 的用户,或者在规定的、可接受的响应时间内为更多的用户提供服务。

回页首

前提

  • 安装 Oracle 或者 IBM JDK,并配置好环境变量。
  • 如果使用 Eclipse,请安装 WebSphere Application Server V8.5 Liberty Profile Developer Tools

回页首

安装配置

安装 IBM HTTP 服务器及插件

本文将使用 IBM 安装管理器来在测试机 A 中安装 IBM HTTP 服务器以及插件。

  • 下载并安装 IBM Installation Manager 1.5.2 或以上版本
  • 下载添加安装路径到 IBM 安装管理器
  • 选中 IBM HTTP 服务器以及插件
图 1. 安装成功界面
在 Liberty 集群中共享内存网格数据_第1张图片

安装 Liberty

Liberty 支持两种安装方式:运行 JAR 文件、使用安装管理器安装。本文将介绍如何使用运行 JAR 文件安装 Liberty 服务器。在此例中,将会在测试机 A、B 和 C 上安装 Liberty 服务器。

  1. 下载 wlp-developers-8.5.0.0.jar 文件到本地机器。
  2. 打开命令行,找到下载的 jar 文件,例如 C:\Liberty。
  3. 执行 java -jar wlp-developers-8.5.0.0.jar。
  4. 设定安装路径完成安装。
图 2. Liberty 安装界面
在 Liberty 集群中共享内存网格数据_第2张图片

安装 WebSphere eXtreme Scale

WebSphere eXtreme Scale 支持两种安装方式:运行 JAR 文件、使用安装管理器安装。本文将介绍如何使用运行 JAR 文件安装 WebSphere eXtreme Scale 插件。在此例中,将会在测试机 A 上安装 WebSphere eXtreme Scale 插件。

  1. 下载 wxs-wlp_850.jar 文件到本地机器。
  2. 打开命令行,找到下载的 jar 文件,例如 C:\Liberty。
  3. 执行 java -jar wlp-developers-8.5.0.0.jar。
  4. 设定安装路径完成安装。
图 3. WebSphere eXtreme Scale 安装界面
在 Liberty 集群中共享内存网格数据_第3张图片

创建 Liberty 服务器

  1. 进入 Liberty 安装目录下的 bin 文件夹
  2. 执行服务器创建命令 server create 服务器名称(例如:Test001)

在本文中将会在测试机 A、B 和 C 上创建三个 Liberty 服务器实例,分别命名为 Test001,Test002 和 Test003.

图 4. Liberty 服务器创建界面
在 Liberty 集群中共享内存网格数据_第4张图片

在 wlp_home/usr/servers 目录下看到以服务器命名的文件夹则表示创建成功。

图 5. 服务器创建成功界面
在 Liberty 集群中共享内存网格数据_第5张图片

配置 Liberty 服务器

为每个 Liberty 服务器添加两个新功能(在 Liberty 中运行嵌入式 XS 服务器,使用 XS 存储 HTTP 会话)到 server.xml。添加代码如下:

清单 1. Feature 添加示例
    <!-- Enable features -->      <featureManager>          <feature>jsp-2.2</feature>          <feature>localConnector-1.0</feature>          <feature>eXtremeScale.web-1.0</feature>          <feature>eXtremeScale.server-1.0</feature>      </featureManager>

更改 server.xml 中 HTTP 默认端口,可以在 Test002 中使用 9080 端口,在 Test003 中使用 9081 端口。因为不同的服务器在不同的测试机上,此处我们使用默认端口 9080 不会产生冲突。添加代码如下:

清单 2. HTTP 端口修改示例
 <httpEndpoint host="*"                httpPort="9080"                httpsPort="9443"                id="defaultHttpEndpoint">

添加 WXS 配置文件到 Liberty 服务器,并将 Test001 作为 Catalog 服务器。Test002 和 Test003 不需要作为 Catalog 服务器,所以 <xsServer> 标签的 isCatalog 属性设定为“false”。添加代码如下:

清单 3. XS Server 配置示例
    <!-- Configuration for XS Server -->      <xsServer isCatalog="true"                listenerPort="2809"                serverName="Server1"/>      <!-- Configuration for XS HTTP Session data storage -->   <xsWebApp catalogHostPort="localhost:2809"            objectGridType="REMOTE"            replicationInterval="0"            reuseSessionId="true"            securityEnabled="true"            sessionTableSize="0"/>

在 Test001 服务器目录下创建“grids”文件夹,导入 XML 配置文件 deployment.xml 和 objectgrid.xml

deployment.xml 文件代码如下:

清单 4. deployment.xml 示例
 <?xml version="1.0" encoding="UTF-8"?>   <deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://ibm.com/ws/objectgrid/   deploymentPolicy ../deploymentPolicy.xsd" 	 xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">   <objectgridDeployment objectgridName="session">   <mapSet name="sessionMapSet"              numberOfPartitions="47"              minSyncReplicas="0"              maxSyncReplicas="0"              maxAsyncReplicas="1"              developmentMode="false"              placementStrategy="FIXED_PARTITIONS">          <map ref="objectgridSessionMetadata"/>          <map ref="objectgridSessionAttribute.*"/>          <map ref="objectgridSessionTTL.*"/>      </mapSet>   </objectgridDeployment>   </deploymentPolicy>
清单 5. objectgrid.xml 示例
 <?xml version="1.0" encoding="UTF-8"?>   <objectGridConfig xmlns:xsi="http://www.w3.org/2001/   XMLSchema-instance" xsi:schemaLocation="http://ibm.com/ws/   objectgrid/config ../objectGrid.xsd" xmlns="http://ibm.com/ws/objectgrid/config">   <objectGrids>      <objectGrid name="session" txTimeout="30">          <bean id="ObjectGridEventListener"                className="com.ibm.ws.xs.   sessionmanager.SessionHandleManager"/>          <backingMap name="objectgridSessionMetadata"                      pluginCollectionRef="objectgridSessionMetadata"                      readOnly="false"                      lockStrategy="PESSIMISTIC"                      ttlEvictorType="LAST_ACCESS_TIME"                      timeToLive="3600"                      copyMode="COPY_TO_BYTES"/>          <backingMap name="objectgridSessionAttribute.*"                      template="true"                      readOnly="false"                      lockStrategy="PESSIMISTIC"                      ttlEvictorType="NONE"                      copyMode="COPY_TO_BYTES"/>          <backingMap name="objectgridSessionTTL.*"                      template="true"                      readOnly="false"                      lockStrategy="PESSIMISTIC"                      ttlEvictorType="LAST_ACCESS_TIME"                      timeToLive="3600"                      copyMode="COPY_TO_BYTES"/>      </objectGrid>   </objectGrids>   <backingMapPluginCollections>      <backingMapPluginCollection id="objectgridSessionMetadata">   <bean id="MapEventListener"        className="com.ibm.ws.xs.sessionmanager.MetadataMapListener"/>      </backingMapPluginCollection>   </backingMapPluginCollections>   </objectGridConfig>

在三个 Liberty 服务器中添加 <httpSession> 标签,使 Liberty 的会话管理器使用相同的会话 ID,添加代码如下:

清单 6. httpSession 重用设定示例
 <! — Configuration for httpSession resuse -->   <httpSession idReuse="true"/>

Test002 和 Test003 不需要配置 XS 服务器,将设定 isCatalog 为"false", 同时 Test002 和 Test003 不需要创建“grids”文件夹。

为方便起见,在此我们将 Test001、Test002 和 Test003 导入到 Eclipse(Indigo Service Release 2)。

图 6. Liberty 服务器导入界面
在 Liberty 集群中共享内存网格数据_第6张图片

创建部署测试程序

新建 Web Project,命名为 testApp

在 WebContent 文件夹下创建 index.jsp 文件,文件代码如下:

清单 7. Index.jsp 页面代码示例
 <%@page contentType="text/html" pageEncoding="UTF-8"%>   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">     <html>   <head>   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   <title> 在 Liberty 集群中共享内存网格数据 </title>   </head>   <body>   <h1> 在 Liberty 集群中共享内存网格数据测试页面 !</h1>   <%   Integer count;   Object obj_Count = session.getAttribute("COUNT");   if (obj_Count != null) {   count = (Integer) obj_Count;   count = count + 1;   } else {   count = 1;   }   session.setAttribute("COUNT", count);   %>   <h3> 计数器会在每次页面加载时加 1</h3>   <h3><font color="#FF0000"> 计数器  = <%=count%></font></h3>   <h4><font color="#FF0000"><b> 页面服务器 :   <%= System.getProperty("wlp.server.name") %></b></font></h4>   <br/>  页面生成时间 = <%=new java.util.Date().toString()%><br/>   <br/>   </body>   </html>

将 testApp 分别部署到 Test002 和 Test003,

图 7. 测试程序部署界面
在 Liberty 集群中共享内存网格数据_第7张图片

启动 Test001 ,Test002 和 Test003 服务器

可 以使用命令行启停 Liberty 服务器。例如在 Liberty 的安装目录的 bin 文件夹下执行 server start Test001 来启动 Test001 服务器。将测试程序直接拷贝应用程序(例如 war 文件)到 dropins 目录,当 Liberty 启动的时候,就会自动扫描,然后启动文件夹内的应用程序。前提是在启动前要配置好 server.xml 中关于应用程序的相关信息,代码如下:

清单 8. 应用程序部署示例
 <application id="testApp"               location="testApp.war"               name="testApp"               type="war"/>

配置 HTTP 服务器

为 Test002 和 Test003 生成 plugin-cfg.xml 配置文件。在此使用 JAVA 的 jconsole 生成配置文件

在 JAVA 的安装目录的 bin 文件夹下运行 jconsole。

图 8. Jconsole 启动命令界面
在 Liberty 集群中共享内存网格数据_第8张图片
图 9. Jconsole 启动界面
在 Liberty 集群中共享内存网格数据_第9张图片

选择之前创建的 Liberty 服务器,连接

在 MBeans 标签下点击 generateDefaultPluginConfig 方法生成配置文件 .

图 10. 配置文件生成界面
在 Liberty 集群中共享内存网格数据_第10张图片

合并 Test002 和 Test003 的 plugin-cfg.xml 配置文件。文件代码如下,其中的 IP 分别为测试机 B 和 C 的 IP。

清单 9. plugin-cfg.xml 代码示例
 <?xml version="1.0" encoding="UTF-8"?>   <!-- This config file was generated by plugin's merge tool v1.0.0.2 on 2012.10.16 at   16:03:42 CST -->   <Config ASDisableNagle="false"          AcceptAllContent="false"         AppServerPortPreference="HostHeader"          ChunkedResponse="false"         FIPSEnable="false"          IISDisableNagle="false"          IISPluginPriority="High"         IgnoreDNSFailures="false"          RefreshInterval="60"         ResponseChunkSize="64"          SSLConsolidate="false"         SSLPKCSDriver="REPLACE"          SSLPKCSPassword="REPLACE"         TrustedProxyEnable="false"          VHostMatchingCompat="false">      <Log LogLevel="Error" Name=".\logs\defaultServer\http_plugin.log"/>      <Property Name="ESIEnable" Value="true"/>      <Property Name="ESIMaxCacheSize" Value="1024"/>      <Property Name="ESIInvalidationMonitor" Value="false"/>      <Property Name="ESIEnableToPassCookies" Value="false"/>      <Property Name="PluginInstallRoot" Value="."/>      <!-- Server Clusters -->      <ServerCluster CloneSeparatorChange="false"                     GetDWLMTable="false"                    IgnoreAffinityRequests="true"                     LoadBalance="Round Robin"                    Name="Shared_2_Cluster_0"                     PostBufferSize="64"                     PostSizeLimit="-1"                    RemoveSpecialHeaders="true"                     RetryInterval="60">          <Server CloneID="Server3CloneID"             ConnectTimeout="0" ExtendedHandshake="false"             MaxConnections="-1" Name="Server3"             ServerIOTimeout="900" WaitForContinue="false">            <Transport Hostname="9.115.75.85"                       Port="9081"                       Protocol="http"/>          </Server>          <Server CloneID="Server2CloneID"                 ConnectTimeout="0"                  ExtendedHandshake="false"                 MaxConnections="-1"                  Name="Server2"                 ServerIOTimeout="900"                  WaitForContinue="false">                <Transport Hostname="9.111.97.74"                           Port="9081"                           Protocol="http"/>           </Server>           <PrimaryServers>               <Server Name="Server3"/>               <Server Name="Server2"/>           </PrimaryServers>      </ServerCluster>      <!-- Virtual Host Groups -->      <VirtualHostGroup Name="/cell/sharedCell_2/vHostGroup/shared_host_0">          <VirtualHost Name="*:443"/>          <VirtualHost Name="*:80"/>          <VirtualHost Name="*:9080"/>          <VirtualHost Name="*:9081"/>      </VirtualHostGroup>      <!-- URI Groups -->      <UriGroup Name="/cell/sharedCell_2/application/   default_host_defaultServer_default_node_Cluster_URIs">          <Uri AffinityCookie="JSESSIONID"              AffinityURLIdentifier="jsessionid"               Name="/test/*"/>      </UriGroup>      <!-- Routes -->      <Route ServerCluster="Shared_2_Cluster_0"            UriGroup="/cell/sharedCell_2/application/   default_host_defaultServer_default_node_Cluster_URIs"              VirtualHostGroup="/cell/sharedCell_2/vHostGroup/shared_host_0"/>   </Config>

将合并后的 plugin-cfg.xml 配置文件拷贝到 IBM HTTP 服务器上。

下边所示代码到 http.conf 文件使 plugin-cfg.xml 配置文件生效

清单 10. plugin-cfg.xml 生效示例
 LoadModule was_ap22_module "path\to\mod_was_ap22_http.dll"  WebSpherePluginConfig "path\to\plugin-cfg.xml"

回页首

测试

访问测试程序

启动 HTTP 服务器以及 Test001、Test002 和 Test003。在测试机 A 上打开浏览器,访问 http://localhost/testApp/ 可以看到 Test002 访问界面或者 Test003 访问界面。这依赖于 HTTP 服务器将请求发送到 Test002 还是 Test003。

图 11. Test002 访问界面
在 Liberty 集群中共享内存网格数据_第11张图片
图 12. Test003 访问界面
在 Liberty 集群中共享内存网格数据_第12张图片

以第一次访问 Test002 为例,此时如果 Test002 发生故障停机了(在此手动停掉 Test002),当再次访问 http://localhost/testApp/ 时,HTTP 服务器会将请求发送到 Test003,如图 13 所示。但此时计数器并没有还原,由于两个服务器共享内存网格数据,所以计数器在首次访问 Test003 的时候已经在 Test002 的基础上加了一。

图 13. Test003 计数器增加界面
在 Liberty 集群中共享内存网格数据_第13张图片

参考资料

你可能感兴趣的:(在 Liberty 集群中共享内存网格数据)