8.4. 粘性会话


典型的集群部署由专用网络上的负载均衡器(反向代理)和 2 个或更多 Red Hat Single Sign-On 服务器组成。出于性能的需要,如果负载均衡器将与特定浏览器会话相关的所有请求转发到同一 Red Hat Single Sign-On 后端节点,这可能很有用。

原因在于,Red Hat Single Sign-On 使用 infinispan 分布式缓存,在覆盖下保存与当前身份验证会话和用户会话相关的数据。Infinispan 分布式缓存默认配置有一个所有者。这意味着,特定的会话只保存在一个集群节点上,而其他节点需要远程查找会话(如果想要访问它)。

例如,如果带有 ID 为 123 的验证会话保存在 node1 上的 infinispan 缓存中,那么 node2 需要通过网络向 node1 发送请求,以返回特定的会话实体。

如果特定的会话实体始终在本地可用,这可以通过粘性会话的帮助来完成。集群环境中的工作流带有公共前端负载均衡器和两个后端 Red Hat Single Sign-On 节点,如下所示:

  • 用户发送初始请求以查看 Red Hat Single Sign-On 登录屏幕
  • 此请求由 frontend 负载均衡器提供,该负载均衡器将其转发到一些随机节点(例如 node1)。严格说,节点不需要随机,但可以根据某些其他条件(客户端 IP 地址等)进行选择。它都取决于底层负载均衡器的实施和配置(反向代理)。
  • Red Hat Single Sign-On 创建带有随机 ID (如 123)的验证会话,并将其保存到 Infinispan 缓存。
  • Infinispan 分布式缓存根据会话 ID 的哈希值分配会话的主要所有者。有关此问题的更多详细信息,请参阅 Infinispan 文档。假设 infinispan 分配 node2 是此会话的所有者。
  • Red Hat Single Sign-On 创建 cookie AUTH_SESSION_ID,格式为 < session-id>.<owner-node-id >。在我们的示例中,它将为 123.node2
  • 使用红帽单点登录登录屏幕和浏览器中的 AUTH_SESSION_ID cookie 返回用户的响应

从此时,如果负载均衡器将所有下一个请求转发到 node2,因为这是 ID 为 123 的验证会话的所有者,因此 Infinispan 可以在本地查找此会话。身份验证完成后,身份验证会话将转换为用户会话,该会话也会保存在 node2 中,因为它具有相同的 ID 123

集群设置的粘性会话不是强制的,但由于上述原因,最好是性能。您需要通过 AUTH_SESSION_ID cookie 将 loadbalancer 配置为粘性。具体操作取决于您的负载均衡器。

建议在 Red Hat Single Sign-On 端使用系统属性 jboss.node.name,其值对应于您的路由名称。例如,-Djboss.node.name=node1 将使用 node1 来识别路由。此路由将由 Infinispan 缓存使用,当节点是特定密钥的所有者时,将附加到 AUTH_SESSION_ID cookie。可以在 Mod Cluster Example 中看到这个系统属性的 start up 命令示例。

通常,路由名称与后端主机的名称相同,但这不是必须的。您可以使用不同的路由名称,例如要在专用网络中隐藏 Red Hat Single Sign-On 服务器的主机名。

8.4.1. 禁用添加路由

有些负载均衡器可以配置为自行添加路由信息,而不依赖于后端 Red Hat Single Sign-On 节点。但是,如上所述,建议通过 Red Hat Single Sign-On 添加路由。这是因为,当以性能提高时,因为 Red Hat Single Sign-On 知道作为特定会话所有者的实体,并可路由到该节点,这不一定是本地节点。

如果需要,可以通过将以下内容添加到 Red Hat Single Sign-On 的 RHSSO_HOME/standalone/configuration/standalone-ha.xml 文件中,禁用在 Red Hat Single Sign-On 子系统配置中的 AUTH_SESSION_ID cookie 中添加路由信息:

<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
  ...
    <spi name="stickySessionEncoder">
        <provider name="infinispan" enabled="true">
            <properties>
                <property name="shouldAttachRoute" value="false"/>
            </properties>
        </provider>
    </spi>

