什么是基于2种类型变量(在php中)实现加权随机选择的最佳方法?

时间:2009-06-17 19:33:23

标签: php weighting

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

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

任何人都可以建议一个很好的PHP实现吗?

4 个答案:

答案 0 :(得分: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上。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

实现它的方法如下:

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

    $total_weight = 0.0;
    for ( $i = 10; $i <= sizeof($weights); $i++) {
      $total_weight += #weights[$i];
      if($rand <= $total_weight) {
    return $i;
      }
    }
    
  7. 返回的值是服务器的索引

答案 3 :(得分:1)

你进入了distributed filesystems的世界 - 一个比你预期的更大的问题空间。

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

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

这样做很复杂。如果可以避免,请不要重新发明轮子。如果你不得不重新发明轮子,至少要花一些时间看看别人是如何建造他们的。