在 Microsoft Azure 中使用 JBoss EAP

Red Hat JBoss Enterprise Application Platform 7.3

在 Microsoft Azure 上使用红帽 JBoss 企业应用平台的说明,包括配置高可用性。

摘要

本书是在 Microsoft Azure 中使用红帽 JBoss 企业应用平台的指南,包括高可用性配置。

第 1 章 简介

JBoss EAP 7 可以与 Microsoft Azure 平台搭配使用,只要您在特定支持的配置中使用它即可在 Azure 中运行 JBoss EAP。如果要配置集群 JBoss EAP 环境,您必须应用特定的配置,以在 Azure 中使用 JBoss EAP 集群功能。

本指南详细介绍了在 Microsoft Azure 中使用 JBoss EAP 的支持配置,以及在 Azure 中启用 JBoss EAP 集群所需的特定 JBoss EAP 配置。与任何其他 JBoss EAP 安装一样,本指南中未提及所有其他 JBoss EAP 功能通常在 Azure 中运行。有关非特定配置说明,请参见其他 JBoss EAP 文档

1.1. 关于红帽云访问

红帽云访问是一项红帽订阅功能,可在红帽认证云基础架构提供商(如 Amazon EC2 和 Microsoft Azure)上为 JBoss EAP 提供支持。红帽云访问允许您以简单、经济高效的方式,在传统服务器和基于公共云的资源之间移动您的订阅。

您可以在客户门户中找到有关红帽云访问的更多信息

第 2 章 支持的配置

在 Microsoft Azure 中使用 JBoss EAP 唯一支持的虚拟机操作系统是:

  • Red Hat Enterprise Linux 7
  • Red Hat Enterprise Linux 8
  • Microsoft Windows Server 2012 R2
  • Microsoft Windows Server 2016

红帽云访问计划允许您使用 JBoss EAP 订阅在自己的 Azure 虚拟机或 Microsoft Azure Marketplace 以上 On-Demand 操作系统之一上安装 JBoss EAP。请注意,虚拟机操作系统订阅与 JBoss EAP 订阅是独立的。

除上述操作系统限制外,请参阅客户门户,了解 JBoss EAP 支持的配置的更多信息,如受支持的 Java 开发套件(JDK)供应商和版本。

2.1. 不支持的功能

在 Microsoft Azure 环境中使用 JBoss EAP 时,有一些不受支持的功能。

受管域
Microsoft Azure 不支持 JBoss EAP 受管域。仅支持独立 JBoss EAP 服务器实例。请注意,Azure 中支持使用独立 JBoss EAP 服务器配置 JBoss EAP 群集。
ActiveMQ Artemis 使用共享存储的高可用性
Microsoft Azure 不支持使用 Artemis 共享存储的 JBoss EAP 消息传递高可用性。要在 Azure 中配置 JBoss EAP 消息传递高可用性,请参阅 ActiveMQ Artemis High Availability 部分中的说明。
mod_custer Advertising
如果您希望将 JBoss EAP 用作 Undertow mod_cluster 代理负载平衡器,则不支持 mod_cluster 公告功能,因为 Azure UDP 多播限制。您必须将 mod_cluster 负载平衡配置为使用代理列表而不是广播

第 3 章 创建 Microsoft Azure 环境

创建将在 Microsoft Azure 环境中托管 JBoss EAP 实例的虚拟机。虚拟机必须使用 Azure 大小 Standard_A2 或更高版本。

您可以使用 Azure On-Demand 高级镜像来创建虚拟机或手动创建自己的虚拟机。

重要

如果要配置 JBoss EAP 高可用性,您必须在同一虚拟网络中创建虚拟机。

第 4 章 Installing JBoss EAP

重要

如果您使用 Microsoft Azure Marketplace 中的 Red Hat Enterprise Linux On-Demand 虚拟机,则必须使用 ZIP 或安装程序方法安装 JBoss EAP。您不得将红帽企业 Linux On-Demand 虚拟机注册到红帽订阅管理中,因为您将为该虚拟机计费两次。

