第 8 章 域管理

本节讨论受管域操作模式专有的概念和操作。

关于保护受管域的详情,请参考如何配置服务器安全性里的保护受管域章节。

8.1. 关于受管域

受管域(managed domain)操作模式允许从单个控制点管理多个 JBoss EAP 实例。

集中管理的 JBoss EAP 服务器集合被称为域成员。域里所有的 JBoss EAP 实例都共享一个公用的管理策略。

域由一个域控制器、一个或多个主机控制器,以及每个主机的零或多个服务器组组成。

A managed domain.

域控制器是控制域的一个中心点。它确保了每个服务器都根据域的管理策略进行配置。域控制器同时也是一个主机控制器。

主机控制器是一个物理主机或一个虚拟主机,它用来和域控制器进行交流,从而控制在主机上运行的应用程序服务器实例的生命周期,并协助域控制器对它们进行管理。每个主机可以包括多个服务器组。

服务器组就是一组安装了JBoss EAP、并被它管理和配置的服务器实例。域控制器管理在服务器组中部署的应用程序的配置,因此,服务器组中的每个服务器都会共享相同的配置和部署。

主机控制器和特定的物理(或虚拟)主机相绑定。您可以在一个硬件上运行多个主机控制器,但需要使用不同的配置以确保它们的端口和其它资源没有冲突。域控制器、主机控制器和多个服务器可以在相同物理系统中的同一个 JBoss EAP 实例中运行。

8.1.1. 关于域控制器

域控制器是充当域的中央管理点的 JBoss EAP 服务器实例。主机控制器实例可以配置为域控制器。

域控制器的主要职责是:

  • 维护域的集中管理策略。
  • 确保所有的主机控制器意识到它当前的内容。
  • 协助主机控制器确保所有运行的 JBoss EAP 服务器实例按照这个策略进行配置。

在默认情况下,集中管理策略保存在 EAP_HOME/domain/configuration/domain.xml 文件里。设置为域控制器的主机控制器的这个目录里要求存在这个文件。

domain.xml 文件包括了可以被域中的服务器使用的配置集配置。一个配置集包括了这个配置集中的不同子系统的详细设置。域配置还包括了套接字组的定义和服务器组的定义。

注意

JBoss EAP 7 域控制器可以管理 JBoss EAP 6 主机和服务器,以及运行 JBoss EAP 6.2 或更高版本的主机和服务器。

关于更多的信息,请参考启动受管域配置域控制器章节。

8.1.2. 关于主机控制器

主机控制器的主要职责是管理服务器。它负责委派域管理任务,并负责启动和停止运行在主机上的应用服务器进程。

它和域控制器进行交流,来帮助管理服务器和域控制器间的通讯。一个域的多个主机控制器可以只和一个域控制器进行交流。在一个独立域模式中运行的所有主机控制器和服务器实例会有一个独立的域控制器,它们需要属于相同的域。

在默认情况下,每个主机控制器都会从主机文件系统中的解包的 JBoss EAP 安装文件中的 EAP_HOME/domain/configuration/host.xml 文件中读取它的配置信息。host.xml 文件包括了以下与特定主机相关的配置信息:

  • 从这个安装中运行的服务器实例名。
  • 针对于本地物理安装的配置。例如,在 domain.xml 中声明的命名接口定义可以被映射到 host.xml 中的一个实际机器的 IP 地址。domain.xml 中的抽象路径名会被映射到 host.xml 中的实际文件系统路径。
  • 任何下列的配置:

    • 主机控制器如何联系域控制器来注册自己并访问域配置。
    • 如何找到并联系远程域控制器。
    • 主机控制器是否充当域控制器。

关于更多的信息,请参考启动受管域配置主机控制器章节。

8.1.3. 关于进程控制器

进程控制器就是一个小型轻量级进程,它的作用是产生主机控制器进程并监控它的生命周期。如果主机控制器崩溃,进程控制器会对它进行重启。进程控制器还会根据主机控制器的指示启动服务器进程,但在崩溃时不会自动重启服务器进程。

