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
cd $RHSSO_NODE1
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=node1
通常,在生产环境中,路由名称应该使用与后端主机相同的名称,但这不是必需的。您可以使用不同的路由名称。例如,如果您要在专用网络中隐藏 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 中添加路由信息: