在另一个位置添加服务器

在另一个位置添加服务器

背景:我建立了一个典型的网站,让用户上传照片和视频(注意不要太大)。目前,我将该网站托管在英国伦敦的一个 DigitalOcean droplet(Nginx、PHP、MySQL、用于会话/缓存的 Memcached)上。我在爱尔兰有一个 S3 存储桶,我将文件从服务器上传到该存储桶。

问题:对于不在英国和欧洲的用户来说,上传速度较慢,有时甚至慢很多(例如来自美国或澳大利亚的用户)。这让他们很失望。

AWS 有一些非常酷的东西,例如S3 传输加速S3 预签名 POST(让用户直接上传到没有 AWS 凭证的存储桶)。但后者对 AJAX 不太友好 - 您可以要求 S3 返回 XML 响应,但由于这是跨域的,因此无法用 JS 读取。因此无法知道密钥(文件)名称。据我所知。

我也尝试过使用 AWS JavaScript SDK 直接上传到 S3 存储桶,但这意味着我必须强制我的用户重新进行身份验证,我想(我想避免这种情况)。

例如,我曾考虑在美国添加一台服务器并分离服务,即两台 Web 服务器、一台会话服务器和一台数据库服务器。然后使用基于延迟的路由和 Route 53 路由到延迟最低的 Web 服务器。但是,由于会话和数据库服务器与 Web 服务器位于不同的位置,因此存在高延迟问题。还有粘性会话问题。

我想知道是否有人对此有任何建议,也许我把它复杂化了,其实有一个更简单的解决方案。任何建议都非常感谢!

答案1

您有几种选择。

您可以设置 CloudFront 来提供您的所有内容(包括页面和上传),并查看它是否可以加快速度。所有流量(包括动态流量)都可以通过 CloudFront,而且它是一种高度优化的高带宽网络,本身就可以大大减少延迟。这本身可能足以让您的用户满意。您的服务器不在 AWS 上,因此这可能无法正常工作,但 CloudFront 支持任何来源。云Flare拥有类似的技术,它们代理您的所有流量并拥有私人网络,所以也值得一试 - 他们有一个免费套餐。

如果您想在美国添加另一台服务器,只需添加一个 Web 服务器即可。这些点之间的延迟大约为 70 - 110 毫秒。我会在美国设置一个与伦敦数据库通信的测试服务器,看看它是如何工作的。这将遍历公共互联网,因此一旦您通过测试,我建议使用加密 - 无论是数据库本机还是 VPN。

您可以在美国放置一个只读副本,并将写入流量定向到主数据库,读取来自只读副本。这意味着大多数流量都非常快,但偶尔的写入会稍微慢一些。由于您没有使用 AWS 服务器,因此您可能必须使用数据库本机复制,而不是简单的 AWS 只读副本设置。我不确定使用数据库本机是否可以轻松实现只读副本,或者您是否必须使用读/写副本。

您可以使用双主数据库配置,并在它们之间进行复制。如果用户不太可能同时更改两个位置的现有数据,或者如果架构很少进行修改,那么这种方法可能会很有效。副本滞后可能会有几秒钟,因此可能会导致一些状态问题,所以我可能不会首先尝试这种方法。

这是我脑海中的一些想法。告诉我你的想法,也许我会想到其他的办法。其他人可能有更好的解决方案。

相关内容