进程控制器的日志被记录在 EAP_HOME/domain/log/process-controller.log 文件中。您可以在 EAP_HOME/bin/domain.conf 文件中使用 PROCESS_CONTROLLER_JAVA_OPTS 变量为进程控制器设置 JVM 选项。

8.1.4. 关于服务器组

服务器组就是一个作为一个整体被管理和配置的一组服务器实例集合。在一个受管域中,每个应用服务器实例都属于一个服务器组(即使它是唯一成员)。一个组中的服务器共享相同的配置集配置和部署内容。

域控制器和主机控制器在其域的每个服务器组的所有服务器实例上,强制标准配置的实施。

域由多个服务器组组成。不同的服务器组可以用不同的配置集和部署来进行配置。例如,域可以被配置为,使用不同的服务器层来提供不同服务。

不同的服务器组也可以有相同的配置集和部署。这样,就可以在一个服务器组中对应用程序进行升级,然后在第二个服务器组中进行更新,而不需要完全停止服务。

关于更多的信息,请参考配置服务器组章节。

8.1.5. 关于服务器

服务器代表一个应用服务器实例。在受管域里,所有的服务器实例都是服务器组的成员。主机控制器在自己的 JVM 进程里启动每个服务器实例。

关于更多的信息,请参考配置服务器 章节。

8.3. 启动受管域

8.3.1. 启动受管域

使用 JBoss EAP 提供的 domain.shdomain.bat 脚本可以启动域和主机控制器。如需了解这些启动脚本使用的完整参数列表,请使用 --help 参数,或参阅服务器运行时参数一节。

域控制器必须在域里任何服务器组的从服务器之前启动。首先启动域控制器,然后启动每个关联的主机控制器。

启动域控制器

使用为特定域控制器预配置的 host-master.xml 配置文件启动域控制器。

$ EAP_HOME/bin/domain.sh --host-config=host-master.xml

根据域的具体设置,您将需要进行额外的配置以允许主机控制器进行连接。请参考下面的域设置示例:

启动主机控制器

使用为从主机控制器预配置的 host-slave.xml 配置文件启动主机控制器。

$ EAP_HOME/bin/domain.sh  --host-config=host-slave.xml

根据您的域设置,您将需要进行额外的配置来连接域控制器并保证不冲突。请参考下面的域设置示例:

8.3.2. 配置域控制器

将主机配置为域控制器

如果主机在其 <domain-controller> 声明里包含 <local/> 元素,那它就被指定为域控制器。

<domain-controller>
  <local/>
</domain-controller>

作为域控制器的主机需要提供一个管理接口,在这个域中的其它主机需要可以访问到这个接口。虽然这个接口不需要是一个 HTTP(S) 管理接口,但我们推荐使用它来访问管理控制台。

<management-interfaces>
  <native-interface security-realm="ManagementRealm">
    <socket interface="management" port="${jboss.management.native.port:9999}"/>
  </native-interface>
  <http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
    <socket interface="management" port="${jboss.management.http.port:9990}"/>
  </http-interface>
</management-interfaces>

EAP_HOME/domain/configuration/host-master.xml 文件已用这些设置进行预配置以充当域控制器。

8.3.3. 配置主机控制器

连接域控制器

主机控制器需要可以连接到域控制台,从而在域中注册自己。这是通过配置中的 <domain-controller> 项进行配置的。

<domain-controller>
  <remote security-realm="ManagementRealm">
    <discovery-options>
      <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/>
    </discovery-options>
  </remote>
</domain-controller>

EAP_HOME/domain/configuration/host-slave.xml 文件已被预先进行了这些配置,从而使它可以连接到域控制器。在启动主机控制器时,需要提供 jboss.domain.master.address 属性。

$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml -Djboss.domain.master.address=IP_ADDRESS