在 Microsoft Azure 环境中的虚拟机上安装 JBoss EAP 与普通的 JBoss EAP 安装不同。具体步骤请查看 JBoss EAP 安装指南

第 5 章 配置 JBoss EAP 子系统以在云平台上工作

些 JBoss EAP 子系统必须配置为在云平台上正常工作,如 Amazon EC2 和 Microsoft Azure。这是必要的,因为 JBoss EAP 服务器通常绑定到云虚拟机的专用 IP 地址,例如: 10.x.x.x.x,后者仅在云平台中可见。对于某些子系统,此地址还必须映射到服务器的公共 IP 地址,该地址可从云外部可见。

5.1. Web 服务

当客户端使用 Service.create(wsdlURL, serviceName)发出 Web 服务请求时,用户 将连接到服务器公共 IP 地址,但随后会被重定向到 webservices 子系统中服务器配置文件中定义的地址。默认情况下,此地址为 ${jboss.bind.address:127.0.0.1},这意味着在云平台上调用者将重定向到服务器的专用 IP 地址,并且无法解析请求。使用以下命令,必须在 wsdl-host 元素中配置服务器的公共 IP 地址:

/subsystem=webservices:write-attribute(name=wsdl-host,value=PUBLIC_IP_ADDRESS)

5.2. 消息传递

在云平台上使用消息传递时,客户端使用的连接工厂必须具有指向服务器公共 IP 地址的连接器。

因此,必须为运行 完整 配置文件的 JBoss EAP 服务器创建新的连接器和套接字绑定。

  1. 引用的 http-public 套接字绑定必须在 socket-binding-group 中创建:

    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=http-public:add(host=PUBLIC_IP_ADDRESS,port=${jboss.http.port:8080})
  2. messaging 子系统中创建新的 http-connector 元素:

    /subsystem=messaging-activemq/server=default/http-connector=http-public-connector:add(endpoint=http-acceptor, socket-binding=http-public)
  3. connection-factory 中设置 连接器,供客户端使用。例如,将 RemoteConnectionFactory 配置为默认连接:

    /subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=connectors, value=["http-public-connector"]

5.3. 远程配置高可用性

如果您在云平台上将 JBoss EAP HA 功能与集群 EJB 搭配使用,则需要对远程子系统进行一些额外的配置,以确保 EJB 客户端能够接收群集视图更新。

这可以通过为远程子系统套接字绑定配置 客户端映射 实现

/socket-binding-group=standard-sockets/socket-binding=http:write-attribute(name=client-mappings,value=[{ "destination-address" => "PUBLIC_IP_ADDRESS", "destination-port" => "8080" }])

第 6 章 为 Microsoft Azure 配置 JBoss EAP

在 Red Hat Enterprise Linux 上引导时启动 JBoss EAP 作为服务

如果您要在 Microsoft Azure 中将 JBoss EAP 作为红帽企业 Linux 上的服务启动,您必须更改 JBoss EAP 服务的以下配置,以确保它在 Azure 虚拟机主机名初始化后启动。

打开 /etc/systemd/system/multi-user.target.wants/eap7-standalone.service,并添加对 waagent.service 的依赖:

替换下面这一行:

After=syslog.target network.target

使用:

After=syslog.target network.target waagent.service
Requires=waagent.service

使用 mod_cluster 进行负载平衡

由于 Azure 不支持 mod_cluster 公告,因此如果您要配置 JBoss EAP 负载平衡环境,您必须确保所有平衡器和工作程序都绑定到内部 Microsoft Azure 虚拟网络上可访问的 IP 地址。

注意

负载均衡器和 worker 必须绑定到实际的内部 Azure 虚拟 IP 地址,如 172.28.0.2,而不是 0.0.0.0

此外,由于 mod_cluster 广告不可用,如果您将 JBoss EAP 用作 Undertow mod_cluster 代理负载均衡器,您必须将每个 worker 节点配置为使用包含每个平衡器 IP 地址和端口的代理列表,如下所示:

