2016-09-25 75 views
1

我是AWS新手,开始测试创建一个EC2实例。我打算部署一个简单的ASP.Net网站,我将直接在EC2实例上托管我的数据库。无状态和实例数据库

现在,我听说在开发ASP.Net应用程序时我需要小心,因为它需要“无状态”,我不能依靠ASP.Net SessionState来维护数据。

我通常的做法是将状态存储在数据库中,因为(理论上)任何ASP.net应用程序都将访问相同的数据库。

这是我的主要问题:

  1. 在我来说,我将主持在同一个EC2实例数据库,会话状态的问题会怎样?

和其他附带问题:

  • 我甚至都不需要担心,现在,因为我只有一个EC2实例?
  • 未来我可能会将我的“实例”数据库移动到RDS。在那种情况下,我可以安全地将会话状态存储在数据库上,或者有更好的解决方案?
  • 回答

    3
    1. 就我而言,我会将数据库托管在同一个EC2实例中,会话状态的问题会发生吗?

    不,您不会在这种情况下遇到会话状态问题。当单个用户的HTTP请求分布在多个Web服务器上时,会遇到会话状态问题。即使你有多个Web服务器,你可以使用粘性会话,或者使用类似Redis的分布式会话存储来缓解这个问题,如果你不想完全无状态的话。

    我建议你花时间了解什么是无状态网络架构,以及它正在尝试解决什么问题。将会话从一个地方(Web服务器)移动到另一个地方(数据库服务器)不会使您的应用程序变为无状态,并可能导致将您的可伸缩性瓶颈从一个位置简单地移动到另一个位置。

    1. 我现在甚至不需要担心,因为我只有一个EC2实例?

    正确,你不需要担心只有一个EC2实例。就像在单个笔记本电脑上运行应用程序时测试应用程序一样,您不必担心它。

    但是,如果您认为将来需要跨越多个服务器扩展您的应用程序以处理更高的负载,那么您至少需要考虑如何在您处于早期阶段时完成目标设计你的应用程序的阶段。

    1. 将来我可能会将我的“in-instance”数据库移动到RDS。在这种情况下,我可以安全地将会话状态存储在数据库上,或者有更好的解决方案吗?

    如果要存储在Web层(这将使Web层的容易横向扩展和负载分配)外会话状态,那么你可以使用一个RDS数据库。但是,如果每次处理请求时必须加载和更新该记录,那么这可能会导致相当大的数据库IO。我可以看到这是一个真正的瓶颈。

    我强烈推荐在这种情况下使用Redis服务器,而不是关系数据库。亚马逊的托管Redis服务称为ElastiCache。

    2

    是的,您可以在同一个实例中安装/托管数据库。唯一的要求是当你启动你的实例时,确保AMI是EBS支持的。启动实例时,您将从AMI启动它。如果AMI是EBS支持的,即使停止实例,您的根卷仍然存在。 Amazon EC2 Root Device Volume

    如果您的数据库不需要大量计算和内存资源,如果您在同一实例中运行数据库,则不会有任何问题。我建议你:

    • 当启动你的实例并在附加卷中安装你的数据库时附加一个卷。为了获得更高的性能,您可以选择为您提供快速I/O的磁盘类型。
    • 选择具有足够CPU和内存的实例类型。你甚至可以启动您的实例
    • 可以迁移你的数据库到RDS后
    • 你可以考虑DyanamoDB(停止实例后)撞了CPU /内存,但它是一个的NoSQL数据库