在 Elastic Beanstalk 中维护会话

Posted

技术标签:

【中文标题】在 Elastic Beanstalk 中维护会话【英文标题】:Maintaining session in Elastic Beanstalk 【发布时间】:2013-09-11 10:12:47 【问题描述】:

随着 Amazon Elastic Beanstalk 中的实例数量不时变化。如果一个应用程序是用 php 构建的,如何在多个实例之间维护会话?我们如何确保不删除 Parent 实例(应用程序启动时的第一个实例

【问题讨论】:

我们将弹性 IP 映射到特定实例,然后将我们的 Web 域映射到该弹性 IP,如果该特定实例被删除怎么办.. EIP 将与您终止的实例解除关联。通常我只是将 Web 域 CNAME 映射到 Elastic Beanstalk 环境 URL,请参阅 Using Custom Domains。 @study 并自动映射到新实例? 没有。它不会映射到新实例。 @study 那么解决方案是什么? 【参考方案1】:

AWS 博客上的这篇文章描述了如何使用 DynamoDB 使用适用于 PHP 的 AWS 开发工具包进行会话状态处理。

http://aws.typepad.com/aws/2012/04/scalable-session-handling-in-php-using-amazon-dynamodb.html

【讨论】:

Elastic Bean stalk 根本不使用发电机 @user1765876,您可以设置 Elastic Beanstalk 以使用 DynamoDB。见AWS Elastic Beanstalk Developer Guide 吉姆是对的。您可以创建一个 DynamoDB 表,然后使用 AWS SDK for PHP 中的 DynamoDB 会话处理程序来使用 DynamoDB 具有 $_SESSION 超全局的后端。 如何在 Wordpress 中访问会话变量silvermapleweb.com/using-the-php-session-in-wordpress【参考方案2】:

如果应用程序是用 PHP 构建的,会话将如何维护 在几个实例中?

没有。 Elastic Beanstalk 不会在多个实例之间维护会话。您必须自己维护多个实例之间的会话。如果您启用 Elastic Load Balancing 会话粘性,它只会确保将您的用户转发到同一个实例。

我们如何确保不删除 Parent 实例(第一个 应用启动时的实例

Elastic Beanstalk Auto Scaling 使用 Default Termination Policy,它将首先终止最旧的实例。您可以修改 Elastic Beanstalk Auto Scaling 终止策略以避免首先终止最旧的实例。

【讨论】:

Elastic Load Balancing 会话粘性是什么意思?默认是禁用.. 嗨@user1765876,请参阅Elastic Load Balancing Developer Guide - Create Sticky Sessions 我还是很困惑,默认情况下粘滞功能是禁用的,我应该启用它吗?如果我不启用它会怎样? 如果您启用它,您的用户请求将被定向到同一个 EC2 实例。所以你不注意会话复制问题。如果您禁用它,Elastic Load Balancing 将循环选择一个 EC2 实例来满足您的用户请求。但是有些 EC2 实例没有用户会话,您的用户可能会退出您的系统。 但是缩减(减少 EC2 实例)也可能导致您的用户丢失状态。【参考方案3】:

这是一个关于如何使用 DynamoDB 和 Tomcat 配置持久会话的教程。 https://packageprogrammer.wordpress.com/2014/01/13/aws-elastic-beanstalk-and-dynamodb-session-manager-for-tomcat/

AWS 项目:https://github.com/aws/aws-dynamodb-session-tomcat

使用 DynamoDB 管理 Tomcat 会话状态:http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-tomcat-session-manager.html

以上链接的关键摘录。请注意,由于本教程使用 aws-dynamodb-session-tomcat 的 Tomcat 7 和 1.0.1,您可能会更改版本号

Tomcat 的配置

从aws-dynamodb-session-tomcat 下载 AmazonDynamoDBSessionManagerForTomcat-2.0.4.jar 释放并复制到您的 Tomcat 安装的 lib 目录 编辑 context.xml 以使用带有代码的 .jar:

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
             createIfNotExist="true" />
</Context>

Elastic Beanstalk 的配置

从aws-dynamodb-session-tomcat 下载 AmazonDynamoDBSessionManagerForTomcat-2.0.4.jar 并复制到 WAR 的 .ebextensions 目录中 使用以下代码编辑 context.xml 并复制到 WAR 的 .ebextensions 目录中 在 .ebextensions 目录中(记住它必须在 /WEB-INF 目录中,对于 grails 应用程序必须在 /web-app 中),创建一个 .config 文件以编写执行 context.xml 替换的命令并复制 Beanstalk 实例中的 jar .

container_commands:
  01-copy-aws-library:
    command: "cp WEB-INF/.ebextensions/AmazonDynamoDBSessionManagerForTomcat-2.0.4.jar.jar /usr/share/tomcat8/lib/"
  02-replace-tomcat-context:
    command: "cp WEB-INF/.ebextensions/context.xml /etc/tomcat8/context.xml"

现在,只需上传并部署带有更改的战争。尝试登录并进入 AWS Console->Services->DynamoDB,查找名称为 Tomcat_SessionState 的表,瞧!你有亲和力和坚持!

【讨论】:

【参考方案4】:

根据个人经验,我建议将会话移至数据库 (RDS|DynamoDB|SimpleDB) 或缓存服务器(AWS 最近开始支持 Redis)。当应用程序开始扩展或因健康检查不成功而终止时,会很头疼。

【讨论】:

【参考方案5】:

在弹性缓存上使用 Redis 来存储会话的更好选择。一个 t1.micro 节点可在免费层使用,由 Amazon 维护,因此您可以获得稳定、廉价和快速的会话存储,在自动缩放环境中的节点之间共享。如何配置 PHP 以在 Redis 中保持会话我猜你可以在互联网上找到。

使用 DynamoDB 的选项可能很昂贵,因为您需要为每次调用 DynamoDB 服务付费,还需要考虑到 HTTP(S) 公开的 AWS 服务可能会限制请求。

【讨论】:

【参考方案6】:

我认为管理此问题的唯一方法是将会话存储在 DynamoDB 或类似数据库中。 当我们在 Elastic Bean 环境中的 Tomcat 上部署基于 Java 的应用程序时,我们遇到了完全相同的问题。 当负载均衡器用于缩减实例时,连接到该实例的任何用户都会自动注销。 将会话移至 DynamoDB 为我们解决了这个问题。

【讨论】:

【参考方案7】:

在将 Elastic Beanstalk 与典型的 Java Web 应用程序一起使用时,我认为您肯定希望启用会话粘性。否则,来自用户浏览器的每个 HTTP 请求都可能被路由到不同的服务器。

要解决当用户“卡住”的服务器关闭时用户会话被破坏的问题,您需要查看 Tomcat 会话复制。不幸的是,这不是 Elastic Beanstalk 开箱即用的东西,因此为了设置会话复制,您必须创建一个自定义 Elastic Beanstalk AMI 供您的应用程序使用。此外,您必须使用不依赖多播的 Tomcat 会话复制的实现,因为多播在 AWS 或我知道的任何其他云环境上不可用。不依赖多播的实施示例是使用数据库(例如 Amazon RDS)或 memcached 服务器(例如 Amazon Elastic Cache)来使会话跨多个 Tomcat 实例可用。

另请注意,Elastic Beanstalk UI 仅允许您启用负载均衡器生成的 HTTP cookie。但是,在 Elastic Beanstalk 创建负载均衡器后,您可以进入 EC2 控制台并修改负载均衡器的设置以将其切换为应用程序生成的 HTTP cookie,然后告诉它使用“JSESSIONID”cookie。

【讨论】:

以上是关于在 Elastic Beanstalk 中维护会话的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloudformation 模板在 AWS Elastic Beanstalk 中包含粘性会话

AWS Elastic Beanstalk 上的 Java 应用程序会话超时

将 ElastiCache 连接到 Elastic Beanstalk 实例

Amazon Elastic Beanstalk 腻子

使用 Elasticache 在 Elastic Beanstalk 上未收到任何 cookie

如何更改 Elastic Beanstalk 的 RDS 实例