9.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。以下是使用此系统属性启动命令的示例:

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

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

9.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
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat