24.6. mod_cluster HTTP 连接器
mod_cluster 连接器是基于 Apache HTTP Server 的负载平衡器。它使用通信通道将来自 Apache HTTP 服务器的请求转发到一组应用服务器节点。
mod_cluster 连接器与其他连接器相比具有多个优势。
- mod_cluster 管理协议(MCMP)是 JBoss EAP 服务器和启用了 mod_cluster 模块的 Apache HTTP 服务器之间的额外连接。它供 JBoss EAP 服务器用于通过一组自定义 HTTP 方法将服务器端负载均衡因素和生命周期事件传回到 Apache HTTP 服务器。
- 使用 mod_cluster 的 Apache HTTP Server 的动态配置允许 JBoss EAP 服务器加入负载平衡协议,而无需手动配置。
- JBoss EAP 执行负载平衡因子计算,而不依赖于具有 mod_cluster 的 Apache HTTP 服务器。这使得负载平衡指标比其他连接器更准确。
- mod_cluster 连接器提供精细的应用程序生命周期控制。每个 JBoss EAP 服务器将 Web 应用程序上下文生命周期事件转发到 Apache HTTP 服务器,通知它启动或停止对给定上下文的路由请求。这可以防止最终用户因为不可用资源而看到 HTTP 错误。
- 可以使用 AJP、HTTP 或 HTTPS 传输。
有关 modcluster
子系统特定配置选项的更多详细信息,请参阅 ModCluster Subsystem Attributes。
24.6.1. 在 Apache HTTP 服务器中配置 mod_cluster
安装 JBoss Core Services Apache HTTP 服务器或使用 JBoss Web 服务器时已包含 mod_cluster 模块,默认情况下即可加载。
自 3.1.0 版开始,Apache HTTP 服务器不再通过 JBoss Web 服务器分发。
请参阅以下步骤来配置 mod_cluster 模块以适应您的环境。
红帽客户还可以使用红帽客户门户网站中的 负载平衡器配置工具 为 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 工作程序节点,使 JBoss EAP 知道 mod_cluster。
如果要禁用 mod_cluster 的广播并配置静态代理列表,请参阅 mod_cluster 的 Disable Advertisement。有关 Apache HTTP 服务器中可用 mod_cluster 配置选项的更多信息,请参阅 Apache HTTP 服务器 mod_cluster 指令
有关配置 mod_cluster 的详情,请参阅 JBoss Web 服务器 HTTP 连接器和负载平衡指南中的配置使用 Apache HTTP 服务器的负载平衡和 mod_cluster 部分。
24.6.2. 为 mod_cluster 禁用广播
默认情况下,mod cluster
子系统的负载平衡器使用多播 UDP 来公告其对后台工作线程的可用性。您可以使用以下步骤禁用广播并使用代理列表。
以下流程中的管理 CLI 命令假定您在受管域中使用 full-ha
配置文件。如果您使用除 full-ha
以外的配置文件,请在 命令中使用相应的配置集名称。如果您正在运行单机服务器,请完全删除 /profile=full-ha
。
修改 Apache HTTP 服务器配置。
编辑
httpd.conf
Apache HTTP 服务器配置文件。使用EnableMCPMReceive
指令,对侦听 MCPM 请求的虚拟主机进行以下更新:添加 指令,以禁用服务器公告。
将
ServerAdvertise
指令设置为Off
,以禁用服务器公告。ServerAdvertise Off
禁用广播频率。
如果您的配置指定了
AdvertiseFrequency
参数,请使用#
字符进行注释。# AdvertiseFrequency 5
启用接收 MCPM 消息的功能。
确保
EnableMCPMReceive
指令存在,以允许 Web 服务器从工作程序节点接收 MCPM 消息。EnableMCPMReceive
在 JBoss EAP
modcluster
子系统中禁用广播。使用以下管理 CLI 命令禁用广播:
/profile=full-ha/subsystem=modcluster/proxy=default:write-attribute(name=advertise,value=false)
重要务必继续下一步,以提供代理列表。如果代理列表为空,则不会禁用广播。
在 JBoss EAP
modcluster
子系统中提供代理列表。必须提供代理列表,因为如果禁用了广播,mod
cluster
子系统将无法自动发现代理。首先,在适当的套接字绑定组中定义出站套接字绑定。
/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 多播。
24.6.3. 配置 mod_cluster Worker 节点
mod_cluster 工作程序节点由 JBoss EAP 服务器组成。此服务器可以是单机服务器,也可以是受管域中服务器组的一部分。单独的进程在 JBoss EAP 内运行,后者管理群集的所有工作程序节点。这称为 master。
受管域中的工作程序节点在服务器组间共享相同的配置。作为单机服务器运行的 worker 节点是单独配置的。否则,配置步骤是相同的。
- 单机服务器必须使用 standalone- ha 或 standalone- full-ha 配置文件启动。
- 受管域中的服务器组必须使用 ha 或 full-ha 配置文件,以及 ha-sockets 或 full-ha-sockets 套接字绑定组。JBoss EAP 附带一个支持群集的服务器组,名为 other-server-group,它满足这些要求。
配置工作程序节点
此流程中的管理 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-slave.xml
使用以下管理 CLI 命令,设置唯一的主机名:此示例使用
slave1
作为新主机名。/host=EXISTING_HOST_NAME:write-attribute(name=name,value=slave1)
有关配置主机名的更多信息,请参阅 配置主机的名称。
配置每一主机以连接域控制器。
注意此步骤不适用于单机服务器。
对于需要加入受管域的新配置主机,您必须删除本地元素,再添加指向域控制器的 remote element host 属性。
使用适当的
host.xml
配置文件启动 JBoss EAP 从主机。$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml
使用下列管理 CLI 命令,配置域控制器设置:
/host=SLAVE_HOST_NAME:write-remote-domain-controller(host=DOMAIN_CONTROLLER_IP_ADDRESS,port=${jboss.domain.master.port:9990},security-realm="ManagementRealm")
这会修改 host-slave.xml 文件中的 XML,如下所示:
<domain-controller> <remote host="DOMAIN_CONTROLLER_IP_ADDRESS" port="${jboss.domain.master.port:9990}" security-realm="ManagementRealm"/> </domain-controller>
如需更多信息,请参阅 主机控制器配置。
为每个从主机配置身份验证。
每个从属服务器都需要在域控制器的 managementRealm 中创建用户名和密码。在域控制器或单机 master 上,为每个主机运行
EAP_HOME/bin/add-user.sh
命令。为每个主机添加一个管理用户,用户名与从设备的主机名匹配。确保对最后一个问题
回答是
"这个新用户将用于一个 AS 进程连接到另一个 AS 进程吗?",以便为您提供一个 secret 值。示例:
add-user.sh
Script 输出 (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 : slave1 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 'slave1' 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 slave host controller connecting to the master 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 中获取密码,或者将密码作为系统属性来指定密码。
使用 Management CLI,在服务器配置文件中指定 Base64 编码的密码值。
使用以下管理 CLI 命令指定机密值:务必将
SECRET_VALUE
替换为上一步中 add-user 输出返回的机密值。/host=SLAVE_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=SLAVE_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 命令指定机密值:务必将
VAULT_SECRET_VALUE
替换为上一步中生成的掩码密码。/host=master/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${VAULT::secret::password::VAULT_SECRET_VALUE}")
您将需要重新加载服务器。
host
参数不适用于单机服务器。reload --host=HOST_NAME
如需更多信息,请参阅 JBoss EAP 如何配置服务器安全 指南的 Password Vault 部分。
指定密码作为系统属性。
以下示例使用
server.identity.password
作为密码的系统属性名称。在服务器配置文件中指定密码的系统属性。
使用以下 managemente CLI 命令,将机密身份配置为使用系统属性:
/host=SLAVE_HOST_NAME/core-service=management/security-realm=ManagementRealm/server-identity=secret:add(value="${server.identity.password}")
您将需要重新加载服务器。
host
参数不适用于单机服务器。reload --host=master
在启动服务器时设置系统属性的密码。
您可以通过将
server.identity.password
系统属性作为命令行参数或在属性文件中传递来设置 server.identity.password 系统属性。作为纯文本命令行参数传递.
启动服务器并传递
server.identity.password
属性。$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml -Dserver.identity.password=changeme
警告密码必须以纯文本形式输入,并且对于发出
ps -ef
命令的任何人可见。在属性文件中设置 属性。
创建属性文件,并将键/值对添加到属性文件中,例如:
server.identity.password=changeme
警告密码为纯文本,对于有权访问此属性文件的任何人可见。
使用命令行参数启动服务器。
$ EAP_HOME/bin/domain.sh --host-config=host-slave.xml --properties=PATH_TO_PROPERTIES_FILE
重新启动服务器。
现在,从系统将使用其主机名作为用户名,并将加密字符串用作密码,向主设备进行身份验证。
您的单机服务器或受管域的服务器组中的服务器现在配置为 mod_cluster worker 节点。如果部署集群应用,其会话将复制到所有集群节点进行故障转移,并且可以接受来自外部 Web 服务器或负载平衡器的请求。默认情况下,集群的每个节点都使用自动发现功能发现其他节点。
24.6.4. 配置 mod_cluster fail_on_status Parameter
fail_on_status
参数列出了这些 HTTP 状态代码,当被集群中的 worker 节点返回时,会将该节点标记为失败。然后,负载均衡器将将来的请求发送到集群中的另一个 worker 节点。失败的 worker 节点将保持在 not OK
状态,直到它会向负载均衡器发送 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
24.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 和 Cluster OLD 之间没有会话复制,则会导致客户端出现会话数据丢失。
默认负载均衡组
如果当前的 ClusterOLD 设置不包含任何负载均衡组设置(从 mod_cluster-manager 控制台上的 LBGroup: 中找到),仍然可以使用禁用 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)
停止将 waittime
设置为 0
(无超时)的上下文可指示平衡器立即停止向其路由任何请求,这会强制故障转移到另一个可用的上下文。
如果您使用 waittime
参数设置了超时值,则不会在此上下文上创建新的会话,但现有会话将继续定向到此节点,直到它们完成或者指定的超时已过。waittime
参数默认为 10
秒。
禁用上下文
/host=master/server=server-one/subsystem=modcluster:disable-context(context=/my-deployed-application-context, virtualhost=default-host)
禁用上下文会告知平衡器,不应在此上下文上创建新的会话。