6.5. HA 单例部署

您可以将应用程序部署为单例部署。当部署到一组集群服务器时,单例部署仅在任何给定时间部署到单个节点上。如果部署活跃状态的节点停止或失败,则部署会在另一节点上自动启动。

在以下情况下,可以在多个节点上部署单例部署:

  • 由于配置问题或网络问题,给定节点上的一组集群服务器无法建立连接。
  • 使用非 HA 配置,如以下配置文件:

    • 支持 Java EE 8 Web 配置文件或 standalone -full.xml 配置(支持 Java EE 8 完整平台配置文件)的 standalone.xml 配置。
    • domain.xml 配置,由默认域配置文件或全域配置文件组成。
重要

默认情况下,非 HA 配置不启用 singleton 子系统。如果您使用此默认配置,则忽略 singleton-deployment.xml 文件,以推进应用部署成功。

不过,使用非 HA 配置可能会导致 jboss-all.xml 描述符文件出现错误。为避免这些错误,请将单个部署添加到 singleton-deployment.xml 描述符中。然后,您可以使用任何配置集类型部署应用。

控制 HA 单例行为的策略由新的 例子系统管理。部署可以指定特定的单例策略,也可以使用默认的子系统策略。

部署使用 META-INF/singleton-deployment.xml 部署描述符将自身识别为单例部署,该描述符作为部署覆盖应用到现有部署中。此外,必要的单例配置也可嵌入到现有的 jboss-all.xml 文件中。

定义或选择单例部署

要将部署定义为单例部署,请在应用存档 中包含 META-INF/singleton-deployment.xml 描述符。

如果 Maven WAR 插件已存在,您可以将插件迁移到 META-INF 目录:** /src/main/webapp/META-INF

流程

  • 如果应用部署在 EAR 文件中,请将位于 jboss -all.xml 文件中的 singleton-deployment.xml 描述符或单例部署 元素移到 META-INF 目录的顶级。

    示例:单例部署描述符

    <?xml version="1.0" encoding="UTF-8"?>
    <singleton-deployment xmlns="urn:jboss:singleton-deployment:1.0"/>

  • 要将应用部署添加为 WAR 文件或 JAR 文件,请将 singleton-deployment.xml 描述符移到应用存档中的 /META-INF 目录的顶级。

    示例:带有特定单例策略的单例部署描述符

    <?xml version="1.0" encoding="UTF-8"?>
    <singleton-deployment policy="my-new-policy" xmlns="urn:jboss:singleton-deployment:1.0"/>

  • 可选:要在 jboss -all.xml 文件中定义单例部署,请将 jboss-all.xml 描述符移到应用存档中的 /META-INF 目录的顶级。

    示例:定义 jboss -all.xml 中的单例部署

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss xmlns="urn:jboss:1.0">
        <singleton-deployment xmlns="urn:jboss:singleton-deployment:1.0"/>
    </jboss>

  • 可选:使用单例策略在 jboss -all.xml 文件中定义 singleton- deployment。将 jboss-all.xml 描述符移到应用存档中 /META-INF 目录的顶级。

    示例:使用特定 的单例策略定义 jboss-all.xml 中的单例部署

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss xmlns="urn:jboss:1.0">
        <singleton-deployment policy="my-new-policy" xmlns="urn:jboss:singleton-deployment:1.0"/>
    </jboss>

创建单例部署