/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=proxy-one:add(host="BALANCER_IP_ADDRESS", port="BALANCER_PORT")
/subsystem=modcluster/mod-cluster-config=configuration:list-add(name=proxies,value=proxy-one)

ActiveMQ Artemis High Availability

Microsoft Azure 不支持使用 Artemis 共享存储的 JBoss EAP 消息传递高可用性。要在 Azure 中配置 JBoss EAP 消息传递高可用性,您必须利用 TCP JGroups 堆栈使用带有 AZURE_PING JGroups 发现协议的复制日志。有关使用复制日志的更多信息,请参阅为 JBoss EAP 配置消息传递 https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/configuring_messaging/#data_replication 中的数据复制

在使用 AZURE_PING 配置 TCP JGroups 堆栈后,您必须在 messaging- activemq 子系统中将 JGroups 堆栈添加到 discovery-group 和 broadcast -group jgroups- cluster 配置中。详情请参阅为 JBoss EAP 配置消息传递中的 https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/configuring_messaging/#server_discovery 服务器发现

第 7 章 在 Microsoft Azure 中使用 JBoss EAP 高可用性

Microsoft Azure 不支持基于 UDP 多播的 JGroups 发现协议。虽然您可以使用其他 JGroups 发现协议(如静态配置(TCPPING)、共享数据库(JDBC_PING)、基于文件系统的 ping(FILE_PING)或 TCPGOSSIP),但我们强烈建议您使用专门为 Azure 开发的共享文件发现协议: AZURE_PING

7.1. 为 JBoss EAP 高可用性配置 AZURE_PING

本节介绍将您的 JBoss EAP 群集配置为使用 AZURE_PING JGroups 发现协议。确保您满足创建虚拟机时的先决条件

AZURE_PING 在 Microsoft Azure 存储帐户中使用一个通用的 Blob 容器。如果您还没有 AZURE_PING 可使用的 blob 容器,请创建一个虚拟机可以访问的容器。

创建 blob 容器后,您需要以下信息来配置 AZURE_PING:

  • storage_account_name :包含 blob 容器的 Microsoft Azure 存储帐户的名称。
  • storage_access_key :存储帐户的 secret 访问密钥。
  • Container :用于 PING 数据的 blob 容器的名称。

若要将 JBoss EAP 配置为使用 AZURE_PING 作为 JGroups 发现协议,您可以使用预配置的示例 JBoss EAP 配置文件或 修改现有配置

重要

以下说明使用 UDP JGroups 堆栈配置 AZURE_PING:如果要在 Azure 中配置 JBoss EAP 消息传递高可用性,您必须改为在 TCP JGroups 堆栈中配置 AZURE_PING。

7.1.1. 使用配置文件示例

JBoss EAP 包含用于在 Microsoft Azure 中配置单机服务器集群的示例配置文件。这些文件位于 EAP_HOME/docs/ 中,examples/configs/standalone-azure-ha.xmlstandalone-azure-full-ha.xml

注意

有关服务器配置文件区别的说明,请参阅 JBoss EAP 配置指南

这些示例配置文件预配置为在 Microsoft Azure 中使用集群,所需的一切是指定 Azure 存储帐户和 blob 容器的值。

将您所需的示例配置文件复制到 EAP_HOME/standalone/configuration/

7.1.2. 修改现有配置

