在X个服务器上分配文件

任何build议如何我可以从1台服务器分配数以百万计的文件到X数量的其他服务器? 我正在寻找更多的关于如何决定哪个服务器发送文件的algorithm。

要求:

  • 没有分贝
  • 基于perl / python / shell
  • 能够从任何方框运行,并在相同的目标服务器上结束

也许看看像GlusterFS这样的分布式文件系统。 这听起来像是会满足你所有的要求,而且可能比你自己破解的东西更可靠。

尽pipe你的要求不可行,但根据我为Github做的这些经验,我将会为将来不会受到束缚的其他人写下我的想法。

基于哈希分布在多个位置(分区,机器,数据中心)的数据是一项危险的工作,原因有二:

  1. 你永远不会得到一个基于你的散列数据的平衡分布 – 不一定是因为散列不平衡(虽然这也是一个因素),但更多的是因为你存储的项目是不相同的大小。 所以你存储了两个项目,一个1kB大小,另一个1GB大小。 你已经大量失衡了。 尝试几次,突然之间你会有很大的不平衡。
  2. 一旦你的散列到服务器algorithm就位,你不能改变存储你的数据的“桶”(机器,分区,不pipe)的数量,而没有太多的痛苦。 这是因为散列algorithm既用于决定哪里存储的东西,也用于再次find它 。 如果你改变了服务器的数量,那么“where stuff is”的规则就会改变,所以现有的一些数据有望在其他地方出现。 最后,您可能会遇到冗长的离线“重新平衡”操作(每个服务器都会search新scheme中的数据,并将其移至其他位置),或者您必须在所有文件服务器上search数据(mmmm,低效)。

另一方面,查找所有文件的表格会导致这些问题消失。 当你说“没有数据库”,我打赌你在“数据库”之前插入一个隐含的“SQL”。 但是,还有一个与SQL无关的其他数据库世界,对于这种情况来说是非常完美的。 他们被称为“关键价值商店”,如果你不愿意继续打造自己的boondoggle,那么我强烈build议使用一个(我有Redis的经验,但他们都看起来很漂亮合理)。

但是,最终,如果你继续使用“所有的哈希,所有的时间”系统,然后解决它所固有的问题(有解决scheme,而不是真正的真棒),所有你最终将会这一天是GlusterFS的一个半分类,非结构化,非function完整的版本。 如果你需要大量的存储空间,随着时间的推移,分布在多个物理机器上,在一个单一的命名空间,我真的会推荐它,你可以build立自己的任何东西。

如果你仍然想破解它,请在每个文件上执行md5sum,然后将输出散列到X框中。

如果你有两个框:

0 * -7 *去框一个8 * -f *去框二…

或者如果你有256个盒子:00 * -0f *去盒子一个10 * -1f *去两个盒子..等等..

(2,4,4,6,…)

请记住,洗牌的事情都很好,但是如果你还需要检索这个信息,你会希望保留一个索引。

(我把foo.txt放在哪里?

一个平面文件泡菜(在Python中)可以工作,但不会像大数据量的数据库那样扩展。

其他服务器也可以发送文件吗? 你在“安全”的环境?

Rocks集群的安装过程必须填充机架后的计算节点,每个安装在一个初始映像上。 做到线性或通过一台服务器将是一个瓶颈。 Rocks使用了一个名为Avalanche的小系统,在这个系统中,安装映像是使用p2p来提供的; 随着节点的出现,它们也成为将用于安装新节点的服务器。 结果是一个服务器树,安装图像很快地通过机架级联。 整体延迟是节点数量的对数,乘以安装一个节点的时间(对数的基数取决于可以从已经安装的节点中提供多less个其他节点,基准日志20不会令人吃惊…)。

你可以想象一个类似的策略来复制你的文件,但只有当目标服务器愿意信任其他服务器的副本。