我想知道以下方案是否可行。另外,如果您认为我发现了错误,请随时指出。
我必须为一家公司提出并创建一个系统架构模式,该公司目前在 3 个不同位置运行 3 台不同的服务器(不同的服务器提供商),每台服务器托管大约 50++ 个网站。
所以,现在的情况是这样的:
服务器1:
- website1.com
- website2.com
- website3.com
- website4.com
- ....
服务器2:
- website21.com
- website22.com
- website23.com
- website24.com
- ....
服务器3:
- website31.com
- website32.com
- website33.com
- website34.com
- ....
Server1 有一个很大的 MySql 数据库,其他每个服务器(server2、server3 和包含的 server1)都通过远程 mysql 连接使用该数据库。
所以,
来自 server1 服务器的 MySQL 服务器:
- server1(本地)
- server2 (远程)
- server3 (远程)
域 website1.com 下的 Server1 有一个包含图像的文件夹,服务器上的所有其他网站(包括 server1)都必须访问这些图像。
例如:
website1.com 使用图片文件 image/image1.jpg,同时 website2.com 和 website3.com 使用相同的 image1.jpg 作为 http://website1.com/image/image1.jpg
此外,每个服务器上的每个网站每次都会检查文件是否存在。实际上,检查是由 php 完成的,在服务器端。它们使用 本地检查图像是否存在,if_file_exist()
并使用 远程检查图像是否存在if (getheaders() ==200 )
例如
如果访问者尝试访问 website1.com,则 website1.com(实际上是服务器 1)将检查if website1.com/image/image1.jpg exists
。同样,如果访问者尝试访问 website21.com,则 website21(实际上是服务器 2)将检查if header of http://website1.com/image/image1.jpg == 200
。
所以,
server1 上的 website1.com/image/image1.jpg 访问所有网站并检查该图片是否存在:
- website1.com
- website2.com
- ....
- website21.com
- website22.com
- ....
- website31.com
- website32.com
- ....
在我看来,
最好的情况可能是这样的:
3 个 AWS EC2 实例作为运行服务器。1 个 AWS S3 存储桶,其中包含 /image/ 文件夹中的所有文件 1 个 RDS 数据库,为 3 个 EC2 实例中托管的所有网站提供服务。
在这种情况下,
一个 EC2 实例可以从 S3 存储桶中获取并检查文件是否存在,并且同一个 EC2 实例将从 RDS 获取数据库上的数据。
如果我是正确的,那么从 EC2 实例检查文件是否存在并从 S3 获取文件的延迟应该非常低,因为它应该是通过 AWS 基础设施“本地”进行的。
并且由于同样的原因,对共享 RDS 的查询应该更快、更安全。
所以,
如果访问者访问 website1.com
我们将有以下内容:
website1.com -> EC1 实例
- EC1 中的 html/php 文件
- 从 RDS 获取查询数据
- 从 S3 存储桶获取图像数据
website21.com -> EC2 实例
- 来自 EC2 的 html/php 文件
- 从 RDS 获取查询数据
- 从 S3 存储桶获取图像数据
这是一个可行的方案吗?还是我发现了错误?
您还看到其他选择吗?
另外一个选择:
通过使用 Amazon CloudFront 代替 S3 是否可以更快地解决问题?
编辑
由于以下原因,应进行检查:
image1.jpg 是一张图片。image1-es.jpg 是针对特定国家 ES(西班牙)的专用图片。
换句话说,服务器应该检查是否有专门针对来自 ES(西班牙)的访问者的图像,如果没有,则服务器提供一般图像。
答案1
您的计划可能会奏效,但可能不是最佳方案。S3 不是文件系统,因此您的应用程序可能需要重写才能利用它。有些软件可以让它看起来有点像文件系统。
你最好使用
- EC2 虚拟机
- EBS 卷最有可能只运行操作系统。如果您不担心与其他实例共享文件,则可以将部分或全部文件(静态 + PHP)放在 EBS 卷上。
- EFS(Elasic 文件系统)用于存储共享文件。如果您运行 Wordpress,整个 Wordpress 安装都可以在这里进行 - 这样,如果您扩展到运行同一网站的多个 Ec2 实例,您的 wp-content 文件夹等将共享,并且您只需维护一个 Wordpress 实例。请注意,这可能仍处于测试阶段。
- CloudFront 用于 CDN 文件传输
- 数据库的 RDS
提供特定区域的文件是您的软件和亚马逊基础设施的责任。