基本上我的困境就是这个。我有一个托管文件的x服务器列表。还有另一台服务器,它托管网站的mysql数据库和应用程序。当文件上传(到前端服务器)时,应用程序检查哪个服务器上有最多可用空间,并将文件移动到那里。如果您开始使用具有相同可用空间量的2个以上空服务器,则此工作正常。如果你稍后将另一台服务器引入混合......它将拥有比当前服务器更多的可用空间,这种方法不是那么有效,因为所有新文件都会被遗忘地上传到新服务器,这会超载因为它将处理大部分新流量,直到它在可用空间方面赶上其余的盒子。
所以我想引入一个加权系统,这将有助于规范化文件的分发。因此,如果3个服务器各自设置为33%,并且1个服务器具有更多的可用空间,则它仍然会获得比其他服务器更多的上载(即使它具有相同的权重),但是负载将分散在所有服务器上服务器。
任何人都可以建议一个很好的PHP实现吗?
答案 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)
实现它的方法如下:
运行以下循环:
$total_weight = 0.0;
for ( $i = 10; $i <= sizeof($weights); $i++) {
$total_weight += #weights[$i];
if($rand <= $total_weight) {
return $i;
}
}
返回的值是服务器的索引
答案 3 :(得分:1)
你进入了distributed filesystems的世界 - 一个比你预期的更大的问题空间。
在这个领域已经做了很多工作/研究。您应该考虑使用像MogileFS这样的可用解决方案,或者至少对他们如何解决您遇到的问题(以及您尚未遇到的问题)进行一些研究。
我的意思是“你还没有遇到的问题”的例子:你实际上不应该存储每个文件的至少2个副本,这样如果丢失了一个服务器,你就不会丢失所有文件它上面的文件?当然,一旦你开始这样做,你不应该同时从多个服务器读取单个文件的部分,以获得性能提升吗?当然,现在您必须弄清楚文件的分布方式,服务器出现故障时如何重新分配,新服务器上线等等......等等......
这样做很复杂。如果可以避免,请不要重新发明轮子。如果你不得不重新发明轮子,至少要花一些时间看看别人是如何建造他们的。