我在美国东部(弗吉尼亚)地区的单个 Amazon EC2 实例上托管基于 ExpressionEngine 的网站。我使用 Ubuntu。
该网站允许会员发布自己的内容,并将其显示给其他会员和未登录的用户。
目标:我需要开始在全球范围内为同一个网站提供服务,速度同样快到香港、纽约和洛杉矶。
我考虑了两种解决方案:
1.为三个区域设置三个独立的 EC2 实例:弗吉尼亚、俄勒冈和新加坡。使用 Amazon Rot53 地理位置根据浏览器的 IP 地址将流量引导至实例。
优点:该网站在该地区加载速度很快。
反对意见:这本质上是三个独立的网站。除非我弄错了?
- 在距离所有三个地点同样遥远的区域中设置一个实例:(爱尔兰),并将服务器提升到最高可用性能。
优点:所有地区都使用同一个网站。
反方:要使其足够快,需要花费很多钱。
我的挑战:
a) 我不知道如何在多个 Ubuntu 实例之间实时同步服务器设置、数据库和内容。如果有懂行的人能向我解释如何做到这一点,我将不胜感激。
b) 我并不完全熟悉所有 Amazon AWS 资源。AWS 是否有内置方法,可让我实现在所选的三个地点以同样快的速度为全球单个基于 PHP/MySQL 的会员网站提供服务的目标?
答案1
方法有很多,但基本上你确实需要以某种方式在多个地理位置复制你的站点。
如果您的应用程序读取量很大(大多数网站都是这样),以下几个选项可能很合适。我不熟悉 Expression Engine,因此我不确定这些架构在您的案例中实施起来有多困难。
选项 1:跨区域只读副本
- 在每个区域都有一个 EC2 应用程序服务器
- 有一个读取副本各地区的数据库
- 仅写入您的主区域数据库
- 如果你必须处理文件上传,最好将它们存储在 S3 中,并让 CloudFront 将它们缓存在各个区域
选项 2:缓存代理
如果您的内容几乎完全是静态的,您可以在每个区域设置一个缓存代理。如果您不需要高级缓存规则CloudFront是一个非常简单的解决方案,否则您可以使用 varnish 来拥有 EC2 实例。
选项 3:数据库缓存
在您的场景中,数据库是最难分发的元素,因此您可以将其保留在单个区域中(并让其他区域连接到主区域中的数据库),然后在应用程序中使用数据缓存以最大限度地减少延迟。如果您的应用程序支持 memcache,那么 ElastiCache 可能是一个选择。