</subsystem>
Copy to Clipboard Toggle word wrap

8.4.2. 使用 mod_cluster 的集群设置示例

在这个示例中,我们将使用 Mod Cluster 作为负载均衡器。mod 集群的主要功能之一是,负载均衡器端没有大量配置。相反,它需要支持后端节点。后端节点通过名为 MCMP 的专用协议与负载均衡器通信,它们通知 loadbalancer 关于各种事件(如节点加入或离开集群,新的应用程序已被部署等)。

示例设置将包含一个 JBoss EAP 7.1 负载平衡器节点和两个 Red Hat Single Sign-On 节点。

集群示例需要在计算机的回环网络接口上启用 MULTICAST。这可以通过在 root 特权下运行以下命令(在 linux 中):

route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
ifconfig lo multicast
Copy to Clipboard Toggle word wrap

8.4.2.1. Load Balancer 配置

在某一位置解压缩 JBoss EAP 7.1 服务器。假设位置是 EAP_LB

编辑 EAP_LB/standalone/configuration/standalone.xml 文件。在 undertow 子系统中,将 mod_cluster 配置添加到过滤器下,如下所示:

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
 ...
 <filters>
  ...
  <mod-cluster name="modcluster" advertise-socket-binding="modcluster"
      advertise-frequency="${modcluster.advertise-frequency:2000}"
      management-socket-binding="http" enable-http2="true"/>
 </filters>
Copy to Clipboard Toggle word wrap

default -host 下过滤-ref,如下所示:

<host name="default-host" alias="localhost">
    ...
    <filter-ref name="modcluster"/>
</host>
Copy to Clipboard Toggle word wrap

然后,在 socket-binding-group 下添加这个组:

<socket-binding name="modcluster" port="0"
    multicast-address="${jboss.modcluster.multicast.address:224.0.1.105}"
    multicast-port="23364"/>
Copy to Clipboard Toggle word wrap

保存文件并运行服务器:

cd $WILDFLY_LB/bin
./standalone.sh
Copy to Clipboard Toggle word wrap

8.4.2.2. 后端节点配置

将 Red Hat Single Sign-On 服务器发行版本解压缩到某个位置。假设位置是 RHSSO_NODE1

编辑 RHSSO_NODE1/standalone/configuration/standalone-ha.xml,并根据共享数据库配置数据源。如需了解更多详细信息 ,请参阅数据库章节

在 undertow 子系统中,将 session-config 添加到 servlet-container 元素下:

<servlet-container name="default">
    <session-cookie name="AUTH_SESSION_ID" http-only="true" />
    ...
</servlet-container>
Copy to Clipboard Toggle word wrap
警告

仅将 session-config 与 mod_cluster 负载平衡器一起使用。在其他情况下,直接在负载均衡器中通过 AUTH_SESSION_ID cookie 配置粘性会话。

然后,您可以配置 proxy-address-forwarding,如 chapter Load Balancer 所述。请注意,mod_cluster 默认使用 AJP 连接器,因此您需要配置一个。

这一切都配置为 mod_cluster。

可以根据当前服务器的主机名自动探测到 Red Hat Single Sign-On 的节点名称。但是,为了更精细的控制,建议使用系统属性 jboss.node.name 来直接指定节点名称。当您测试同一物理服务器上的 2 个后端节点时,这特别有用。因此,您可以运行类似如下的启动命令:

cd $RHSSO_NODE1
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=node1
Copy to Clipboard Toggle word wrap

以同样的方式配置第二个后端服务器,并使用不同的端口偏移和节点名称运行。

cd $RHSSO_NODE2
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=200 -Djboss.node.name=node2
Copy to Clipboard Toggle word wrap

访问 http://localhost:8080/auth 中的服务器。只能从本地地址和没有负载均衡器(proxy)访问创建 admin 用户,因此您首先需要直接在 http://localhost:8180/auth 上访问后端节点以创建 admin 用户。

警告

使用 mod_cluster 时,您应该始终通过负载均衡器访问集群,而不是直接通过后端节点访问集群。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat