![静态文件服务器集群](https://linux22.com/image/640652/%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%9B%86%E7%BE%A4.png)
如果这个问题(必然)有点宽泛,我提前表示歉意。我会尽力将其保持在有效问题的格式中。
我目前正在设置后端,用于处理大量静态文件(具体来说是图像)。最终产品的总体流量预计会非常大,因此必须具备可扩展性和规避各种瓶颈的能力。
我最初的结论是,实现此目的的最佳方法是设置虚拟服务器集群来处理请求。我将使用标准负载平衡策略,以确保客户端请求在集群中的节点之间均匀分布,因此这部分没有问题。
该部分是问题是如何高效地将静态文件本身存储在集群上。我们预计会有非常大的数据量(TB 级),而在每个节点上保留文件的镜像副本根本不是一个选择。
看来我基本上只剩下两个选择:
1) 使用一个节点可以向其发出请求的中央文件服务器。然而,我发现很难看出如何才能阻止该服务器成为瓶颈。
2)将1)与节点上的某种缓存机制结合使用,以避免对文件服务器进行冗余请求。
3) 其他一些出色的解决方案将拯救我的灵魂并使 1) 和 2) 变得过时。
什么是获得这种文件分发的良好策略,以及有哪些软件可以实现这种分发?
提前谢谢您!
答案1
A一致性环哈希至少从算法上来说,这是解决此类问题的经典方法。Swift、memcached、Dynamo、Riak 等系统都使用这种方法来解决此问题。
OpenStack Swift具体来说,它是一个使用一致性环哈希来跟踪和分发对象、容器等的对象/blob 存储。您可以直接使用 Swift 或类似的东西来解决您的场景,或者使用一致性哈希环构建自己的解决方案。使用像 Swift 这样的解决方案的好处是不需要自己开发,而且还包括通过复制、版本控制等进行数据保护。
如果你不必自己运行它,而是对托管服务感兴趣,那么Rackspace 云文件(基于 Swift),或亚马逊 S3提供以 CDN(分别为 Rackspace 和 Amazon 提供 Akamai 和 CloudFront)为前端的对象存储和检索。CDN 将大大提高地理分散的客户端的检索效率。