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

基本上我的困境就是这个。我有一个托管文件的x服务器列表。还有另一台服务器,它托管网站的mysql数据库和应用程序。当文件上传(到前端服务器)时,应用程序检查哪个服务器上有最多可用空间,并将文件移动到那里。如果您使用具有相同可用空间量的2个以上空服务器,这可以正常工作。如果你稍后将另一台服务器引入混合......它将拥有比当前服务器更多的可用空间,这种方法并不是那么有效,因为所有新文件都将难以上传到新服务器,这会超载因为它将处理大部分新流量,直到它在可用空间方面赶上其余的盒子。 所以我想引入一个加权系统,这将有助于规范化文件的分发。因此,如果3个服务器各自设置为33%,并且1个服务器具有明显更多的可用空间,则它仍然会获得比其他服务器更多的上载(即使它具有相同的权重),但是负载将分散在所有服务器上服务器。 任何人都可以建议一个良好的PHP实现这个?     
已邀请:
一种方法是将所有具有空间来保存文件的服务器上的所有可用空间相加(因此显然可以排除具有可用空间但不足以保存文件的服务器)。然后确定每个服务器占用的空间百分比(因此新服务器将占比例更大的百分比)。使用随机数并将其与百分比对齐以确定要选择的服务器。 例如,考虑使用具有以下可用空间级别的五台服务器:
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上。     
流量平衡通常非常关键。您可以添加某种加权系统来平衡它(虽然,正如您所说,新服务器仍然会比其他服务器重载更多),或者其他一种服务器永远不会连续两次被击中的交替方法,就像一个例。 但我认为我可能会人为地平衡服务器数据,以便通过将内容从一个移动到另一个来使它们几乎相等,然后让原始或加权/交替算法正常工作。 这不是一个仅限php的实现,而是一些需要考虑的想法。     
实现它的方法如下: 在你的情况下创建一个包含所有空白空间的数组{0.5,0.5,1.0} 创建第二个权重数组 - 服务器中的空间量除以空间总量,因为它在第一个数组中表示 - {0.25,0.25,0.5} 获取一个随机数,通过调用1.0 * mt_rand()/ mt_getmaxrand()归一化为(0.0,1.0) 运行以下循环:
$total_weight = 0.0;
for ( $i = 10; $i <= sizeof($weights); $i++) {
  $total_weight += #weights[$i];
  if($rand <= $total_weight) {
return $i;
  }
}
返回的值是服务器的索引     
您已经进入了分布式文件系统的世界 - 一个比您预期的更大的问题空间。 在这个领域已经做了很多工作/研究。您应该考虑使用像MogileFS这样的可用解决方案,或者至少对他们如何解决您遇到的问题进行一些研究(以及您尚未遇到的问题) 我的意思是“你还没有遇到的问题”的例子:你不应该实际存储每个文件的至少2个副本,这样如果丢失了一个服务器,你就不会丢失所有文件它?当然,一旦你开始这样做,你是否应该能够同时从多个服务器读取单个文件的部分,以获得性能提升?当然,现在您必须弄清楚文件的分布方式,服务器发生故障时如何重新分配,新服务器何时上线等等...... 这样做很复杂。如果可以避免,请不要重新发明轮子。如果你必须重新发明轮子,至少要花一些时间看看其他人是如何建造他们的。     

要回复问题请先登录注册