Session AmazonEC2上使用弹性负载平衡器的Glassfish集群会话问题

Session AmazonEC2上使用弹性负载平衡器的Glassfish集群会话问题,session,amazon-ec2,glassfish,cluster-computing,servlet-filters,Session,Amazon Ec2,Glassfish,Cluster Computing,Servlet Filters,首先,该应用程序在非集群环境中运行良好 我们遇到的问题是,在会话期间,ELB首先路由到集群中的一台服务器,然后路由到第二台服务器。第二台服务器找不到会话。e、 g iOS应用程序将登录调用传递给Glassfish 4服务器集群(我们使用的是oAuth/Facebook令牌,因此没有Glassish安全领域) Amazon弹性负载平衡器(ELB)发送到服务器1 会话已通过身份验证,用户已登录,并将会话cookie传递回应用程序 应用程序立即发送另一个需要验证的请求(这是有效会话) ELB决定将请求

首先,该应用程序在非集群环境中运行良好

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

  • iOS应用程序将登录调用传递给Glassfish 4服务器集群(我们使用的是oAuth/Facebook令牌,因此没有Glassish安全领域)
  • Amazon弹性负载平衡器(ELB)发送到服务器1
  • 会话已通过身份验证,用户已登录,并将会话cookie传递回应用程序
  • 应用程序立即发送另一个需要验证的请求(这是有效会话)
  • ELB决定将请求发送到服务器2
  • 在我们的AuthenticateServlet筛选器中,服务器2找不到具有随cookie传入的id的会话
  • servlet表示用户未经过身份验证,调用失败
  • 我们的代码是查找会话的典型代码(如果没有会话立即返回fail):

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


    我想看看是否有人遇到过类似的情况,以及你是如何解决这个问题的。在ELB上使用粘性会话是更好的选择,还是使用JK或AJP的Apache web服务器是更好的选择?

  • 您是否在web.xml中指定了
  • 可能是多播问题。EC2不支持多播,GlassFish默认使用多播。查看讨论该主题的内容,包括非多播集群

  • distributable在web.xml中,我已经设置了非多播集群。我注意到在这个网页上有一条有趣的评论:注意-当将高可用性会话持久性与负载平衡器一起使用时,请使用负载平衡器,该负载平衡器将基于会话的粘性作为其负载平衡算法的一部分。否则,会话数据可能会被误导或丢失。包含基于会话的粘性的负载平衡器的一个示例是Oracle GlassFish Server中提供的Loadbalancer插件。您认为在非故障切换场景中访问第二台服务器有任何问题吗?第二台服务器被命中的唯一原因是ELBs循环实现。第二台服务器是否仍然能够返回对会话的引用。我们的应用程序只是试图找到与会话cookie中相同的会话id,但当我们在我的帖子中进行调用时,会话的id为“null”。我看到在最初登录到创建会话的第一台服务器时创建了一个JREPLICA cookie。所以我想知道这是否是一个“我们如何尝试获得会话”的问题。是的,您希望使用具有会话粘性的LB,这是受支持的()。您还应该能够在非故障切换场景中访问多个实例。请注意,我们根本不测试ELB,但其他人确实让它运行,尽管我不清楚它是无状态的还是启用了复制的。我们认为这是一个时间问题。i、 e.会话的传播速度不如我们在另一个实例上寻找它的速度快。我们创建了一个测试工具客户端,当会话为空时重试,在第二次或第三次调用服务器时,我们找到了会话。我们首先尝试在request#getSession(null)调用上循环,但最终发现我们实际上必须发送另一个调用来获取服务器端会话对象。现在我们还有一些其他问题,但还不确定它们是与会话相关的还是我们自己的(使用会话数据键从数据库获取用户数据)。
    HttpSession session = req.getSession(false);
    //psuedocode
    if session == null then session not authenticated log and return
    else session authenticated, log and return