5

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

4

7 回答 7

9

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

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

于 2013-09-07T18:36:20.243 回答
3

如果一个应用程序是用 PHP 构建的,如何在多个实例之间维护会话?

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

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

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

于 2013-09-08T21:31:41.750 回答
2

这是一个关于如何使用 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 目录中,/web-app 用于 grails 应用程序),创建一个 .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 的表,瞧!你有亲和力和坚持!

于 2016-12-05T19:20:40.220 回答
1

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

于 2013-09-15T08:39:55.600 回答
0

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

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

于 2013-10-30T08:39:24.267 回答
0

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

于 2013-10-31T11:15:17.197 回答
0

在将 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。

于 2013-10-31T11:44:48.450 回答