设置几个新的 Coldfusion 2018 服务器并将首次使用集群并遇到一些问题。
我在会话复制时遇到问题。基本上,会话变量似乎在集群中的节点之间复制,但在短时间内随机终止。
一点设置信息:
- 负载平衡器后面的 2 个 Web 服务器 (Windows Server 2012)
- 在每台 Web 服务器上都有一个 Coldfusion 集群,该集群由 2 个本地实例(尚不清楚这是否有用 - 将在单独的问题中提出)和 2 个远程实例(远程引用每个相对服务器的本地实例)组成
- 为简单起见,目前仅在具有本地 Coldfusion 实例的单个服务器上进行测试 - 将遥控器排除在外,直到我可以让事情在本地可靠地工作
- 使用 J2EE 会话变量
- Coldfusion 会话超时设置为 2 小时
- 在每个 Coldfusion 实例中,channelSendOptions 设置为“6”
这是我所做/经历的:
- 我们有一个需要登录的 Web 应用程序,并在登录时将用户信息存储在会话中。
- 我对 Web 应用程序进行了小修改,以显示哪个集群实例为我当前的请求提供了服务。
- 设置集群后,我启动 Web 应用程序并登录,注意显示登录页面的实例。
- 登录后,我立即返回登录屏幕(应用程序在会话中检查用户信息,如果未找到则重定向到登录)
- 调试显示我实际上正在登录,但是在登录后重定向到某个新页面后,用户信息将从会话中消失。
- 连续多次登录尝试(相同的凭据,只是一遍又一遍地尝试)显示有时登录会正常进行,我会进入应用程序。但是,如果我刷新页面或转到另一个页面,会话将很快丢失,但随机丢失(在几次页面刷新内)。
- 为了简化问题以尝试弄清楚发生了什么,我创建了一个简单的 .cfm 文件,它绕过所有登录内容并做了一件事:向会话添加一个简单的字符串值,然后转储会话和实例名称。** 我运行了一次脚本,注意到正在使用哪个实例,并且该会话包含我的值。** 然后我编辑了脚本,使其不再设置会话值。** 然后我一遍又一遍地点击刷新,所以我可以确认:
- 集群中的两个实例都在为请求提供服务
- 当我在实例之间切换时,会话值始终可用。
- 同样,复制将起作用,并且对于几次刷新,我可以看到我的会话变量在每个实例上都可用......直到它不是。在随机刷新/秒数(例如 2 - 10 次刷新之间)后,该值将消失。
我不知道为什么会发生这种情况。我们考虑使用 Redis 作为会话存储,看看它是否有帮助,但坦率地说,我们的团队没有这方面的经验,在 Windows 中工作很笨重,如果我们能提供帮助,我们真的不希望我们的基础设施中出现更多移动部件它。
任何关于正在发生的事情的见解以及关于如何在幕后查看并查看会话复制发生了什么的建议将不胜感激。
谢谢
添加一些代码和屏幕截图。屏幕截图显示了每次页面刷新后的会话状态以及当前正在为页面提供服务的实例。最后两张图片代表刷新 11 和 13 - session 变量在 11 中丢失,我去了 13,因此我们可以看到变量在另一个实例上也丢失了。还有一些集群/会话设置的图片。
以下是简单的测试脚本。第一行在第一次运行时未注释以创建会话变量,并为每次后续运行注释掉。
<!--- <cfset Session.svar="cake!"> --->
<cfdump var="#Session#" />
<cfscript>
hostaddress = createObject("java", "java.net.InetAddress").localhost.getHostAddress();
</cfscript>
<cfoutput>
<h3>
Instance: #createobject("component","CFIDE.adminapi.runtime").getinstancename()#
</h3>
</cfoutput>