Mar*_*tin 5 architecture algorithm distributed-computing web-crawler
让我假装我拥有10,000台机器的网络.我想尽可能快地使用所有这些机器来抓取网页.所有页面只能下载一次.此外,必须没有单点故障,我们必须尽量减少机器之间所需的通信次数.你会怎么做到这一点?
有没有什么比使用一致性散列更有效地在所有机器上分配负载并最小化它们之间的通信?
小智 0
一种想法是使用工作队列(目录或数据库),假设您将计算存储以满足您的冗余标准。
\n\n\\取回
\n\n\\检索\\server1
\n\n\\检索\\服务器...
\n\n\\检索\\server10000
\n\n\\进程中
\n\n\\完全的
\n\n1.) 所有要成为种子的页面都将被散列并使用散列作为文件根放置在队列中。
\n\n2.) 在放入队列之前,请检查完整队列和正在进行的队列,以确保不会重新排队
\n\n3.) 每个服务器从检索队列中检索随机批次 (1-N) 个文件,并尝试将其移至专用队列
\n\n4.) 重命名过程失败的文件被假定为已被另一个进程 \xe2\x80\x9cclaimed\xe2\x80\x9d
\n\n5.) 可以移动的文件将被处理,在进程内目录中放置一个标记,以防止重新排队。
\n\n6.) 下载文件并将其放入 \\Complete 队列中
\n\n7.) 从进程内目录和服务器目录中清除文件
\n\n8.) 每 1,000 次运行就会检查最旧的 10 个进程内文件,方法是尝试将它们从服务器队列移回常规检索队列。如果服务器挂起,这将有所帮助,并且还可以对慢速服务器进行负载平衡。
\n\n对于检索、进程内和完整服务器,大多数文件系统讨厌 1 个目录中的数百万个文件,根据散列 \\abc\\def\\123\\ 的字符将存储划分为段 \\abc\\def\\123\\ 将是文件 abcdef123FFFFFF 的目录\xe2\x80\xa6。如果您要扩展到数十亿次下载。
\n\n如果您使用 mongo DB 而不是常规文件存储,那么大部分问题都可以避免,并且您可以从分片 etc\xe2\x80\xa6 中受益
\n