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 子系统属性。
22.6.1. 在 Apache HTTP 服务器中配置 mod_cluster 复制链接链接已复制到粘贴板!
安装 JBoss Core Services Apache HTTP Server 或使用 JWS 时,已包括 mod_cluster 模块,默认被加载。
从版本 3.1.0 开始,Apache HTTP 服务器不再发布 JWS。
请参阅以下步骤来配置 mod_cluster 模块以适合您的环境。
红帽客户还可以在红帽客户门户网站上使用 Load Balancer Configuration Tool,快速为 mod_cluster 和其他连接器生成最佳配置模板。请注意,您必须登录才能访问此工具。
配置 mod_cluster
Apache HTTP 服务器已包含 mod_cluster 配置文件 mod_cluster.conf,该文件加载 mod_cluster 模块并提供基本配置。此文件中的 IP 地址、端口和其他设置可以进行配置,以满足您的需要。
# mod_proxy_balancer should be disabled when mod_cluster is used
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule advertise_module modules/mod_advertise.so
MemManagerFile cache/mod_cluster
<IfModule manager_module>
Listen 6666
<VirtualHost *:6666>
<Directory />
Require ip 127.0.0.1
</Directory>
ServerAdvertise on
EnableMCPMReceive
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Require ip 127.0.0.1
</Location>
</VirtualHost>
</IfModule>
Apache HTTP 服务器服务器配置为负载平衡器,并可与 JBoss EAP 上运行的 modcluster 子系统一起使用。您必须配置 mod_cluster worker 节点,使 JBoss EAP 知道 mod_cluster。
如果要禁用 mod_cluster 的广告并配置静态代理列表,请参阅 为 mod_cluster 禁用 广告。有关 Apache HTTP 服务器中的可用 mod_cluster 配置选项的更多信息,请参阅 Apache HTTP 服务器 mod_cluster 指令
有关配置 mod_cluster 的详情,请参阅 JWS HTTP Connectors 和 Load Balancing Guide 中的 Configure Load Balancing using Apache HTTP Server and mod_cluster 部分。
22.6.2. 为 mod_cluster 禁用广告 复制链接链接已复制到粘贴板!
默认情况下,mod cluster 子系统的均衡器使用多播 UDP 将其可用性公告给后台工作程序。您可以禁用广告并使用代理列表,而是使用以下流程。
以下流程中的管理 CLI 命令假设您在受管域中使用 full-ha 配置文件。如果您使用 full-ha 以外的配置文件,请在命令中使用适当的配置文件名称。如果您正在运行单机服务器,请完全删除 /profile=full-ha。
修改 Apache HTTP 服务器配置。
编辑
httpd.confApache HTTP 服务器配置文件。使用EnableMCPMReceive指令,对侦听 MCPM 请求的虚拟主机进行以下更新。添加 指令来禁用服务器公告。
将
ServerAdvertise指令设置为Off以禁用服务器公告。ServerAdvertise Off禁用广播频率。
如果您的配置指定了
AdvertiseFrequency参数,请使用#字符注释掉它。# AdvertiseFrequency 5启用接收 MCPM 消息的功能。
确保
EnableMCPMReceive指令存在,以允许 web 服务器从 worker 节点接收 MCPM 信息。EnableMCPMReceive
禁用 JBoss EAP
modcluster子系统中的广告。使用以下管理 CLI 命令禁用广告:
/profile=full-ha/subsystem=modcluster/proxy=default:write-attribute(name=advertise,value=false)重要确保继续执行下一步,以提供代理列表。如果代理列表为空,则不会禁用广告。
在 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)接下来,将代理添加到 mod_cluster 配置中。
/profile=full-ha/subsystem=modcluster/proxy=default:list-add(name=proxies,value=proxy1) /profile=full-ha/subsystem=modcluster/proxy=default:list-add(name=proxies,value=proxy2)
Apache HTTP 服务器均衡器不再向 worker 节点公告其存在,并且不再使用 UDP 多播。
22.6.3. 配置 mod_cluster worker 节点 复制链接链接已复制到粘贴板!
mod_cluster 工作程序节点由 JBoss EAP 服务器组成。此服务器可以是单机服务器,也可以是受管域中的服务器组的一部分。一个单独的进程在 JBoss EAP 中运行,用于管理集群的所有 worker 节点。这称为受管域或单机服务器中的主设备。
受管域中的 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}")重新加载服务器。
reload配置主机名。
为参与受管域的每个主机设置唯一的主机名。此名称在第二项之间必须是唯一的,并且将用于标识到集群的次要名称,因此请记录您使用的名称。
使用适当的
host.xml配置文件启动 JBoss EAP 次要主机。$ EAP_HOME/bin/domain.sh --host-config=host-secondary.xml使用以下管理 CLI 命令设置唯一主机名:本例使用
secondary1作为新主机名。/host=EXISTING_HOST_NAME:write-attribute(name=name,value=secondary1)有关配置主机名的更多信息 ,请参阅配置主机的名称。
配置每个主机以连接到域控制器。
注意此步骤不适用于单机服务器。
+ 对于需要加入受管域的新建主机,您必须删除 local 元素,并添加指向域控制器的 remote element host 属性。
+ ..使用适当的
host.xml配置文件启动 JBoss EAP 次要主机。+
$ EAP_HOME/bin/domain.sh --host-config=host-secondary.xml使用以下管理 CLI 命令配置域控制器设置:
/host=SECONDARY_HOST_NAME:write-remote-domain-controller(host=DOMAIN_CONTROLLER_IP_ADDRESS,port=${jboss.domain.primary.port:9990},security-realm="ManagementRealm")这会修改 host-secondary.xml 文件中的 XML,如下所示:
<domain-controller> <remote host="DOMAIN_CONTROLLER_IP_ADDRESS" port="${jboss.domain.primary.port:9990}" security-realm="ManagementRealm"/> </domain-controller>如需更多信息,请参阅主机控制器配置。
为每个次要主机配置身份验证。
每个次要服务器都需要在域控制器的主或独立 master ManagementRealm 中创建的用户名和密码。在域控制器主或单机 master上,为每个主机运行
EAP_HOME/bin/add-user.sh命令。为每个主机添加一个管理用户,其用户名与二级主机名匹配。务必在最后一个问题上回答
yes,要求"此新用户将用于一个 AS 进程来连接到另一个 AS 进程?",以便您提供 secret 值。示例:
add-user.shScript Output (trimmed)$ EAP_HOME/bin/add-user.sh What type of user do you wish to add? a) Management User (mgmt-users.properties) b) Application User (application-users.properties) (a): a Username : secondary1 Password : changeme Re-enter Password : changeme What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]: About to add user 'secondary1' for realm 'ManagementRealm' Is this correct yes/no? yes Is this new user going to be used for one AS process to connect to another AS process? e.g. for a secondary host controller connecting to the primary or for a Remoting connection for server to server {JEB} calls. yes/no? yes To represent the user add the following to the server-identities definition <secret value="SECRET_VALUE" />复制此输出中提供的 Base64 编码的 secret 值,
SECRET_VALUE可以在下一步中使用。如需更多信息,请参阅 JBoss EAP 如何配置服务器安全 指南中的 主域控制器 部分。
修改次要主机的安全域,以使用新的身份验证。
您可以通过在服务器配置中设置 secret 值、从凭证存储或 vault 获取密码,或者将密码作为系统属性传递来指定密码。
使用管理 CLI 在服务器配置文件中指定 Base64 编码的密码值。
使用以下管理 CLI 命令来指定 secret 值。务必将
SECRET_VALUE替换为上一步中 add-user 输出返回的 secret 值。/host=SECONDARY_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="SECRET_VALUE")您需要重新加载服务器。
--host参数不适用于单机服务器。reload --host=HOST_NAME如需更多信息,请参阅配置 二级控制器以使用 JBoss EAP 如何配置服务器安全 指南中的凭证 部分。
配置主机,以从凭据存储中获取密码。
如果您在凭证存储中存储了 secret 值,您可以使用以下命令将服务器 secret 设置为凭证存储中的值:
/host=SECONDARY_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(credential-reference={store=STORE_NAME,alias=ALIAS}您需要重新加载服务器。
--host参数不适用于单机服务器。reload --host=HOST_NAME如需更多信息,请参阅 JBoss EAP 如何配置服务器安全 指南中的 凭据存储 部分。
配置主机,以从密码库获取密码。
使用
EAP_HOME/bin/vault.sh脚本生成屏蔽的密码。它将以VAULT::secret::password::VAULT_SECRET_VALUE格式生成一个字符串,例如:VAULT::secret::password::ODVmYmJjNGMtZDU2ZC00YmNlLWE4ODMtZjQ1NWNmNDU4ZDc1TElORV9CUkVBS3ZhdWx0.注意在密码库中创建密码时,必须以纯文本形式指定密码,而不是以 Base64 编码的。
使用以下管理 CLI 命令来指定 secret 值。务必将
VAULT_SECRET_VALUE替换为上一步中生成的已屏蔽密码。/host=primary/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${VAULT::secret::password::VAULT_SECRET_VALUE}")您需要重新加载服务器。
--host参数不适用于单机服务器。reload --host=HOST_NAME如需更多信息,请参阅 JBoss EAP 如何配置服务器安全 指南中的 密码库 部分。
将密码指定为系统属性。
以下示例使用
server.identity.password作为密码的系统属性名称。在服务器配置文件中指定密码的系统属性。
使用以下管理 CLI 命令,将 secret 身份配置为使用系统属性。
/host=SECONDARY_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${server.identity.password}")您需要重新加载服务器。
--host参数不适用于单机服务器。reload --host=primary在启动服务器时为系统属性设置密码。
您可以通过将
server.identity.password系统属性传递为命令行参数或属性文件来设置 server.identity.password 系统属性。将 传递为纯文本命令行参数。
启动服务器并传递
server.identity.password属性。$ EAP_HOME/bin/domain.sh --host-config=host-secondary.xml -Dserver.identity.password=changeme警告密码必须以纯文本形式输入,并对发出
ps -ef命令的人员可见。在属性文件中设置 属性。
创建属性文件,并将键/值对添加到属性文件中,例如:
server.identity.password=changeme警告密码采用纯文本,将对有权访问此属性文件的任何人可见。
+ 使用命令行参数启动服务器。
+
$ EAP_HOME/bin/domain.sh --host-config=host-secondary.xml --properties=PATH_TO_PROPERTIES_FILE
重新启动服务器。
现在,次要将使用主机名作为用户名以及加密字符串作为其密码来向主要进行身份验证。
您的单机服务器或受管域中的服务器现在配置为 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 参数必须在负载均衡器的 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
22.6.5. 在集群间迁移流量 复制链接链接已复制到粘贴板!
使用 JBoss EAP 创建新集群后,您可以将流量从上一集群迁移到升级过程中的新集群。在此任务中,您将看到可用于迁移此流量的策略,且停机时间最小。
- 新的集群设置。我们会调用此集群 ClusterNEW。
- 被冗余的旧集群设置。我们将调用此集群 ClusterOLD。
集群的升级过程 - 负载平衡组
- 使用先决条件中描述的步骤设置您的新集群。
在 ClusterNEW 和 ClusterOLD 中,确保配置选项
sticky-session设置为true的默认设置。启用此选项意味着对任何集群中集群节点进行的所有新请求都将继续进入相应的集群节点。/profile=full-ha/subsystem=modcluster/proxy=default:write-attribute(name=sticky-session,value=true)将
load-balancing-group设置为ClusterOLD,假设 ClusterOLD 中的所有集群节点都是 ClusterOLD 负载均衡组的成员。/profile=full-ha/subsystem=modcluster/proxy=default:write-attribute(name=load-balancing-group,value=ClusterOLD)使用 Configure a mod_cluster Worker Node 部分中描述的流程将 ClusterNEW 中的节点单独添加到 mod_cluster 配置中。另外,使用上述过程并将其负载平衡组设置为 ClusterNEW。
此时,您可以在 mod_cluster-manager 控制台中看到与上述简短示例类似的输出:
mod_cluster/<version> LBGroup ClusterOLD: [Enable Nodes] [Disable Nodes] [Stop Nodes] Node node-1-jvmroute (ajp://node1.oldcluster.example:8009): [Enable Contexts] [Disable Contexts] [Stop Contexts] Balancer: qacluster, LBGroup: ClusterOLD, Flushpackets: Off, ..., Load: 100 Virtual Host 1: Contexts: /my-deployed-application-context, Status: ENABLED Request: 0 [Disable] [Stop] Node node-2-jvmroute (ajp://node2.oldcluster.example:8009): [Enable Contexts] [Disable Contexts] [Stop Contexts] Balancer: qacluster, LBGroup: ClusterOLD, Flushpackets: Off, ..., Load: 100 Virtual Host 1: Contexts: /my-deployed-application-context, Status: ENABLED Request: 0 [Disable] [Stop] LBGroup ClusterNEW: [Enable Nodes] [Disable Nodes] [Stop Nodes] Node node-3-jvmroute (ajp://node3.newcluster.example:8009): [Enable Contexts] [Disable Contexts] [Stop Contexts] Balancer: qacluster, LBGroup: ClusterNEW, Flushpackets: Off, ..., Load: 100 Virtual Host 1: Contexts: /my-deployed-application-context, Status: ENABLED Request: 0 [Disable] [Stop] Node node-4-jvmroute (ajp://node4.newcluster.example:8009): [Enable Contexts] [Disable Contexts] [Stop Contexts] Balancer: qacluster, LBGroup: ClusterNEW, Flushpackets: Off, ..., Load: 100 Virtual Host 1: Contexts: /my-deployed-application-context, Status: ENABLED Request: 0 [Disable] [Stop]任何旧的活跃会话都位于 ClusterOLD 组中,任何新会话都会在 ClusterOLD 或 CLusterNEW 组中创建。接下来,我们需要禁用整个 ClusterOLD 组,以便其集群节点可能会被删除,而不会造成当前活动的客户端会话的任何错误。
在 mod_cluster-manager web 控制台中,单击 LBGroup ClusterOLD 的 Disable Nodes 链接。
此时,只有属于已建立的会话的请求才会路由到 ClusterOLD 负载平衡组的成员。所有新客户端的会话都会在 ClusterNEW 组中创建。当 ClusterOLD 组中没有活跃的会话时,就可以安全地删除其成员。
注意使用 Stop Nodes 将命令负载均衡器停止将任何请求立即路由到这个域。这将强制故障转移到另一个负载平衡组,这将给客户端造成会话数据丢失,只要 ClusterNEW 和 ClusterOLD 之间没有会话复制。
默认负载平衡组
如果当前的 ClusterOLD 设置不包含任何负载平衡组设置,从 mod_cluster-manager 控制台上的 LBGroup: 找到,则仍然可以利用禁用 ClusterOLD 节点。在这种情况下,点每个 ClusterOLD 节点的 Disable Contexts。这些节点的上下文将被禁用,一旦没有活跃的会话就可以删除。新客户端的会话仅在启用了上下文的节点上创建,在此示例中假定为 ClusterNEW 成员。
使用管理 CLI
除了使用 mod_cluster-manager Web 控制台外,您还可以使用 JBoss EAP 管理 CLI 停止或禁用特定的上下文。
停止上下文
/host=primary/server=server-one/subsystem=modcluster:stop-context(context=/my-deployed-application-context, virtualhost=default-host, waittime=0)
停止将 waittime 设置为 0 的上下文,即没有超时,指示 balancer 停止立即将任何请求路由到它,这会强制切换到另一个可用上下文。
如果您使用 waittime 参数设置超时值,则不会在此上下文中创建新会话,但现有会话将继续定向到此节点,直到它们完成或指定的超时已过。waittime 参数默认为 10 秒。
禁用上下文
/host=primary/server=server-one/subsystem=modcluster:disable-context(context=/my-deployed-application-context, virtualhost=default-host)
禁用上下文会告知 balancer 应该在此上下文中不会创建新会话。