我第一次开发需要相当大规模扩展的应用程序,我以前从来没有一个应用程序需要在多个实例上运行。
这通常如何实现?我是否对SQL服务器进行集群,然后在所有服务器上镜像编程并使用负载平衡?
或者我是否将功能分开在一台服务器上运行一些?
另外,如何将代码推送到我的所有EC2窗口实例?
答案 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)和数据库层分开。与单片应用程序相比,切片架构的扩展性最佳。
所有这些都可以使用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配置可能非常简单。
我真的希望有人在这里指出一个相反的论点,我很乐意听到它。