这是我第一次开发需要大量扩展的应用程序,我以前从未有过需要在多个实例上运行的应用程序。
这通常是如何实现的?我是否集群 SQL 服务器,然后在所有服务器上镜像编程并使用负载平衡?
或者我是否分离出在一台服务器上运行一些在另一台服务器上运行的功能?
另外,我如何将代码推送到我的所有 EC2 Windows 实例?
这是我第一次开发需要大量扩展的应用程序,我以前从未有过需要在多个实例上运行的应用程序。
这通常是如何实现的?我是否集群 SQL 服务器,然后在所有服务器上镜像编程并使用负载平衡?
或者我是否分离出在一台服务器上运行一些在另一台服务器上运行的功能?
另外,我如何将代码推送到我的所有 EC2 Windows 实例?
这将取决于您的要求。但作为一般准则(我假设是一个网站),我会将数据库、网络服务器、缓存服务器等分离到不同的实例,并将s3 (+ cloudfont ) 用于静态资产。我还要确保适当的速率限制到位,以便基础设施上只有合法负载。
对于 RDBMS 服务器,我可能会设置一个主从数据库设置(RDS使这更容易),使用数据库分片等。数据库集群解决方案也存在,它的设置将更复杂,但简化了应用程序程序员的数据库访问。我还将检查所有数据库查询并相应地调整 db/sql 查询。在某些情况下,纯 NoSQL 类型的数据库可能比 RDBMS 或两者的混合更好,应用程序根据所需的数据在它们之间切换。
对于网络服务器,我将设置一个负载平衡器,然后在负载平衡器后面的网络服务器实例上使用自动缩放。如果有的话,类似的东西将适用于应用服务器。我还将调整 Web 服务器设置。
缓存服务器也将被分离到其实例集群中。ElastiCache似乎是一项不错的服务。Redis 具有与 memcache 相当的性能,但具有更多功能(如列表、集合等),这些功能在扩展时可能会派上用场。
免责声明 - 我不会提及任何 Windows 细节,因为我一直在 Unix 机器上工作。这些指南相当通用。
这是一个主观问题,每个人都会以独特的风格定制自己的系统。以下是我遵循的一些指导方针。
如果是 Web 应用程序,请将表示层(前端)、中间件 (API) 和数据库层分开。与单体应用程序相比,切片架构的扩展性最好。
所有这些都可以使用AWS Elastic Beanstalk与 AutoScaling 捆绑和部署。它目前支持 ASP .NET、PHP、Python、Java 和 Ruby 容器。AWS Elastic Beanstalk 仍然有其自身的局限性,但它是一种非常酷的方式来管理您的基础设施,同时监控、扩展和负载平衡的麻烦最少。
提示:识别应用程序的读取和写入密集区域很有帮助。然后,您可以继续对您的基础架构进行相应的切片,并一次执行所需的优化,并以读取或写入为重点。
总而言之,亚马逊 AWS 拥有几乎所有您可以用来制作服务器拓扑的东西。选择组件由您决定。
希望这可以帮助!
我会这样做的方式是,将 1 台服务器作为数据库服务器,并在其上运行 mysql。我在 memcached 上的所有数据,它可以跨越多个服务器和我的客户端,只需一个简单的“如果不在 memcached 上,则从 db 读取,将其放在 memcached 上并返回”。
与数据库相比,Memcached 非常容易扩展。数据库扩展需要大量的管理工作。让它正确和工作是一件痛苦的事。所以我选择memcached。事实上,我有额外的 memcached 服务器,只是为了管理停机时间(如果我的 memcached 有任何服务器)。
我的数据主要是读取,很少写入。当写入发生时,我也将数据推送到 memcached。总而言之,这对我来说效果更好,代码、管理、回退、故障转移、负载平衡方式。都赢了。您只需要更好地编写“一点”代码。
集群 mysql 更具诱惑力,因为它似乎更容易编码、部署、维护以及跟上和执行。请记住 mysql 是基于硬盘的,而 memcached 是基于内存的,因此本质上它更快(至少 10 倍)。而且由于它接管了数据库的所有读取负载,因此您的数据库配置非常简单。
我真的希望有人在这里指出相反的论点,我很想听听。