无状态和实例数据库

时间:2016-09-25 00:03:08

标签: asp.net amazon-web-services amazon-ec2

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

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

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

这是我的主要问题:

  1. 在我的情况下,我将在同一个EC2实例中托管数据库,会话状态的问题会发生吗?
  2. 和另一个附带问题:

    1. 我现在甚至不需要担心,因为我只有一个EC2实例?
    2. 将来我可能会将我的“实例内”数据库移动到RDS。在这种情况下,我可以安全地将会话状态存储在数据库中,还是有更好的解决方案?

2 个答案:

答案 0 :(得分:3)

  
      
  1. 在我的情况下,我将在同一个EC2实例中托管数据库,会话状态的问题会发生吗?
  2.   

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

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

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

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

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

  
      
  1. 将来我可能会将我的“实例内”数据库移动到RDS。在这种情况下,我可以安全地将会话状态存储在数据库或那里   是更好的解决方案吗?
  2.   

如果您打算在Web层之外存储会话状态(这将实现Web层的轻松水平扩展和负载分配),那么您可以使用RDS数据库。但是,如果每次处理请求时都必须加载并更新该记录,则可能导致数据库IO相当繁重。我可以看出这是一个真正的瓶颈。

我强烈建议在此方案中使用Redis服务器,而不是关系数据库。亚马逊的托管Redis服务称为ElastiCache。

答案 1 :(得分:2)

是的,您可以在同一实例中安装/托管数据库。只有在启动实例时才需要确保AMI是EBS支持的。启动实例时,您将从AMI启动它。如果AMI受EBS支持,则即使停止实例,您的根卷也会保留。 Amazon EC2 Root Device Volume

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

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