我正在pipe理多个网站,大部分基于WordPress,并且都基于LAMP堆栈。 我正在将我的所有网站移至Amazon云。 我是AWS的新手,我的计划是从一个最小的网站开始移动一个网站。
我的问题是我应该把我所有的网站放在1个独立的实例上的1个EC2实例和1个网站上吗?
这可能听起来很愚蠢,因为任何人都可以在传统的虚拟主机上下文中select后者。 我之所以想到前者,是因为:
可扩展性
我相信在几个月的时间里,我现在需要的计算能力大约比现在多3倍(新网站发布,现在我有6个,到那时我将有10个;现有网站的stream量增长很快)。 无论如何,让我说我决定去水平缩放,例如使用目前我正在使用的3个相同types的实例。
所以我的进一步的问题是,这种情况将如何影响我的决定,我应该分离我的网站,还是把所有的一组EC2实例放在一起?
我知道这可能与我正在阅读的Amazon云上的垂直和水平缩放之间的差异有关。 这也可能与虚拟机/服务器有关的知识有关,其中我是一个完全白痴,但如果有必要,不会介意更多。 不过,我想我应该问一下,因为这可能会影响我应该关于亚马逊云的方向。 随意给我一个耳光,如果你认为我是这样一个懒惰的凹凸,应该做我的作业第一:)
所有的帮助非常感谢!
免责声明:请告知,如果这应该张贴在superuser.com或任何stackexchange网站。 谢谢
首先,一些原始数据,取自S. Ostermann等人,2010 :
基本实例规格:
+-----------+---------+------+-------+-------+------+-------+---------------+---------------+ | Name | ECUs | RAM | Archi | I/O | Disk | Cost | Reserve | Reserved Cost | | | (Cores) | [GB] | [bit] | Perf. | [GB] | [$/h] | [$/y], [$/3y] | [$/h] | +-----------+---------+------+-------+-------+------+-------+---------------+---------------+ | m1.small | 1 (1) | 1.7 | 32 | Med | 160 | 0.1 | 325, 500 | 0.03 | | m1.large | 4 (2) | 7.5 | 64 | High | 850 | 0.4 | 1300, 200 | 0.12 | | m1.xlarge | 8 (4) | 15 | 64 | High | 1690 | 0.8 | 2600, 4000 | 0.24 | | c1.medium | 5 (2) | 1.7 | 32 | Med | 350 | 0.2 | 650, 1000 | 0.06 | | c1.xlarge | 20 (8) | 7 | 64 | High | 1690 | 0.8 | 2600, 4000 | 0.24 | +-----------+---------+------+-------+-------+------+-------+---------------+---------------+
基本性能/成本分析:
+---------------+------------+----------+--------+-----------+---------+--------+-----------+----------+ | System | Peak Perf. | HPL | STREAM | RandomAc. | Latency | Bandw. | GFLOP/ECU | GFLOPS/$ | | | [GFLOPS] | [GFLOPS] | [GBps] | [MUPs] | [µs] | [GBps] | | | +---------------+------------+----------+--------+-----------+---------+--------+-----------+----------+ | m1.small | 4.4 | 1.96 | 3.49 | 11.6 | - | - | 1.96 | 19.6 | | m1.large | 17.6 | 7.15 | 2.38 | 54.35 | 20.48 | 0.7 | 1.79 | 17.9 | | m1.xlarge | 35.2 | 11.38 | 3.47 | 168.64 | 17.87 | 0.92 | 1.42 | 14.2 | | c1.medium | 22 | 3.91 | 3.84 | 46.73 | 13.92 | 2.07 | 0.78 | 19.6 | | c1.xlarge | 88 | 51.58 | 15.65 | 249.66 | 14.19 | 1.49 | 2.58 | 64.5 | | 16x m1.small | 70.4 | 27.8 | 11.95 | 77.83 | 68.24 | 0.1 | 1.74 | 17.4 | | 16x c1.xlarge | 1408 | 425.82 | 16.38 | 207.06 | 45.2 | 0.75 | 1.33 | 33.3 | +---------------+------------+----------+--------+-----------+---------+--------+-----------+----------+
实际performance通常低于理论performance的50%。 一组可能值得怀疑的值是c1.medium的值,这与预期的结果(例如带宽)不太一致。
EC2对于典型工作负载的主要成本是实例成本 – 其他成本(带宽,configuration存储等)通常低于总成本的25%。 人们并不期望性能能够完美地扩展 – 从上面的数据可以看出这一点。 特别是在横向扩展方面,似乎随着您添加更多的计算能力,效率显着下降。
鉴于上述情况,并记住除了原始计算性能(例如I / O性能,内存等)之外,还有其他因素(如I / O性能,内存等),垂直缩放是最经济的方法。
不幸的是,除了场景的经济性外,还有其他一些考虑因素。 可靠性是关键。 通过一个实例,该实例的失败就会取消整个设置。 一个可能的解决scheme可能是自动扩展(即保持实例计数为1),但是单个实例仍然倾向于在给定的可用性区域中可能发生的问题等。
在某些时候,需要横向扩展 – 这个问题只是成为理想时间的一个问题。 我可能会build议: – 垂直缩放至less几个实例大小(更重要的是,如果你从t1.micro开始) – 将你的数据库分离成单独的实例(因为它们的大小和你的web服务器不一样)水平缩放,直到有一点冗余 – 垂直缩放,直到达到最大实例大小 – 此后水平缩放(可能最初使用较小的实例)
回到手边的问题 – 每个实例(或每个实例集)运行一个网站总是会更加昂贵。 除了固定成本更高(例如,每个网站一个负载均衡器,而不是一个负载均衡器),您将不会有效地利用您的实例(例如,一个网站可能会在其他网站大部分空闲 – 这意味着你有一些实例超载,其他人坐着闲置)。 在后勤方面,这个问题可能不会像人们想象的那样糟糕 – 主要问题归结为独立pipe理所有事情(您可能通过一些configurationpipe理工具(例如Puppet / Chef)来避免),但这通常不是一个步骤直到你的设置变得更大)。
另一方面,EC2实例的限制之一就是您只能将一个公共IP地址分配给给定的实例(这对某些SSL设置有一些影响)。
您当然可以创build自己的AMI – 实际上这是相当标准的做法。 我通常从亚马逊的Linux AMI开始,因为我发现它是一个开销最小(资源相当简单,速度快),最好由AWS(定期更新等)支持的产品 – 我更喜欢RHEL / CentOS (亚马逊的Linux所基于的)发行版到另一个stream行的select的Debian / Ubuntu发行版。 一旦您定制了一个实例,您可以拍摄EBS卷的快照并注册一个AMI – 将快照ID作为基础卷的映像。 从理论上讲,你可以定制你的操作系统,甚至在构build自己的发行版(但仍然使用Amazon内核)的范围内 – 但是,除非你有一个非常具体的用例,否则这不太可能是特别有利的。 我个人对运行Wordpress的偏好是Varnish + Nginx + PHP-FPM(和W3TC for WordPress) – 我发现它的资源比典型的LAMP堆栈容易得多。
最后,再次解决缩放问题。 除了上面讨论的问题的基本经济学之外,困难归结为使多个实例“出现”为一体。 这包括确保每个实例都提供相同的数据,实例之间的负载平衡,以及处理PHP会话等细节。 如果每个站点都在自己的一组实例上运行,将会更困难 – 但可能不会有明显的优势(因为您希望将这些functionconfiguration到AMI中)。 然而,多个实例意味着一个更复杂的系统,还有更多的东西需要关注。 (在这个话题上,关于ServerFault有很多问题,比如这个 , 这个 ,或者这个 – 如果你需要关于如何扩展特定设置的细节,请把它作为另一个问题。
作为一个结论性意见 – 除非你的设置特别需要单个站点在自己的实例/集群上运行(例如,完全不同的configuration/需求),否则我会倾向于在单个实例/集群上运行多个站点,因为它更简单规模化,经济化,高效化,更加符合“云计算”(即共享资源)的精神。
参考文献: