服务器节点如何将内容快速分发到所有CDN节点?

How do server nodes distribute content to all CDN nodes in a quick manner?

假设我们有一个处理用户上传内容的主服务器。

主服务器接收文件并将其发送到CDN。 CDN 是如何快速将新文件分发到全球所有节点的?将内容单独发送到每个节点不会花费几分钟吗?

第 1 部分:复制(节点间分布)

问题:你有多个服务器,一个是“主”,另一个是“副本”/“从”,如何避免手动上传内容到每个服务器?

案例1:如果你的内容是静态的,html/js或者其他文件(没有DB):

您的网络服务器(nginx 或 apache 或其他)指向服务器上的某个位置,对吗?

我们将使用 2 个工具,rsync 和 cron 调度程序。 Rsync 允许您在 2 个服务器之间同步目录,因此如果服务器 A(源)中的文件夹被修改,这些修改将被复制到目标服务器 B 上。 同步命令示例:

rsync -rtu --delete /var/my/source/web/server root@x.x.x.x:/var/my/destin/web/server

其中x.x.x.x是目标机器IP。

您可以阅读 rsync 手册或任何教程以了解更多信息。

现在这个命令只会同步一次,所以每次主服务器上有修改时你都需要运行它,当然我们不会手动同步。所以你可以在crontab中添加这个命令。为此:

crontab -e

然后只需输入频率(每小时?每分钟?每周)和命令: 每十分钟 运行 一个命令的示例:

*/10 * * * * rsync....

同样,您可以阅读更多有关 cron 的内容并根据需要设置频率。

情况2.如果需要复制DB:

只需对 Web 服务器执行相同的操作即可复制文件,并且根据您的数据库引擎,您将必须进行数据库复制。以下是一些示例:

https://www.techrepublic.com/article/how-to-set-up-database-replication-with-mariadb/ https://dba.stackexchange.com/questions/65351/sync-two-mysql-databases-in-two-different-locations 由您自己解决这个问题,或者单独提出一个关于数据库复制的问题。

在所有服务器上,您的 Web 服务器应该具有相同的配置,并且它们都应该具有用于​​相同域和相同 SSL 证书的虚拟主机。

第 2 部分:访客访问:

这是比较棘手的地方,现在您已准备好所有服务器,访问者如何重定向到不同的服务器?

最简单的,如果你想让它们随机重定向,你可以使用所谓的“round robin DNS”

为同一个域添加多个A 名称记录,但每个记录将有不同的IP。根据路线,用户 通常 会被引导到最近的节点,但他们也可能会被重定向到离他们有点远的节点,这取决于路线和各种网络因素。

更高级的方法,你可以使用(付费)负载平衡解决方案和一些地理 feature/closest 节点策略,这将简化事情(但这有点像作弊),例如: scaleway 的负载均衡服务。

或者,如果您想自己完成:使用高级(付费)geo DNS 服务

GeoDNS takes the geographical location from where a query is coming from and answers that query depending on what the owners of that domain have preset for that specific user's location. -constellix So as the domain owner, you define which region get redirected to which of your servers following a policy of (GeoProximity - Location Based DNS)

https://constellix.com/news/everything-you-need-to-know-about-geodns https://easydns.com/features/geo-dns/

结论:

这显然不是一项只需 1 小时即可完成的任务,而且您自己实施起来也不便宜。始终记得在便宜的(临时)服务器上进行试验,而不是在您的生产服务器上进行试验。