22.6. mod_cluster HTTP Connector
mod_cluster 连接器是基于 Apache HTTP 服务器的负载均衡器。它使用通信通道将请求从 Apache HTTP 服务器转发到一组应用服务器节点。
与其他连接器相比,mod_cluster 连接器具有多个优点。
- mod_cluster 管理协议(MCMP)是 JBoss EAP 服务器和启用了 mod_cluster 模块的 Apache HTTP 服务器之间的额外连接。JBoss EAP 服务器使用它来通过自定义 HTTP 方法将因素和生命周期事件传输至 Apache HTTP 服务器。
- 使用 mod_cluster 的 Apache HTTP 服务器的动态配置允许 JBoss EAP 服务器在不手动配置的情况下加入负载平衡安排。
- JBoss EAP 执行负载平衡因素计算,而不依赖于带有 mod_cluster 的 Apache HTTP 服务器。这使得负载平衡指标比其他连接器更准确。
- mod_cluster 连接器提供精细的应用程序生命周期控制。每个 JBoss EAP 服务器都将 Web 应用程序上下文生命周期事件转发到 Apache HTTP 服务器,通知它启动或停止给定上下文的路由请求。这可防止最终用户因为资源不可用而看到 HTTP 错误。
- 可以使用 AJP、HTTP 或 HTTPS 传输。
有关 modcluster
子系统的特定配置选项的详情,请查看 ModCluster subsystem 属性。
22.6.1. 在 Apache HTTP 服务器中配置 mod_cluster 复制链接链接已复制到粘贴板!
安装 JBoss Core Services Apache HTTP 服务器或使用 JBoss Web 服务器时,mod_cluster 模块已经包含在内,默认情况下会加载。
自版本 3.1.0 起,Apache HTTP 服务器不再与 JBoss Web Server 一起分发。
请参阅以下步骤来配置 mod_cluster 模块以适合您的环境。
红帽客户还可以使用红帽客户门户上的 Load Balancer 配置工具,快速为 mod_cluster 和其他连接器生成最佳配置模板。请注意,您必须登录才能访问此工具。
配置 mod_cluster
Apache HTTP 服务器已经包含 mod_cluster 配置文件 mod_cluster.conf
,它会加载 mod_cluster 模块并提供基本配置。此文件中的 IP 地址、端口和其他设置(如下所示)可以配置为适合您的需求。
Apache HTTP 服务器服务器配置为负载平衡器,并可搭配 JBoss EAP 上运行的 modcluster
子系统。您必须配置 mod_cluster worker 节点,使 JBoss EAP 知道 mod_cluster。
如果要为 mod_cluster 禁用广告并配置静态代理列表,请参阅 mod_cluster 的禁用公告。有关 Apache HTTP 服务器中的可用 mod_cluster 配置选项的更多信息,请参阅 Apache HTTP Server mod_cluster Directives
有关配置 mod_cluster 的详情,请参阅 JBoss Web Server HTTP Connectors 和 Load Balancing Guide 中的 Configure Load Balancing using Apache HTTP Server and mod_cluster 部分。
22.6.2. 为 mod_cluster 禁用广告 复制链接链接已复制到粘贴板!
默认情况下,modcluster 子系统的负载平衡器使用多播 UDP 向后台工作程序公告其可用性。您可以按照以下步骤禁用广告并使用代理列表。
以下流程中的管理 CLI 命令假设您使用受管域中的 full-ha
配置文件。如果您使用 full-ha
以外的配置集,请在命令中使用适当的配置集名称。如果您正在运行独立服务器,请完全删除 /profile=full-ha
。
修改 Apache HTTP 服务器配置。
编辑
httpd.conf
Apache HTTP 服务器配置文件。使用EnableMCPMReceive
指令,对侦听 MCPM 请求的虚拟主机进行以下更新。添加 指令以禁用服务器公告。
将
ServerAdvertise
指令设置为Off
以禁用服务器广告。ServerAdvertise Off
ServerAdvertise Off
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 禁用公告频率。
如果您的配置指定了
AdvertiseFrequency
参数,请使用#
字符注释掉它。AdvertiseFrequency 5
# AdvertiseFrequency 5
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用接收 MCPM 消息的功能。
确保存在
EnableMCPMReceive
指令,以允许 Web 服务器从 worker 节点接收 MCPM 消息。EnableMCPMReceive
EnableMCPMReceive
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在 JBoss EAP
modcluster
子系统中禁用广播。使用以下管理 CLI 命令禁用广告。
/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=advertise,value=false)
/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=advertise,value=false)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要确保继续下一步以提供代理列表。如果代理列表为空,则不会禁用广告。
在 JBoss EAP
modcluster
子系统中提供代理列表。需要提供代理列表,因为
modcluster
子系统将无法自动发现代理(如果广播被禁用)。首先,在适当的套接字绑定组中定义出站套接字绑定。
/socket-binding-group=full-ha-sockets/remote-destination-outbound-socket-binding=proxy1:add(host=10.33.144.3,port=6666) /socket-binding-group=full-ha-sockets/remote-destination-outbound-socket-binding=proxy2:add(host=10.33.144.1,port=6666)
/socket-binding-group=full-ha-sockets/remote-destination-outbound-socket-binding=proxy1:add(host=10.33.144.3,port=6666) /socket-binding-group=full-ha-sockets/remote-destination-outbound-socket-binding=proxy2:add(host=10.33.144.1,port=6666)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接下来,将代理添加到 mod_cluster 配置中。
/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration:list-add(name=proxies,value=proxy1) /profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration:list-add(name=proxies,value=proxy2)
/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration:list-add(name=proxies,value=proxy1) /profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration:list-add(name=proxies,value=proxy2)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Apache HTTP 服务器负载均衡器不再公告其对 worker 节点的存在,不再使用 UDP 多播。
22.6.3. 配置 mod_cluster Worker 节点 复制链接链接已复制到粘贴板!
mod_cluster 工作节点由 JBoss EAP 服务器组成。此服务器可以是单机服务器,也可以是受管域中的服务器组的一部分。在 JBoss EAP 中运行一个单独的进程,它管理集群的所有 worker 节点。这称为 master。
受管域中的 worker 节点在服务器组之间共享相同的配置。作为独立服务器的 worker 节点会单独配置。否则,配置步骤是相同的。
- 单机服务器必须使用 standalone-ha 或 standalone-full-ha 配置文件启动。
- 受管域中的服务器组必须使用 ha 或 full-ha 配置文件,以及 ha-sockets 或 full-ha-sockets 套接字绑定组。JBoss EAP 附带了一个名为 other-server-group 的群集式服务器组,可满足这些要求。
配置 Worker 节点
此流程中的管理 CLI 命令假定您使用具有 full-ha
配置集的受管域。如果您正在运行独立服务器,请删除命令的 /profile=full-ha
部分。
配置网络接口。
默认情况下,网络接口默认为
127.0.0.1
。托管单机服务器或服务器组中的一个服务器的每个物理主机都需要将其接口配置为使用其公共 IP 地址,而其他服务器可以查看它们。根据您的环境,使用以下管理 CLI 命令修改
管理
、公共
和不安全
接口的外部 IP 地址。务必将 命令中的EXTERNAL_IP_ADDRESS
替换为主机的实际外部 IP 地址。/interface=management:write-attribute(name=inet-address,value="${jboss.bind.address.management:EXTERNAL_IP_ADDRESS}") /interface=public:write-attribute(name=inet-address,value="${jboss.bind.address.public:EXTERNAL_IP_ADDRESS}") /interface=unsecure:write-attribute(name=inet-address,value="${jboss.bind.address.unsecure:EXTERNAL_IP_ADDRESS}")
/interface=management:write-attribute(name=inet-address,value="${jboss.bind.address.management:EXTERNAL_IP_ADDRESS}") /interface=public:write-attribute(name=inet-address,value="${jboss.bind.address.public:EXTERNAL_IP_ADDRESS}") /interface=unsecure:write-attribute(name=inet-address,value="${jboss.bind.address.unsecure:EXTERNAL_IP_ADDRESS}")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新加载服务器。
reload
reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置主机名。
为参与受管域的每个主机设置唯一的主机名。此名称必须在从间是唯一的,并将用于识别集群的从设备,因此记录您使用的名称。
使用适当的
host.xml
配置文件启动 JBoss EAP 从主机。EAP_HOME/bin/domain.sh --host-config=host-slave.xml
$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下管理 CLI 命令设置唯一的主机名。本例使用
slave1
作为新的主机名。/host=EXISTING_HOST_NAME:write-attribute(name=name,value=slave1)
/host=EXISTING_HOST_NAME:write-attribute(name=name,value=slave1)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关配置主机名的更多信息 ,请参阅配置主机名。
配置每个主机以连接到域控制器。
注意此步骤不适用于独立服务器。
对于需要加入受管域的新配置主机,您必须删除 local 元素,并添加指向域控制器的远程元素 host 属性。
使用适当的
host.xml
配置文件启动 JBoss EAP 从主机。EAP_HOME/bin/domain.sh --host-config=host-slave.xml
$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下管理 CLI 命令配置域控制器设置:
/host=SLAVE_HOST_NAME:write-remote-domain-controller(host=DOMAIN_CONTROLLER_IP_ADDRESS,port=${jboss.domain.master.port:9999},security-realm="ManagementRealm")
/host=SLAVE_HOST_NAME:write-remote-domain-controller(host=DOMAIN_CONTROLLER_IP_ADDRESS,port=${jboss.domain.master.port:9999},security-realm="ManagementRealm")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会修改 host-slave.xml 文件中的 XML,如下所示:
<domain-controller> <remote host="DOMAIN_CONTROLLER_IP_ADDRESS" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm"/> </domain-controller>
<domain-controller> <remote host="DOMAIN_CONTROLLER_IP_ADDRESS" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm"/> </domain-controller>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息 ,请参阅连接到域控制器。
为每个从主机配置身份验证。
每个从服务器都需要在域控制器或独立主服务器 ManagementRealm 中创建的用户名和密码。在域控制器或独立 master 上,为每个主机运行
EAP_HOME/bin/add-user.sh
命令。使用与从主机名匹配的用户名为每个主机添加管理用户。请务必对最后一个问题回答
yes
,要求"此新用户是否要用于一个 AS 进程以连接到另一个 AS 进程?",以便您以机密值的形式提供。add-user 脚本输出示例 (修剪)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 复制从此输出提供的 Base64 编码的 secret 值(
SECRET_VALUE
),它可以在下一步中使用。如需更多信息,请参阅 JBoss EAP 如何配置服务器安全 指南中的 将用户添加到主域控制器 部分。
修改从属主机的安全域,以使用新的身份验证。
您可以通过在服务器配置中设置 secret 值、从密码库获取密码或将密码用作系统属性来指定密码。
使用管理 CLI 在服务器配置文件中指定 Base64 编码的密码值。
使用以下管理 CLI 命令来指定 secret 值。务必将
SECRET_VALUE
替换为从上一步中返回的 add-user 输出的 secret 值。/host=SLAVE_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="SECRET_VALUE")
/host=SLAVE_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="SECRET_VALUE")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您需要重新加载服务器。
--host
参数不适用于单机服务器。reload --host=HOST_NAME
reload --host=HOST_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅配置 Slave Controller 以使用 JBoss EAP 如何配置服务器安全 指南中的凭据 部分。
配置主机以从密码库获取密码。
使用
EAP_HOME/bin/vault.sh
脚本生成屏蔽的密码。它将生成格式为VAULT::secret::password::VAULT_SECRET_VALUE
的字符串,例如:VAULT::secret::password::ODVmYmJjNGMtZDU2ZC00YmNlLWE4ODMtZjQ1NWNmNDU4ZDc1TElORV9CUkVBS3ZhdWx0.
VAULT::secret::password::ODVmYmJjNGMtZDU2ZC00YmNlLWE4ODMtZjQ1NWNmNDU4ZDc1TElORV9CUkVBS3ZhdWx0.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在密码库中创建密码时,必须以纯文本而不是 Base64 编码的指定。
使用以下管理 CLI 命令来指定 secret 值。务必将
VAULT_SECRET_VALUE
替换为上一步中生成的已屏蔽密码。/host=master/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${VAULT::secret::password::VAULT_SECRET_VALUE}")
/host=master/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${VAULT::secret::password::VAULT_SECRET_VALUE}")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您需要重新加载服务器。
--host
参数不适用于单机服务器。reload --host=HOST_NAME
reload --host=HOST_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅 JBoss EAP 如何配置服务器安全指南 中的密码 Vault 部分。
将密码指定为系统属性。
以下示例使用
server.identity.password
作为密码的系统属性名称。在服务器配置文件中指定密码的系统属性。
使用以下管理e CLI 命令,将机密身份配置为使用系统属性:
/host=SLAVE_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${server.identity.password}")
/host=SLAVE_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${server.identity.password}")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您需要重新加载服务器。
--host
参数不适用于单机服务器。reload --host=master
reload --host=master
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在启动服务器时设置系统属性的密码。
您可以通过将
server.identity.password
系统属性作为命令行参数或在属性文件中传递来设置。以纯文本命令行参数形式传递。
启动服务器并传递
server.identity.password
属性。EAP_HOME/bin/domain.sh --host-config=host-slave.xml -Dserver.identity.password=changeme
$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml -Dserver.identity.password=changeme
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告密码必须以纯文本形式输入,并将对发出
ps -ef
命令的任何人可见。在属性文件中设置 属性。
创建一个属性文件,并将键/值对添加到属性文件中,例如:
server.identity.password=changeme
server.identity.password=changeme
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告密码以纯文本形式,对有权访问此属性文件的任何人都可见。
使用命令行参数启动服务器。
EAP_HOME/bin/domain.sh --host-config=host-slave.xml --properties=PATH_TO_PROPERTIES_FILE
$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml --properties=PATH_TO_PROPERTIES_FILE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
重新启动服务器。
现在,从设备将使用其主机名作为用户名以及加密字符串作为其密码验证到主设备。
您的单机服务器或受管域的服务器组中的服务器现在配置为 mod_cluster worker 节点。如果您部署了集群应用,其会话将复制到所有集群节点以进行故障转移,并且可以接受来自外部 Web 服务器或负载均衡器的请求。默认情况下,集群的每个节点都使用自动发现来发现其他节点。
22.6.4. 配置 mod_cluster fail_on_status Parameter 复制链接链接已复制到粘贴板!
fail_on_status
参数列出了这些 HTTP 状态代码(由集群中的 worker 节点返回)会将该节点标记为失败。然后,负载均衡器会将将来的请求发送到集群中的另一个 worker 节点。失败的 worker 节点将保持 NOTOK
状态,直到它向负载均衡器发送 STATUS
信息。
fail_on_status
参数不能与 Hewlett-Packard 中的 HP-UX v11.3 hpws httpd B.2.2.15.15 一起使用,因为它不支持该功能。
fail_on_status
参数必须在负载均衡器的 httpd
配置文件中配置。fail_on_status
的多个 HTTP 状态代码可指定为用逗号分开的列表。以下示例为 fail_on_status
. 指定 HTTP 状态代码 203
和 204
。
fail_on_status 配置示例
ProxyPass / balancer://MyBalancer stickysession=JSESSIONID|jsessionid nofailover=on failonstatus=203,204 ProxyPassReverse / balancer://MyBalancer ProxyPreserveHost on
ProxyPass / balancer://MyBalancer stickysession=JSESSIONID|jsessionid nofailover=on failonstatus=203,204
ProxyPassReverse / balancer://MyBalancer
ProxyPreserveHost on
22.6.5. 在集群间迁移流量 复制链接链接已复制到粘贴板!
使用 JBoss EAP 创建新集群后,您可以在升级过程过程中将流量从上一集群迁移到新集群。在此任务中,您将看到可用于以最少的中断或停机时间迁移此流量的策略。
- 新集群设置:(我们将调用此集群: ClusterNEW)。
- 要实现冗余的旧集群设置(我们将调用此群集: ClusterOLD)。
集群的升级过程 - 负载均衡组
- 使用先决条件中介绍的步骤设置新集群。
在 ClusterNEW 和 ClusterOLD 中,确保配置选项
sticky-session
设为true
(此选项默认设置为true
)。启用这个选项意味着对任何集群中集群节点的所有新请求都将继续进入对应的集群节点。/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=sticky-session,value=true)
/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=sticky-session,value=true)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
load-balancing-group
设置为ClusterOLD
,假设 ClusterOLD 中的所有集群节点都是 ClusterOLD 负载均衡组的成员。/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=load-balancing-group,value=ClusterOLD)
/profile=full-ha/subsystem=modcluster/mod-cluster-config=configuration/:write-attribute(name=load-balancing-group,value=ClusterOLD)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Configure a mod_cluster Worker Node 部分所述的流程,将 ClusterNEW 中的节点分别添加到 mod_cluster 配置中。另外,使用上述过程,并将其负载平衡组设置为 ClusterNEW。
此时,您可以在 mod_cluster-manager 控制台中看到与上述短例类似的输出:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ClusterOLD 组中有旧的活跃会话,并在 ClusterOLD 或 CLusterNEW 组中创建新的会话。接下来,我们希望禁用整个 ClusterOLD 组,因此我们可以关闭其集群节点,而不会导致当前活跃的客户端的会话出现错误。
在 mod_cluster-manager web 控制台中,单击 LBGroup ClusterOLD 的 Disable Nodes 链接。
从此时,只有属于已建立的会话的请求才会路由到 ClusterOLD 负载平衡组的成员。任何新客户端的会话都会在 ClusterNEW 组中创建。当 ClusterOLD 组中没有活动会话后,我们就可以安全地删除其成员。
注意使用 Stop Nodes 将命令负载均衡器停止将任何请求立即路由到这个域。这将强制故障转移到另一个负载平衡组,这会使会话数据丢失到客户端,只要 ClusterNEW 和 ClusterOLD 之间没有会话复制。
默认负载平衡组
如果当前的 ClusterOLD 设置不包含任何负载均衡组设置(一个可以看到 LBGroup:,在 mod_cluster-manager 控制台中),仍然可以利用禁用 ClusterOLD 节点。在本例中,单击每个 ClusterOLD 节点的 Disable Contexts。这些节点的上下文将被禁用,并且当没有活动会话时,它们将准备好删除。只有在本示例中启用了上下文(假定为 ClusterNEW 成员)的节点上,才会创建新的客户端的会话。
使用管理 CLI
除了使用 mod_cluster-manager Web 控制台外,您还可以使用 JBoss EAP 管理 CLI 停止或禁用特定上下文。
停止上下文
/host=master/server=server-one/subsystem=modcluster:stop-context(context=/my-deployed-application-context, virtualhost=default-host, waittime=0)
/host=master/server=server-one/subsystem=modcluster:stop-context(context=/my-deployed-application-context, virtualhost=default-host, waittime=0)
停止将 waittime
设为 0
的上下文(代表没有超时),指示均衡停止向其立即路由任何请求,这会强制故障转移到另一个可用上下文。
如果您使用 waittime
参数设置超时值,则不会在此上下文中创建新的会话,但现有会话将继续定向到这个节点,直到它们完成或指定的超时已过后。waittime
参数默认为 10
秒。
禁用上下文
/host=master/server=server-one/subsystem=modcluster:disable-context(context=/my-deployed-application-context, virtualhost=default-host)
/host=master/server=server-one/subsystem=modcluster:disable-context(context=/my-deployed-application-context, virtualhost=default-host)
禁用上下文会告知负载均衡器在这个上下文中不应创建新的会话。