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 中添加路由信息:
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
route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
ifconfig lo multicast
8.4.2.1. Load Balancer 配置 复制链接链接已复制到粘贴板!
在某一位置解压缩 JBoss EAP 7.1 服务器。假设位置是 EAP_LB
编辑 EAP_LB/standalone/configuration/standalone.xml
文件。在 undertow 子系统中,将 mod_cluster 配置添加到过滤器下,如下所示:
在 default
,如下所示:
-host
下过滤-ref
<host name="default-host" alias="localhost"> ... <filter-ref name="modcluster"/> </host>
<host name="default-host" alias="localhost">
...
<filter-ref name="modcluster"/>
</host>
然后,在 socket-binding-group
下添加这个组:
<socket-binding name="modcluster" port="0" multicast-address="${jboss.modcluster.multicast.address:224.0.1.105}" multicast-port="23364"/>
<socket-binding name="modcluster" port="0"
multicast-address="${jboss.modcluster.multicast.address:224.0.1.105}"
multicast-port="23364"/>
保存文件并运行服务器:
cd $WILDFLY_LB/bin ./standalone.sh
cd $WILDFLY_LB/bin
./standalone.sh
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>
<servlet-container name="default">
<session-cookie name="AUTH_SESSION_ID" http-only="true" />
...
</servlet-container>
仅将 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
cd $RHSSO_NODE1
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=node1
以同样的方式配置第二个后端服务器,并使用不同的端口偏移和节点名称运行。
cd $RHSSO_NODE2 ./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=200 -Djboss.node.name=node2
cd $RHSSO_NODE2
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=200 -Djboss.node.name=node2
访问 http://localhost:8080/auth
中的服务器。只能从本地地址和没有负载均衡器(proxy)访问创建 admin 用户,因此您首先需要直接在 http://localhost:8180/auth
上访问后端节点以创建 admin 用户。
使用 mod_cluster 时,您应该始终通过负载均衡器访问集群,而不是直接通过后端节点访问集群。