如何使用EC2在多个服务器上分发您的应用程序?

时间:2012-11-18 14:36:47

标签: windows amazon-ec2 load-balancing scaling autoscaling

我第一次开发需要相当大规模扩展的应用程序,我以前从来没有一个应用程序需要在多个实例上运行。

这通常如何实现?我是否对SQL服务器进行集群,然后在所有服务器上镜像编程并使用负载平衡?

或者我是否将功能分开在一台服务器上运行一些?

另外,如何将代码推送到我的所有EC2窗口实例?

3 个答案:

答案 0 :(得分:8)

这取决于您的要求。但作为一般准则(我假设一个网站),我会将db,webserver,缓存服务器等分离到不同的实例,并使用s3(+ cloudfont)来获取静态资产。我还要确保适当的速率限制到位,以便只有合法的负载在基础设施上。

对于RDBMS服务器,我可能会设置主从数据库设置(RDS使这更容易),使用数据库分片等。数据库集群解决方案也存在,设置起来会更复杂,但会简化应用程序的数据库访问程序员。我还会相应地检查所有数据库查询和调优db / sql查询。在某些情况下,纯粹的NoSQL类型数据库可能比RDBMS更好,或者两者兼而有之,应用程序根据所需数据在它们之间切换。

对于webserver,我将设置一个loadbalancer,然后在loadbalancer后面的webserver实例上使用autoscaling。类似的东西将适用于app服务器(如果有的话)。我还将调整Web服务器设置。

缓存服务器也将分离到其实例集群上。 ElastiCache似乎是一项很好的服务。 Redis具有与memcache相当的性能,但具有更多功能(如列表,集等),在扩展时可能会派上用场。

答案 1 :(得分:6)

免责声明 - 我不打算提及任何Windows细节,因为我一直在Unix机器上工作。这些指南非常通用。

这是一个主观问题,每个人都会以独特的风格定制自己的系统。以下是我遵循的一些指导原则。

如果是Web应用程序,请将表示(前端),中间件(API)和数据库层分开。与单片应用程序相比,切片架构的扩展性最佳。

  1. 数据库 - 亚马逊为SQL和NoSQL数据存储提供优质且高度可用的服务(除非您在我们的东部可用区域)。您可能想要查看关系数据库的RDS和NoSQL的DynamoDb。两者都可以很好地扩展,您无需担心在启动数据存储后管理和加载分片/群集数据存储。
  2. 中间件API - 这是至关重要的部分。拥有一组API(最好是REST,但你几乎可以在这里使用任何东西)将你的后端功能作为服务公开是非常重要的。面向服务的体系结构可以非常容易地扩展,以满足多个面向前端的客户端,例如Web,移动,桌面,第三方小部件等。中间件API通常不应该是处理业务逻辑的地方 ,大部分(或全部)都应该转换为数据库查找/查询以获得更高的性能。这些服务可以进行负载平衡以实现高可用性。亚马逊的Elastic Load Balancers(ELB)对初学者有好处。如果您想进行更多自定义,例如阻止某些IP地址集的流量,执行Blue/Green deployments,那么您可能应该考虑将HAProxy负载平衡器部署到单独的实例。
  3. 前端 - 这是您的表示层应该驻留的位置。它应该避免任何直接的数据库查询,除了那些仅限于前端范围的查询,例如:一个简单的Redis调用来获取前端片段的最新缓存键。从服务调用到前端片段,您可以在这里执行大量缓存。您可以使用AWS CloudFront进行静态资产投放,使用AWS ElastiCache进行缓存存储。 ElastiCache只是一个托管的memcached集群。您甚至应该考虑对ELB后面的前端节点进行负载平衡。
  4. 所有这些都可以使用AWS Elastic Beanstalk与AutoScaling捆绑和部署。它目前支持ASP .NET,PHP,Python,Java和Ruby容器。 AWS Elastic Beanstalk仍然有其自身的局限性,但是以最少的监控,扩展和负载平衡来管理您的基础架构是一种非常酷的方式。

    提示:识别应用程序的读写密集区域有很大帮助。然后,您可以继续相应地对基础架构进行切片,并一次执行所需的读取或写入优化。

    总而言之,Amazon AWS几乎可以用来制作服务器拓扑。你可以选择组件。

    希望这有帮助!

答案 2 :(得分:2)

我这样做的方法是,将1台服务器作为运行mysql的数据库服务器。我在memcached上的所有数据,可以跨越多个服务器和我的客户端,只需一个简单的“if not on memcached,从db读取,将其放在memcached上并返回”。

与数据库相比,Memcached非常容易扩展。数据库扩展需要大量的管理工作。要让它正确和有效,这是一种痛苦。所以我选择了memcached。事实上,我有额外的memcached服务器,只是为了管理停机时间(如果我的任何memcached)服务器。

我的数据主要是读取,很少写。当写入发生时,我也将数据推送到memcached。总而言之,这对我,代码,管理,后备,故障转移,负载均衡方式更有效。一切都胜利。你只需要更好地编写“小”一点。

集群mysql更具诱惑力,因为它似乎更容易编码,部署,维护和保持并执行。记住mysql是基于硬盘的,而memcached是基于内存的,所以本质上它更快(至少10次)。并且由于它接管了db的所有读取负载,因此您的db配置可能非常简单。

我真的希望有人在这里指出一个相反的论点,我很乐意听到它。