关于域控制器发现的详情,请参考域控制器的发现和故障转移章节。

根据域设置,您可能会需要提供一个身份验证机制来使域控制器可以验证主机控制器。如需了解使用一个密码的值产生一个管理用户并使用这个值更新主机控制器配置的信息,请参阅在两台机器上设立受管域

8.3.3.1. 配置主机的名称

运行在一个受管域中的每个主机都需要有一个唯一的名称。为了简化管理并在多个主机上使用相同的配置文件,服务器会使用以下方法决定主机名。

  1. 如果设置,则是 host.xml 配置文件里的主机元素名称属性。
  2. jboss.host.name 系统属性的值。
  3. jboss.qualified.host.name 系统属性中最后一个 . 后面的值。如果没有 .,则使用这个值。
  4. 对于基于 POSIX 的操作系统,HOSTNAME 环境变量中 . 后面的值;对于 Microsoft Windows 系统, COMPUTERNAME 环境变量中 . 后面的值。如果没有 ., 使用整个值。

主机控制器的名称在相关的 host.xml 配置文件顶部的 host 元素里进行配置,例如:

<host xmlns="urn:jboss:domain:4.0" name="host1">

用管理 CLI 通过下列过程来更新主机名。

  1. 启动 JBoss EAP 主机控制器。

    $ EAP_HOME/bin/domain.sh --host-config=host-slave.xml
  2. 启动管理 CLI,连接到域控制器。

    $ EAP_HOME/bin/jboss-cli.sh --connect --controller=DOMAIN_CONTROLLER_IP_ADDRESS
  3. 使用下列命令来设置新的主机名。

    /host=EXISTING_HOST_NAME:write-attribute(name=name,value=NEW_HOST_NAME)

    这修改了 host-slave.xml 文件里的主机名属性:

    <host name="NEW_HOST_NAME" xmlns="urn:jboss:domain:4.0">
  4. 重载主机控制器使修改生效。

    reload --host=EXISTING_HOST_NAME

如果主机控制器没有在配置文件里设置名称,您也可以在运行时传入主机名。

$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml  -Djboss.host.name=HOST_NAME

8.3.4. 域控制器的发现和故障转移

当设置一个受管域时,每个主机控制器都需要被配置为需要和域控制器进行联系。在 JBoss EAP 中,每个主机控制器都可以配置多个选项来查找域控制器。主机控制器会尝试使用每个选项,直到可以成功联系到域控制器。

因此,主机控制器可以预配置一个备份域控制器的联系信息。当主域控制器出现问题时,一个备份域控制器就可以被升级为主域控制器,从而使主机控制器可以自动切换到新的域控制器。

下面是如何用多个选项配置主机控制器来寻找域控制器的例子。

示例:有多个域控制器选项的主机控制器

<domain-controller>
  <remote security-realm="ManagementRealm">
    <discovery-options>
      <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="172.16.81.100" port="${jboss.domain.master.port:9999}"/>
      <static-discovery name="backup" protocol="${jboss.domain.master.protocol:remote}" host="172.16.81.101" port="${jboss.domain.master.port:9999}"/>
    </discovery-options>
  </remote>
</domain-controller>

静态发现选项包含下列必需的属性:

name
这个域控制器发现选项的名称。
host
远程域控制器的主机名。
port
远程域控制器的端口。

在上面的例子里,第一个发现选项是我们期望可以成功的选项。第二个选项可以用在失效切换的场景里。

如果主域控制器出现问题,以 --backup 选项启动的主机控制器可以提升为域控制器。

注意

使用 --backup 选项启动一个主机控制器会在本地保存一个域配置信息。当主机控制器被预配置为作为一个域控制器使用时,这个配置会被使用。