JBoss EAP 提供两种选择策略:

  • 简单选择策略

    simple-election-policy 选择要在其上部署给定应用的特定成员(通过 location 属性 表示)。位置 属性决定从按照降序年龄排序的候选列表中选择节点索引,其中 0 代表节点最旧的,1 表示第二个最旧的节点,-1 表示节点最年轻,-2 则表示 第二个较年轻的节点,以此类推。如果指定的位置超过候选项的数量,则应用模态操作。

    示例:使用 管理 CLI 创建一个带有 简单选择策略 和位置集的新单例策略

    batch
    /subsystem=singleton/singleton-policy=my-new-policy:add(cache-container=server)
    /subsystem=singleton/singleton-policy=my-new-policy/election-
    policy=simple:add(position=-1)
    run-batch

    注意

    要将新创建的策略 my-new-policy 设置为默认值,请运行这个命令:

    /subsystem=singleton:write-attribute(name=default, value=my-new-policy)

    示例:使用 standalone -ha.xml 配置一个简单选择策略,将位置设置为 -1

    <subsystem xmlns="urn:jboss:domain:singleton:1.0">
       <singleton-policies default="my-new-policy">
          <singleton-policy name="my-new-policy" cache-container="server">
             <simple-election-policy position="-1"/>
          </singleton-policy>
       </singleton-policies>
    </subsystem>

  • 随机选择策略

    random-election-policy 选择要在其上部署给定应用的随机成员。

    示例:使用管理 CLI 创建带有 随机选择策略 的新单例策略

    batch
    /subsystem=singleton/singleton-policy=my-other-new-policy:add(cache-container=server)
    /subsystem=singleton/singleton-policy=my-other-new-policy/election-policy=random:add()
    run-batch

    示例:使用 standalone -ha.xml 配置随机选择策略

    <subsystem xmlns="urn:jboss:domain:singleton:1.0">
       <singleton-policies default="my-other-new-policy">
          <singleton-policy name="my-other-new-policy" cache-container="server">
             <random-election-policy/>
          </singleton-policy>
       </singleton-policies>
    </subsystem>

    注意

    在尝试添加策略之前,需要定义 cache-container 的 default-cache 属性。如果不这样做,如果您使用的是自定义缓存容器,您可能会得到错误消息。

首选项

此外,任何单例选择策略都可指明群集的一个或多个成员的首选。首选项可以使用节点名称或使用出站套接字绑定名称来定义。节点首选项总是接管选择策略的结果。

示例:使用管理 CLI 在现有单例策略中指定首选项

/subsystem=singleton/singleton-policy=foo/election-policy=simple:list-add(name=name-preferences, value=nodeA)

/subsystem=singleton/singleton-policy=bar/election-policy=random:list-add(name=socket-binding-preferences, value=binding1)

示例:使用管理 CLI,使用 simple-election-policyname-preferences 创建一个新的单例策略

batch
/subsystem=singleton/singleton-policy=my-new-policy:add(cache-container=server)
/subsystem=singleton/singleton-policy=my-new-policy/election-policy=simple:add(name-preferences=[node1, node2, node3, node4])
run-batch

注意

要将新创建的策略 my-new-policy 设置为默认值,请运行这个命令:

/subsystem=singleton:write-attribute(name=default, value=my-new-policy)

示例:使用 standalone -ha.xmlsocket-binding-preferences 配置随机选择策略

<subsystem xmlns="urn:jboss:domain:singleton:1.0">
   <singleton-policies default="my-other-new-policy">
      <singleton-policy name="my-other-new-policy" cache-container="server">
         <random-election-policy>
            <socket-binding-preferences>binding1 binding2 binding3 binding4</socket-binding-preferences>
         </random-election-policy>
      </singleton-policy>
   </singleton-policies>
</subsystem>

定义仲裁

在单例部署中,网络分区尤其有问题,因为它们可以触发多个单例供应商来同时运行同一部署。为了防止这种情况,单例策略可以定义一个仲裁,在单例供应商选择前需要存在最少的节点数。典型的部署场景使用 N/2 + 1 的仲裁,其中 N 是预期的集群大小。这个值可以在运行时更新,并使用对应的单例策略立即影响任何单例部署。

示例:在 standalone-ha.xml 文件中 仲裁

<subsystem xmlns="urn:jboss:domain:singleton:1.0">
   <singleton-policies default="default">
      <singleton-policy name="default" cache-container="server" quorum="4">
         <simple-election-policy/>
      </singleton-policy>
   </singleton-policies>
</subsystem>

示例:使用管理 CLI 仲裁

/subsystem=singleton/singleton-policy=foo:write-attribute(name=quorum, value=3)

有关将应用中打包 为使用单例部署的单例的完整工作示例,请参见 JBoss EAP 附带的 ha-singleton-deployment 快速入门。

使用 CLI 确定主要单例服务提供商

singleton 子系统为从特定单例策略创建的每一个单例部署或服务公开运行时资源。这有助于您使用 CLI 确定主要单例提供程序。

您可以查看当前作为单例供应商的集群成员的名称。例如:

/subsystem=singleton/singleton-policy=default/deployment=singleton.jar:read-attribute(name=primary-provider)
{
    "outcome" => "success",
    "result" => "node1"
}

您还可以查看在其上安装单例部署或服务的节点的名称。例如:

/subsystem=singleton/singleton-policy=default/deployment=singleton.jar:read-attribute(name=providers)
{
    "outcome" => "success",
    "result" => [
        "node1",
        "node2"
    ]
}