在每篇专栏文章中,WebSphere 反向投资者将回答问题、提供指导并讨 论与 WebSphere 产品使用相关的基础主题,经常会给出与流行的看法相悖的经过 实践验证的建议。
配置疗法
让我先来向您解释一下,尽管我在本 专栏的标题中使用了 “解决冲突” 的字样,但我并没有改变职业, 而投身于调停或有关的行业。此外,虽然有关各种 WebSphere Application Server 主题的讨论可能会导致所谓的 “精神辩论”,但本专栏并不 想涉及如何解决可导致这类辩论的观点的根本差异。相反,这里的焦点是如何检 测和解决因并行更新 WebSphere Application Server 配置而产生的 WebSphere Application Server 配置冲突。
过去,我曾 写过一个专栏,这个专栏讨 论了如何加速 WebSphere Application Server 内的应用程序部署,以避免在系 统维护窗口期间进行并行应用程序部署的需求 — 而这会导致本专栏主题内 所指的这类冲突。并且,在 上一篇 WebSphere 反向投资者 文章中,我推荐使用 一个用于执行维护的双 cell 方法 — 软件和硬件 — 作为最小化甚 至消除维护窗口中断的机制。我之前提到的两种方法仍然是在一个给定的时间框 架内执行应用程序维护的建议方法,如果出于某种原因,您发现一个或两个或多 个选项不适合您的具体环境,那么您可以将并行应用程序部署用作另外一个选项 ,具体步骤在本文中会给出。
在深入探究具体的过程之前,让我们先来简要讨论一下 WebSphere Application Server 提供的用于阻止配置冲突的嵌入功能。
熟悉数据库 并发控制的读者都会将工作空间冲突解决方案视为一种理想的并发控制。理想的 并发控制允许来自多个事务的所有读写操作,但是会在事务提交期间执行冲突解 决方案。当保存冲突较少时,理想的并发控制能提供较其他并发选项更好的性能 ,但是如果对相同记录的不同更新经常有冲突导致异常或回滚,那么其他的并发 选项会提供更好的性能。
每当有用户登录到一个管理员客户端(admin 控制台或 wsadmin)时,就会用 一个不同的工作空间会话来跟踪变化。与每个工作空间相对应的是一个用于保存 此用户接触过的所有文件的临时目录。此工作空间内的文件最初提取自 WebSphere Application Server 单元配置存储库并且此用户所做的所有更改都只 反映在工作空间的副本,直到发生一次保存。当保存发生时,WebSphere Application Server 配置管理运行时会将来自此工作空间的已更改文件复制回这 个主存储库,但首先会进行检查以确保已更改文件没有被另一个工作空间会话修 改或保存过。只要两个工作空间会话修改了不同的文件,就不会有保存冲突。当 有冲突时,只有第一个工作空间会话的更改会反映在 WebSphere Application Server 单元配置存储库中,而具有冲突文档的后续会话则会在保存期间收到一个 保存冲突异常。在一个具有多用户的共享环境中,虽然总是可以读取这个配置, 但是如果另一个工作空间会话试图保存已经由第一个工作空间修改的相同的文件 时,那么保存这个工作空间会话可能不会成功。
对于应用程序部署,为了支持应用程序的并发部署,对其进行了一个特殊配置 。由不同的工作空间会话初始化的应用程序部署可以修改相同的 serverindex.xml 文件,在这种情况下,WebSphere Application Server 配置管 理运行时为 serverindex.xml 文件采用了一个合并算法,它支持:
向不同的应用程序服务器或不同的应用程序服务器群集并发部署不同的应用程 序。
向相同的应用程序服务器或相同的应用程序服务器群集并发部署不同的应用程 序。
在保存与任一更改相关的配置之前,管理控制台进行一次设置来查看更改,但 出于 本文 中提到的原因,WebSphere Application Server 的任何生产管理都应 该完全通过脚本执行。
结果,大多数典型的并发或并行应用程序部署场景都可安全执行,无需系统管 理员方面的任何额外努力。不过,还有其他的应用程序部署场景(比如向相同的 应用程序、相同的群集或服务器的并发部署,目前尚不能由 serverindex.xml 合 并算法处理)以及其他的并发管理动作涉及的不只是应用程序部署,因此有可能 发生配置冲突。有一些简单的措施可用来确保不会有配置冲突并为一些受支持的 场景或在使用 wsadmin 时的其他一些场景解决所有冲突。
为配置冲突检测和解决所采用的 wsadmin 命令依赖于获得对 ConfigService MBean 的引用,然后调用由该 MBean 提供的 getConflictDocuments 方法来决定 是否有相互冲突的变更发生自另一个管理会话。
获得所需对象引用以及构造此调用所需的参数列表的步骤如清单 1 所示。
清单 1
// get ConfigService MBean reference
wsadmin>cs = AdminControl.queryNames ('WebSphere:*,type=ConfigService')
// obtain ObjectName for ConfigService MBean
wsadmin>import javax.management as mgmt
wsadmin>csName=mgmt.ObjectName(cs)
// get session object for the current administrative user session
wsadmin>session=AdminConfig.getCurrentSession()
// manipulate and prepare the administrative session object and
// MBean operation arguments for use
wsadmin>from com.ibm.websphere.management import Session
wsadmin>from jarray import array
wsadmin>parms=array([session], java.lang.Object)
wsadmin>ptype=array(['com.ibm.websphere.management.Session'], java.lang.String)