3

基本上我的困境是这样的。我有一个托管文件的 x 服务器列表。还有另一台服务器,托管该站点的 mysql 数据库和应用程序。当文件被上传(到前端服务器)时,应用程序会检查哪个服务器上的可用空间最多,并将文件移动到那里。如果您从 2 台以上具有相同可用空间的空服务器开始,这将正常工作。如果您稍后将另一台服务器引入混合中......它将比当前服务器拥有更多的可用空间,这种方法不是那么有效,因为所有新文件都将难以捉摸地上传到新服务器,这会超载因为它将处理大部分新流量,直到它在可用空间方面赶上其余的盒子。

所以我也想引入一个加权系统,这将有助于规范文件的分布。因此,如果 3 台服务器分别设置为 33%,并且其中 1 台服务器的可用空间显着增加,它仍然会比其他服务器获得更多的上传(即使它具有相同的权重),但负载会分散到所有服务器上服务器。

任何人都可以建议一个好的 php-only 实现吗?

4

4 回答 4

4

一种方法是将所有有空间保存文件的服务器上的所有可用空间相加(因此显然会排除具有可用空间但不足以保存文件的服务器)。然后确定每个服务器占该空间的百分比(因此新服务器将占比例更大的百分比)。使用随机数并将其与百分比对齐以确定选择哪个服务器。

例如,考虑拥有五个具有以下可用空间级别的服务器:

Server 1:   2048MB
Server 2:  51400MB
Server 3:   1134MB
Server 4: 140555MB

您需要存储一个 1500MB 的文件。这使服务器 3 停止运行,给我们留下了 194003MB 的总可用空间。

Server 1:  1.0%
Server 2: 26.5%
Server 4: 72.5%

然后选择 0 到 100 之间的随机数:40

Numbers between 0 and 1 (inclusive) would go to Server 1
Numbers > 1 and <= 26.5 would go to Server 2
Numbers > 26.5 and <= 100 would go to Server 4

所以在这种情况下,40 表示它存储在服务器 4 上。

于 2009-06-17T19:42:28.703 回答
1

流量平衡通常非常关键。您可以添加某种加权系统来平衡它(尽管正如您所说,新服务器仍然会比其他服务器过载更多),或者其他一些交替方法,其中一台服务器永远不会连续两次被击中,就像一个例子。

但我想我可能会人为地平衡服务器数据,以便通过将内容从一个移动到另一个来使它们几乎相等,然后让原始或加权/交替算法正常工作。

这不是一个仅 php 的实现,而只是一些需要考虑的想法。

于 2009-06-17T19:44:36.343 回答
1

一种实现方式如下:

  1. 在您的情况下,创建一个包含所有空白空间的数组,作为分数 { 0.5, 0.5, 1.0 }
  2. 创建第二个权重数组 - 服务器中的空间量除以空间总量,如第一个数组中所示 - { 0.25, 0.25, 0.5 }
  3. 通过调用 1.0*mt_rand()/mt_getmaxrand() 获取一个随机数,归一化为 (0.0,1.0)
  4. 运行以下循环:

    $total_weight = 0.0;
    for ( $i = 10; $i <= sizeof($weights); $i++) {
      $total_weight += #weights[$i];
      if($rand <= $total_weight) {
    return $i;
      }
    }
    

返回值是服务器的索引

于 2009-06-17T19:48:40.983 回答
1

您已经进入了分布式文件系统的世界——一个比您预期的更大的问题空间。

在这个领域已经做了很多工作/研究。您应该考虑使用像MogileFS这样的可用解决方案,或者至少对他们如何解决您遇到的问题(以及您尚未遇到的问题)进行一些研究

举一个我所说的“你还没有遇到的问题”的例子:你不应该实际上存储每个文件的至少 2 个副本,这样如果你失去了一台服务器,你就不会丢失所有文件它?当然,一旦您开始这样做,您是否应该能够同时从多个服务器读取单个文件的部分内容以提高性能?当然,现在你必须弄清楚文件是如何分布的,当服务器出现故障时它们是如何重新分布的,当新服务器上线时等等......

做到这一点很复杂。如果可以避免,就不要重新发明轮子。如果你必须重新发明轮子,至少花一些时间看看其他人是如何建造他们的。

于 2009-06-17T22:40:40.730 回答