提升主机控制器为域控制器
  1. 确保已停止原来的域控制器。
  2. 使用管理 CLI 命令来连接成为新的域控制器的主机控制器。
  3. 执行下列命令配置主机控制器成为新的域控制器。

    /host=HOST_NAME:write-local-domain-controller
  4. 执行下列命令来重载主机控制器。

    reload --host=HOST_NAME

主机控制器现在成为了域控制器。

8.4. 管理服务器

8.4.1. 配置服务器组

下面是一个服务器组定义的示例:

<server-group name="main-server-group" profile="full">
  <jvm name="default">
    <heap size="64m" max-size="512m"/>
  </jvm>
  <socket-binding-group ref="full-sockets"/>
  <deployments>
    <deployment name="test-application.war" runtime-name="test-application.war"/>
    <deployment name="jboss-helloworld.war" runtime-name="jboss-helloworld.war" enabled="false"/>
  </deployments>
</server-group>

服务器组可以用管理 CLI 或管理控制台的 Runtime 标签页进行配置。

添加服务器组

您可以使用下列管理 CLI 命令来添加服务器组。

/server-group=SERVER_GROUP_NAME:add(profile=PROFILE_NAME,socket-binding-group=SOCKET_BINDING_GROUP_NAME)
更新服务器组

您可以使用下列管理 CLI 命令来更新服务器组属性。

/server-group=SERVER_GROUP_NAME:write-attribute(name=ATTRIBUTE_NAME,value=VALUE)
删除服务器组

您可以使用下列管理 CLI 命令来删除服务器组。

/server-group=SERVER_GROUP_NAME:remove
服务器组属性

服务器组要求下列属性:

  • name:服务器组的名称。
  • profile:服务器配置集的名称。
  • socket-binding-group:用于组里的服务器的默认套接字绑定组。您可以对每个服务器进行覆盖。

服务器组包含下列可选属性:

  • management-subsystem-endpoint:当把它设置为 true 时,属于这个服务器组的服务器会使用它们的 remoting 子系统的端点来连接回主机控制器(这需要有 remoting 子系统)。
  • socket-binding-default-interface:这个服务器的套接字组的默认接口。
  • socket-binding-port-offset:添加至套接字绑定组指定的端口的偏移量。
  • deployments:部署在组里的服务器上的部署内容。
  • jvm:组中所有服务器的默认 JVM 设置。主机控制器会把这些设置和 host.xml 所提供的其它配置进行合并,组成启动服务器的 JVM 时使用的配置。
  • deployment-overlays:定义的部署覆盖和服务器组里的部署间的连接。
  • system-properties:对组里服务器设置的系统属性。

8.4.2. 配置服务器

定义三个服务器的默认 host.xml 配置:

<servers>
  <server name="server-one" group="main-server-group">
  </server>
  <server name="server-two" group="main-server-group" auto-start="true">
    <socket-bindings port-offset="150"/>
  </server>
  <server name="server-three" group="other-server-group" auto-start="false">
    <socket-bindings port-offset="250"/>
  </server>
</servers>

一个名为 server-one 的服务器实例和 main-server-group 相关联,并继承由那个服务器组所提供的子系统配置和套接字绑定。一个名为 server-two 的服务器实例也会和 main-server-group 相关联,但同时会定义一个套接字绑定 port-offset 的值,从而不会和 server-one 使用的端口值相冲突。一个名为 server-three 的服务器实例会和 other-server-group 相关联,并使用那个组的配置。它同时会定义一个 port-offset 值,并把 auto-start 设置为 false,从而在主机控制器启动时,这个服务器不会启动。

服务器可以用管理 CLI 或管理控制台的 Runtime 标签页进行配置。

添加服务器

您可以使用下列管理 CLI 命令来添加服务器。

/host=HOST_NAME/server-config=SERVER_NAME:add(group=SERVER_GROUP_NAME)
更新服务器

您可以使用下列管理 CLI 命令来更新服务器属性。

/host=HOST_NAME/server-config=SERVER_NAME:write-attribute(name=ATTRIBUTE_NAME,value=VALUE)
删除服务器

