【问题标题】:Glassfish Cluster Session Problems On Amazon EC2 Using Elastic Load Balancer使用弹性负载均衡器的 Amazon EC2 上的 Glassfish 集群会话问题
【发布时间】:2013-10-05 23:20:38
【问题描述】:

首先,此应用在非集群环境中运行良好。

我们遇到的问题是,当 ELB 在会话期间首先路由到集群中的一台服务器,然后再路由到第二台服务器时。第二台服务器找不到会话。例如

  1. iOS 应用将登录调用传递给 Glassfish 4 服务器集群(我们使用 oAuth/Facebook 令牌,因此没有 Glassish 安全领域)。
  2. Amazon Elastic Load Balancer (ELB) 发送到服务器 1。
  3. 会话经过身份验证,用户登录,会话 cookie 传回应用程序。
  4. 应用程序立即发送另一个需要身份验证的请求(这是一个有效的会话)。
  5. ELB 决定将请求发送到服务器 2
  6. 在我们的身份验证 servlet 过滤器中,服务器 2 找不到通过 cookie 传入的 id 的会话
  7. servlet 说用户未通过身份验证,调用失败。

我们的代码非常典型地用于查找会话(如果没有会话立即返回失败):

HttpSession session = req.getSession(false);
//psuedocode
if session == null then session not authenticated log and return
else session authenticated, log and return

如果第二个呼叫被路由到与登录相同的服务器,则第二个呼叫可以正常工作。每当呼叫(无论是第二个、第三个、第四个,等等)转到第二个服务器时,身份验证都会失败,因为它在第二个服务器上找不到会话。

我正在寻找是否有人遇到过类似的情况以及您是如何解决该问题的。是在 ELB 上使用粘性会话更好,还是使用 JK 或 AJP 的 Apache Web 服务器更好?

【问题讨论】:

    标签: session amazon-ec2 glassfish cluster-computing servlet-filters


    【解决方案1】:

    我想到了两个潜在的问题:

    1. 您是否在 web.xml 中指定了<distributable/>
    2. 可能是多播问题。 EC2 不支持多播,这是 GlassFish 默认使用的。查看讨论该主题的 this stackoverflow thread,包括非多播集群。

    【讨论】:

    • distributable 在 web.xml 中,我已经设置了非多播集群
    • 我注意到此网页上有一条有趣的评论:docs.oracle.com/cd/E18930_01/html/821-2426/abdla.html 注意 - 当将高可用性会话持久性与负载均衡器一起使用时,请使用包含基于会话的粘性作为其负载一部分的负载均衡器- 平衡算法。否则,会话数据可能会被误导或丢失。包含基于会话的粘性的负载均衡器示例是 Oracle GlassFish Server 中提供的负载均衡器插件。
    • 您是否发现在非故障转移方案中访问第二台服务器有任何问题?第二台服务器被击中的唯一原因是因为 ELB 的循环实施。第二个服务器是否仍然能够返回对会话的引用。我们的应用程序只是试图找到与会话 cookie 中相同的会话 ID,但是当我们在我的帖子中进行调用时,我们会得到会话的“null”。我看到最初登录到创建会话的第一台服务器时创建了一个 JREPLICA cookie。所以我想知道这是否是“我们如何尝试获得会话”的问题。
    • 是的,您想使用具有会话粘性的 LB,这是受支持的 (aws.amazon.com/elasticloadbalancing)。您也应该能够在非故障转移方案中访问多个实例。请注意,我们根本不测试 ELB,但其他人确实在运行它,尽管我不清楚它是无状态的还是启用了复制。
    • 我们认为这是一个时间问题。即会话的传播速度不如我们在另一个实例上寻找它的速度。我们创建了一个测试工具客户端,当会话出现 null 并且在第二次或第三次调用我们找到会话的服务器时重试。我们首先尝试在 request#getSession(null) 调用上循环,但我们最终发现我们实际上必须发送另一个调用来获取服务器端会话对象。现在我们遇到了一些其他问题,但还不确定它们是与会话相关的还是我们自己的(使用会话数据键从数据库获取用户数据)。
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2014-05-15
    • 2014-01-24
    • 2013-11-08
    相关资源
    最近更新 更多