请允许我向您提供一些细节和背景,以便您了解原因和整个问题。当然,任何关于以下结构的建议/反馈非常感谢。
此外,我与下面可能看到或想象到的任何公司均无关联。
我正在负责为一家公司“设计”一个好的计划的项目。
他们有 500 多个网站,都使用相同的数据库(MySQL 后台),并且面向全球。所有网站都有必须彼此通用的图像。换句话说,所有网站都使用相同的图像(- 或至少希望如此)
例如
website1.com/image.jpg,
website2.com/image.jpgwebsite1.com/image-de.jpg
website2.com/image-de.jpg
正如您所理解的,这些图像是经过地理定位的,但为了更快地进行管理,所有这些网站的名称都保持不变。
然而,他们并没有“设计”好它,一段时间后,服务器之间的延迟和图像的管理变成了一场彻底的灾难。
简而言之,
3 个大洲,每个大洲有一台服务器和一台专用 MySQL 服务器。办公室里有一台装有 MySQL 的开发人员服务器。除此之外,还有一个 Cloudflare 负载均衡器,用于根据区域和“服务器健康状况”正确分配流量。
Global load balancer
|
| | |
V V V
Region1 Region2 Region3 "Office"
| | | Sends ONLY
V V V
WebServer1 <-rsync-> WebServer2 <-rsync-> WebServer3 <- DevServer
| | |
V V V
DBMS-MySQL <-rsync-> DBMS-MySQL<-rsync-> DBMS-MySQL <- DBMS
请注意,根据流量大小,可能会在一个区域放置第二台服务器。因此,“本地”结构将是
Global load balancer
|
V
Region1 -> Local load balancer
|
Server:local-1 <- -> Server:local-2
| |
-> MySQL server <-
服务器中每个大陆的备份和单独的 S3 实例以及最坏的情况是开发服务器是最终备份。
现在,想象一下图片文件夹就像一个大“图片篮”。那么,“图片篮”如何才能普遍地附加到每个网站上呢?
所有服务器将rsync
每 15 到 30 分钟使用一次(我认为这很容易做到)来重新同步核心文件,例如“HTML/CSS 文件等”。
我在这儿的开销大吗?
还有其他解决方案可以“保持服务器始终更新”吗?
当然,其中一个是主要的,并且我相信主要的-第一个-主服务器将是托管管理面板等基本功能的开发服务器。因此,在“推送”之后,开发服务器将“推送”或“rsync”所有内容到所有三个区域服务器。
正如您所理解的,如果我“rsync”/image/ 文件夹,这将是一个巨大的问题。我们必须讨论 500 多个 /image/ 文件夹,每个文件夹大约 20 GB(目前)。所以我们需要 500*20GB = 10.000GB 的额外空间来存储图像。您可以理解,这不是这种情况。
1) 一个“肮脏”的解决方案可能是,将所有图片托管在一台服务器上,每个网站都使用 HTTP 请求来获取正确的图片。糟糕的解决方案因为您可能会在流量高峰时段对自己的应用程序进行 DDoS 攻击。
2) 在我看来,/image/ 文件夹必须位于单独的实例或“其他任何东西”中,以便在每个服务器上(换句话说,每个网站上)快速使用。是否有任何服务可以绑定至少 3 个不同地区的 Web 服务器?我还没有找到任何接近这一点的服务。
至少,您认为对“共享图像篮”问题有解决方案吗?
有一个问题有类似的内容:可靠的文件共享但据我所见和所理解,他的情况有所不同。
更新-澄清
1)例如,无论访问哪个站点,也无论位于哪个地区,对 /image/foo.png 的请求都应始终返回相同的文件。
2) 各区域的地理参考是什么:3 个不同的大洲。因此,如果我们谈论的是 Digital Ocean,则有三个不同的“私有网络”,如果我们谈论的是 AWS,则有三个不同的 VPC,等等。
3) 有多少流量:流量与解决方案无关。想想流量和请求的大幅增加。为低流量提供解决方案是没有意义的,当流量增加一倍以上时,再“设计”它或尝试升级 CPU/RAM/STORARE-GB 是没有意义的。这就是为什么我建议在一个区域使用“本地”负载平衡器,使用“副本”机器来分配和绕过大量流量。