您可以使用下列管理 CLI 命令来删除服务器。

/host=HOST_NAME/server-config=SERVER_NAME:remove
服务器属性

服务器要求下列属性:

  • name:服务器的名称。
  • group:域模型里的服务器组的名称。

服务器包含下列可选属性:

  • auto-start:在主机服务器启动时这个服务器是否应该启动。
  • socket-binding-group:这个服务器所属的套接字绑定组。
  • socket-binding-port-offset:添加至这个服务器的套接字绑定组指定的端口值的偏移量。
  • update-auto-start-with-server-status:用服务器的状态更新 auto-start 属性。
  • interface:这个服务器上可用的网络接口的全限定名称列表。
  • jvm:这个服务器的 JVM 设置。如果未声明,这个设置将从父服务器组或主机继承。
  • path:文件系统路径的列表。
  • system-property:在这个服务器上设置的系统属性列表。

8.4.3. 启动和停止服务器

您可以进入管理控制台的 Runtime 标签页并选择合适的主机和服务器组来执行服务器操作,如启动、停止和重载。

请参考下列用管理 CLI 命令执行的操作。

启动服务器

您可以在特定的主机上启动单个服务器。

/host=HOST_NAME/server-config=SERVER_NAME:start

您也可以启动指定的服务器组里的所有服务器。

/server-group=SERVER_GROUP_NAME:start-servers
停止服务器

您可以停止特定主机上的单个服务器。

/host=HOST_NAME/server-config=SERVER_NAME:stop

您也可以停止指定的服务器组里的所有服务器。

/server-group=SERVER_GROUP_NAME:stop-servers
重载服务器

您可以重载特定主机上的单个服务器。

/host=HOST_NAME/server-config=SERVER_NAME:reload

您也可以重载指定的服务器组里的所有服务器。

/server-group=SERVER_GROUP_NAME:reload-servers

8.5. 管理域设置

8.5.1. 在单台机器上设立受管域

您可以用 jboss.domain.base.dir 属性在单台机器上运行多个主机控制器。

  1. 复制域控制器的 EAP_HOME/domain 目录。

    $ cp -r EAP_HOME/domain /path/to/domain1
  2. 复制主机控制器的 EAP_HOME/domain 目录。

    $ cp -r EAP_HOME/domain /path/to/host1
  3. /path/to/domain1 启动域控制器。

    $ EAP_HOME/bin/domain.sh --host-config=host-master.xml -Djboss.domain.base.dir=/path/to/domain1
  4. /path/to/host1 启动主机控制器。

    $ EAP_HOME/bin/domain.sh --host-config=host-slave.xml -Djboss.domain.base.dir=/path/to/host1 -Djboss.domain.master.address=IP_ADDRESS -Djboss.management.native.port=PORT
    注意

    在启动主机控制器时,您必须用 jboss.domain.master.address 属性指定域控制器的地址。

    另外,因此这个主机控制器和域控制器运行在同一个机器上,所以需要修改管理接口使它不会和域控制器的管理接口相冲突。这个命令会设置 jboss.management.native.port 属性。

使用这种方法启动的所有实例都会共享基础安装路径(例如,EAP_HOME/modules/)中的其它资源,但域配置是由 jboss.domain.base.dir 所指定的目录提供的。

8.5.2. 在两台机器上设立受管域

注意

要运行这个示例,您可能需要配置您的防火墙。

您可以在两台机器上创建受管域,其中一台是域控制器而另外一台是主机。详情请参考关于域控制器

  • IP1 = 域控制器(机器 1)的 IP 地址
  • IP2 = 主机(机器 2)的 IP 地址
