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

chr*_*ris 5 windows scaling load-balancing amazon-ec2 autoscaling

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

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

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

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

Jos*_*hin 8

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

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

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

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


rhe*_*nik 6

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

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

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

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

所有这些都可以使用AWS Elastic Beanstalk与AutoScaling捆绑和部署.它目前支持ASP .NET,PHP,Python,Java和Ruby容器.AWS Elastic Beanstalk仍然有其自身的局限性,但是以最少的监控,扩展和负载平衡的方式管理您的基础架构是一种非常酷的方式.

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

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

希望这可以帮助!