Findit – Node.js实现的磁力搜索引擎

废话写前头

源起

2013底的时候,我从上一家公司离职,由于各种原因休息了一段时间,年后才入职新公司。休息的这段时间,除了搭建这个个人网站、看书、帮以前学校完成一个CMS系统(目前没有使用,使用ASP.NET实现的,后面可能会把代码放到Github上)外,还有一个大的发现,就是Xiaoxia写的一个磁力链接搜索引擎。相信大家都知道这是干什么的,粗略看完Xiaoxia写的介绍后,真是脑洞打开,兴趣满满。本打算自己开发一个出来玩玩,奈何对ASP.NET/C#缺乏深入了解,写起来很累,又打算投入新的工作中,所以只得作罢。

2014年加入新公司后,频繁的使用了Node.js,渐渐的发现Node的强大,磁力搜索引擎的想法又重新浮现。可以说,这一年我大部分的学习都是围绕“Findit磁力搜索引擎”展开的,看我博客写的文章就会发现:Redis、Mongodb、PM2、Elasticsearch、甚至Centos和Nginx,都是Findit使用到的技术。在实践中学习,这本身也是花大力气做这件事的目的。

上线

2014-10-25网站正式上线。域名是http://findit.keenwon.com(旧域名是:http://findit.so),在Digitalocean上使用了三台VPS:

  • 第一台部署了Findit站点本身(express.js、nginx)和单个节点的Elasticsearch
  • 第二台部署了Mongodb数据库(目前有300W数据库,每日新收录1W+的数据)
  • 第三台部署了AntColony磁力链接爬虫(后面细说)

好景不长

但是好景不长,不用说大家也知道,使用BT种子下载的都是什么东西,盗版、色情充斥其中。本来还想放点Google AdSense实现自负盈亏的,结果还没一个月就收到了警告邮件,要求我整改,深知此问题无法解决,索性也就把广告给下了,每个月一两百的VPS钱还是出得起的(呵呵)。

另外一点就是,14年12月,“带头大哥”海盗湾被瑞典警方连窝端了,什么?你说这个关我p事?当然关我的事了。AntColony从DHT网络中收集到资源的infohash后,要去种子托管网站下载种子文件,读取文件内容,收录到系统中才能被用户搜索到。海盗湾被查封的同时Zoink和Torrage这两个种子托管站也被封了(目前Zoink还活着),这就影响到了资源的收录。

海盗湾事件更重要的影响是,我的信念被动摇了。很多国家禁止使用BT下载盗版资源,而国内大多数人用来干什么大家都懂的(我看的到用户搜索的关键字)。还有就是BT本身的特性,要大家一起下载才快,Findit收录的资源,可能已经没人下载了,用户使用搜索到的磁力链接下载资源,很可能根本没有速度。这些都让我怀疑“磁力链接搜索引擎”存在的意义,只能以“重在过程”聊以自慰了:开发过程中,我确实学到不少。所以,可能不久的将来,findit会被关闭,但我希望代码可以被留存下来,帮到需要它的人。好了废话到此为止。

相关知识

这部分我不打算细说,google都能搜出来,我只列一下我觉得比较好的资料:

大概就这些了。

AntColony

AntColony(Github)是findit磁力搜索引擎的核心。用来在DHT网络中,收集活跃资源的infohash,下载并解析资源的种子文件,存入数据库等。AntColony是若干功能的合集,也可以单独运行其中的部分功能,所以起“蚁群”这个名字也是很贴切的(没错,我就是爱动物世界)。主要分一下几块:

  • worker:爬虫,收集资源infohash,可以同时启动多个进程的worker,提高效率
  • male:根据收集来的infohash去下载种子文件
  • female:将种子文件录入数据库
  • queen:简单的入口,启动pm2运行worker,male和female

先来张AntColony和谐运行的靓照:

目前启动5个worker使用3000-3004的端口,2个male和1个female。

使用Mongodb储存数据,这没什么好说的;使用pm2维护和监控node进程,也没太多要说的,重点说下Redis。Redis里暂存的数据大概是这样的:

比较大的一个K桶(bucket);infohash就是已经收集到的infohashs(worker收集来的,male会用来下载种子);remoteNodes是worker新认识的节点,会依次“拜访”的,目前只保存最新的10w个(一方面我的VPS内存小,另一方面真没必要记录太多);sysInfo会记录一些统计信息,例如发出多少次请求,累积收集多少infohashs,目前已经发出15亿次Request,这个频率是可控的,worker太疯狂的话,VPS扛不住。

下面简单说下运行方法,安装好node,pm2,redis,mongodb之后,执行npm install 下载依赖的包,在根目录运行node startup worker 3000 启动一个worker监听3000端口;运行node startup male 1 启动id为1的male(female同理)。

mongodb-to-elasticsearch

刚才说AntColony的时候没提到Elasticsearch。Elasticsearch是一个非常赞的实时分布式搜索引擎,惊人的强大和便捷,可以方便的在Node环境中使用elasticsearch.js操作。但是在实际使用中发现个问题,female将种子文件解析好后,存储在mongodb,再存储在Elasticsearch,这个过程效率很低。经常会堆积大量种子文件处理不过来。另一方面,没有必要那么“实时”,既浪费资源有增加了Elasticsearch的压力。所以就搞了mongodb-to-elasticsearch这个小工具,每天执行一次mongodb到Elasticsearch的数据同步。代码很简单,有兴趣的可直接看Github上的代码。

Findit

Findit是基于Express.js开发的一个小网站,只有一个简单的功能,就是查Elasticsearch。有了AntColony和mogodb-to-elasticsearch就有了数据,想怎么玩都随你了,不多说。

存在的问题

虽然稳定运行中,但是任然存在几个问题:

1、需要足否大的内存运行AntColony。目前AntColony的VPS内存是1G,Redis占用了一部分,剩下可用的内存是500M左右,如果大于遇到700K的种子文件(大概的),female就会卡住解析不存在,内存占用率不断提高,直到被PM2重启。

由于female是随机取出种子文件解析的,所以一段时间后还会遇到问题文件,继续卡住,如此不断的重复……,目前的解决办法,就是移走大文件,在自己电脑上运行female解析。当然不差钱的人可以用性能更强悍的机器。

2、目前mongodb-to-elasticsearch是手动执行的。先停止female,然后程序会把上次执行时间节点后,新增的数据同步过来。效率还不错,1W多的数据几十秒就好了。但是手动执行还是太麻烦,下一步优化的方向是定时执行或者优化female,直接同步Elasticsearch。

最后

前面也提到了,可能不久后会把findit关闭,如果大家有好的想法可以留言讨论。



标签: , , , ,

Comments

  1. 回复

    • By KeenWon

      回复

      • 回复

        • By KeenWon

          回复

  2. By 淡淡的忧伤

    回复

    • By 淡淡的忧伤

      回复

    • By KeenWon

      回复

      • By 淡淡的忧伤

        回复

        • By KeenWon

          回复

          • By 淡淡的忧伤

  3. 回复

  4. 回复

    • By KeenWon

      回复

      • 回复

        • By KeenWon

          回复

  5. By welefen

    回复

  6. By reg_2010

    回复

  7. By reg_2010

    回复

    • By KeenWon

      回复

  8. By help_me

    回复

    • By KeenWon

      回复

      • By help_me

        回复

      • By help_me

        回复

      • By help_me

        回复

        • By KeenWon

          回复

  9. By Issac

    回复

  10. By 不正经

    回复

    • By KeenWon

      回复

  11. By 测试

    回复

  12. By 张**

    回复

张**进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

无觅相关文章插件,快速提升流量