如果要修改现有的 JBoss EAP 高可用性配置,需要对 jgroups 子系统进行下列更改:

  1. 启动管理 CLI 并嵌入服务器,以对所选的配置文件进行离线更改。例如:

    $ EAP_HOME/bin/jboss-cli.sh
    [disconnected /] embed-server --server-config=standalone-ha.xml
  2. 默认情况下,JGroups 使用 UDP 堆栈。如果您使用的是另一个堆栈,请改回到使用 UDP 堆栈:

    [standalone@embedded /] /subsystem=jgroups/channel=ee:write-attribute(name=stack,value=udp)
  3. 执行以下批量命令以删除现有的 UDP 堆栈,并插入为 Microsoft Azure 配置的新 UDP 堆栈:

    batch
    /subsystem=jgroups/stack=udp:remove
    /subsystem=jgroups/stack=udp:add()
    /subsystem=jgroups/stack=udp/transport=UDP:add(socket-binding=jgroups-udp,properties={ip_mcast=false})
    /subsystem=jgroups/stack=udp/protocol=azure.AZURE_PING:add(properties={storage_account_name="${jboss.jgroups.azure_ping.storage_account_name}", storage_access_key="${jboss.jgroups.azure_ping.storage_access_key}", container="${jboss.jgroups.azure_ping.container}"})
    /subsystem=jgroups/stack=udp/protocol=MERGE3:add
    /subsystem=jgroups/stack=udp/protocol=FD_SOCK:add(socket-binding=jgroups-udp-fd)
    /subsystem=jgroups/stack=udp/protocol=FD:add
    /subsystem=jgroups/stack=udp/protocol=VERIFY_SUSPECT:add
    /subsystem=jgroups/stack=udp/protocol=pbcast.NAKACK2:add(properties={use_mcast_xmit=false,use_mcast_xmit_req=false})
    /subsystem=jgroups/stack=udp/protocol=UNICAST3:add
    /subsystem=jgroups/stack=udp/protocol=pbcast.STABLE:add
    /subsystem=jgroups/stack=udp/protocol=pbcast.GMS:add
    /subsystem=jgroups/stack=udp/protocol=UFC:add
    /subsystem=jgroups/stack=udp/protocol=FRAG2:add
    run-batch
    注意

    如果要将 Microsoft Azure 存储帐户和 blob 容器的值存储在配置文件中,请将上述配置中的系统属性引用替换为 Azure 环境中的值。在以下命令中,使用了启动 JBoss EAP 的示例,即系统属性:

    配置文件中的堆栈 XML 应该类似如下:

    <stack name="udp">
        <transport type="UDP" socket-binding="jgroups-udp">
            <property name="ip_mcast">
                false
            </property>
        </transport>
        <protocol type="azure.AZURE_PING">
            <property name="storage_account_name">
                ${jboss.jgroups.azure_ping.storage_account_name}
            </property>
            <property name="storage_access_key">
                ${jboss.jgroups.azure_ping.storage_access_key}
            </property>
            <property name="container">
                ${jboss.jgroups.azure_ping.container}
            </property>
        </protocol>
        <protocol type="MERGE3"/>
        <protocol type="FD_SOCK" socket-binding="jgroups-udp-fd"/>
        <protocol type="FD"/>
        <protocol type="VERIFY_SUSPECT"/>
        <protocol type="pbcast.NAKACK2">
            <property name="use_mcast_xmit">
                false
            </property>
            <property name="use_mcast_xmit_req">
                false
            </property>
        </protocol>
        <protocol type="UNICAST3"/>
        <protocol type="pbcast.STABLE"/>
        <protocol type="pbcast.GMS"/>
        <protocol type="UFC"/>
        <protocol type="FRAG2"/>
    </stack>
  4. 停止嵌入的服务器并退出管理 CLI:

    [standalone@embedded /] stop-embedded-server
    [disconnected /] exit

7.2. 启动 JBoss EAP 高可用性

要在 Microsoft Azure 中使用高可用性启动 JBoss EAP,您必须:

  • 使用使用 AZURE_PING 发现协议配置的配置文件,并指定 Microsoft Azure 存储帐户和 blob 容器所需的值。
  • 私有 接口绑定到用于集群流量的 Microsoft Azure 内部 IP 地址。您可以在启动时执行此操作,如下所示,也可以按照 JBoss EAP 配置指南中所示的集合配置进行此操作

    警告

    出于安全考虑,您必须确保不会将集群流量公开给意想不到的网络。

    您可以通过将端点限制为 Microsoft Azure 虚拟网络,或者为集群流量创建一个专用虚拟网络和专用虚拟机 NIC 来实现此目的。