在两台机器上创建受管域
  1. 在机器 1 上

    1. 添加一个管理域用户以让主机可以被域控制器验证。

      使用 add-user.sh 脚本为主机控制器(HOST_NAME)添加管理用户。为最后一个提示回答 yes,并记录下系统提供的保密值(<secret value="SECRET_VALUE" />)。这个保密值会用于主机控制器的配置。

    2. 启动域控制器。

      指定为域控制器专门预配置的 host-master.xml 配置文件。而且设置 jboss.bind.address.management 属性使域控制器为其他机器可见。

      $ EAP_HOME/bin/domain.sh --host-config=host-master.xml -Djboss.bind.address.management=IP1
  2. 在机器 2 上

    1. 使用用户凭证更新主机的配置。

      编辑 EAP_HOME/domain/configuration/host-slave.xml 并设置主机名(HOST_NAME)和秘密值(SECRET_VALUE)。

      <host xmlns="urn:jboss:domain:1.6" name="HOST_NAME">
        <management>
          <security-realms>
            <security-realm name="ManagementRealm">
              <server-identities>
                <secret value="SECRET_VALUE" />
              </server-identities>
              ...
    2. 启动主机控制器。

      指定为从主机控制器专门预配置的 host-slave.xml 配置文件。而且设置 jboss.domain.master.address 属性以连接域控制器并设置 jboss.bind.address 属性来指定主机控制器绑定地址。

      $ EAP_HOME/bin/domain.sh --host-config=host-slave.xml  -Djboss.domain.master.address=IP1  -Djboss.bind.address=IP2

现在,您可以在启动时用 --controller 参数指定域控制器地址。这样,就可以通过管理 CLI 对域进行管理。

$ EAP_HOME/bin/jboss-cli.sh --connect --controller=IP1

或者您可以通过管理控制台管理域:http://IP1:9990

8.6. 管理 JBoss EAP 配置集

8.6.1. 关于配置集

JBoss EAP 使用配置集(Profile)来设置服务器可用的子系统。配置集由可用子系统的集合以及每个子系统的专有配置组成。带有大量子系统的配置集可以让服务器具有强大的功能集合;而带有少量专有子系统的配置集则使得服务器功能较少,但消耗的资源也较少。

JBoss EAP comes with four predefined profiles that should satisfy most use cases:

default
包括常用的子系统,如 loggingsecuritydatasourcesinfinispanwebserviceseeejb3transactions 等。
ha
包含 default 配置集里提供的子系统,以及 jgroupsmodcluster 子系统来提供高可用性。
full
包含 default 配置集里提供的子系统,以及 messaging-activemqiiop-openjdk 子系统。
full-ha
包含 full 配置集里提供的子系统,以及 jgroupsmodcluster 子系统来提供高可用性。
注意

JBoss EAP 提供了通过从现有配置集里删除子系统来禁用扩展或手动卸载驱动和其他服务的能力。然而,多数情况下这是没有必要的。既然 JBoss EAP 是在有需要时才动态地加载子系统,如果服务器或应用程序从未使用某个子系统,它就不会被加载。

当现有的配置集不能提供必要的功能时,JBoss EAP 也提供了定义自定义配置集的能力。

8.6.2. 克隆配置集

JBoss EAP 允许您通过克隆现有的配置集在受管域里创建新的配置集。这将创建原始配置集的配置和子系统的备份。

配置集可以用管理 CLI 或 clone 操作进行克隆。

/profile=full-ha:clone(to-profile=cloned-profile)

您也可以在管理控制台里选择所需的配置集并点击 Clone 来克隆配置集。

8.6.3. 创建分层的配置集

在受管域里,您可以创建分层的配置集。这允许您创建具有其他配置可以继承的公用扩展的基础配置集。

受管域在 domain.xml 里定义了几个配置集。如果多个配置集使用了特定子系统的相同配置,您可以只在一个地方而不是在不同的配置集里进行配置。这可用于不能被覆盖的父配置集里。

通过管理 CLI 的 list-add 操作,配置集可以包含多层的配置集。

/profile=new-profile:list-add(name=includes, value=PROFILE_NAME)