使用以下命令启动您的 JBoss EAP 高可用性实例:如果将 Microsoft Azure 存储帐户和 blob 容器值存储在配置文件中,您可以省略 -Djboss.jgroups.azure_ping 系统属性定义。

EAP_HOME/bin/standalone.sh -b IP_ADDRESS -bprivate IP_ADDRESS --server-config=EAP_CONFIG_FILE.xml -Djboss.jgroups.azure_ping.storage_account_name=STORAGE_ACCOUNT_NAME -Djboss.jgroups.azure_ping.storage_access_key=STORAGE_ACCESS_KEY -Djboss.jgroups.azure_ping.container=CONTAINER_NAME

例如:

EAP_HOME/bin/standalone.sh -b 172.28.0.2 -bprivate 172.28.0.2 --server-config=standalone-azure-ha.xml -Djboss.jgroups.azure_ping.storage_account_name=my_storage_account -Djboss.jgroups.azure_ping.storage_access_key=y7+2x7P68pQse9MNh58Bkk5po9OGzeJc+0IRqYcQ9Cr/Sp4xiUFJVlbY+MGXJRNx3syksikwm4tOYlFgjvoCmw== -Djboss.jgroups.azure_ping.container=my_blob_container
注意

随着 JBoss EAP 子系统仅在需要时启动,您必须将分布式应用部署到 JBoss EAP 服务器,以启动高可用性 JBoss EAP 子系统。

在集群中启动第二个 JBoss EAP 实例后,您应该会在群集中第一台服务器的控制台日志中看到类似如下的日志:

INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,eap-server-1) ISPN000094: Received new cluster view for channel server: [eap-server-1|1] (2) [eap-server-1, eap-server-2]

7.3. JBoss EAP 高可用性故障排除

如果您在 Microsoft Azure 中无法使集群正常工作,请验证您是否完成了以下列表中的所有要求。

  • 确保托管 JBoss EAP 服务器的 Microsoft Azure 虚拟机使用相同的虚拟网络。
  • 确保您有一个 blob 容器供 AZURE_PING 使用。
  • 确保您在使用带有 jgroups 子系统中配置的 AZURE_PING 发现协议的 JBoss EAP 配置文件。
  • 确保您将公共和私有接口绑定到正确的 Microsoft Azure IP 地址。
  • 确保 Microsoft Azure 存储帐户和 blob 容器具有正确的值,并且您是:

    • 将它们存储在您的配置文件中,或者
    • 启动 JBoss EAP 时设置正确的系统属性.
  • 确保您的可分布式 Java 应用已部署到集群中的所有 JBoss EAP 服务器。

7.3.1. 在您的 Blob 容器中清理 Stale 发现文件

如果 JBoss EAP 集群使用 AZURE_PING 正常关闭,例如,使用 kill -9 结束 JBoss EAP 进程,则一些过时的发现文件可能保留在您的 Blob 容器中。

这些文件通常在安全的集群关闭时进行清理,但如果从正常关闭后保留,则可能会影响尝试联系不再在线节点的群集成员的启动性能。

如果您遇到问题,您可以设置以下配置,以便在集群查看更改时删除并刷新所有发现文件。

/subsystem=jgroups/stack=udp/protocol=azure.AZURE_PING/property=remove_all_data_on_view_change:add(value=true)
注意

另外,如果在每个视图更改上清理容器不理想,您可以减少尝试加入集群的节点的加入尝试次数。默认加入尝试数量为 10。例如,将加入尝试数设置为 3

/subsystem=jgroups/stack=udp/protocol=pbcast.GMS/property=max_join_attempts:add(value=3)

过时的发现文件仍然存在,但尝试加入群集的节点不会花费太多时间尝试联系不再在线的节点。





修订了 2022 年 2 月 18:28:39 +1000