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关闭,如果大家有好的想法可以留言讨论。



标签: , , , ,

    • 这是比较常规的做法。mongodb是数据库,做数据的持久化。Elasticsearch做搜索引擎,只对部分字段做分词,索引。两个职责不同。

      • 我看Elasticsearch的文档有说到文档类型的存储,这个不是类似mongodb?还是它只是在内存,没有持久化?

        • 会持久化到硬盘的,和mongodb类似,是面向文档型数据库。但是它的优势在于索引后,方便搜索,这是mongodb干不了的。
          但是Elasticsearch的又不能完全代替mongodb,因为它的实时性不好。
          所以,搜索的时候使用Elasticsearch,进入具体的资源页面,就直接从mongodb里取数据。

  1. 执行 node startup worker 3000 就一直停在 Starting PM2 daemon…那里没反应了,求助。。

    • 你是按照文档部署的吗?看看pm2版本,看看pm2 list有没有东西,看看pm2 logs有没有什么异常。
      代码部署之类问题,尽量在Github上提issues,那边比较方便。

  2. 博主,find_node正常返回,但是运行了半天,RecevieResponse也有十几万次了,而ReceiveRequest却一个也没有,我使用路由器设置了npnp并且启动了端口映射,还是没有,请问会是什么原因?为什么收不到任何request呢

      • 我不是完整安装的,我单独执行了worker,在js最后一行追加了exports.run(3003),在redis中观察sysInfo的内容,数据库等各项设置都正常

      • 在worker.js最后一行追加了exports.create(3003),这之前还加入了nat的一些代码,只是为了获取ip而已

      • 我不是完整安装的,我单独执行了worker,在js最后一行追加了exports.create(3003),在redis中观察sysInfo的内容,数据库等各项设置都正常

        • 那也会记录log的。另外,我也不太确定本地运行,还有一层层的路由,能不能收到request,不过我好像成功过,你可以调试下,看看发出的数据是不是完整。

  3. 想问下 为什么 用es索引完成数据后 首次搜索耗时4000以上 第二次降到100?求教 vps是四核4g ssd

    • 两次查询是同一个词的话,可能是有缓存,Elasticsearch是很强大的,也有点复杂,中文文档不多,我当时粗略的看了官方文档,现在印象不太深了。如果你觉得查询很慢的话,建议还是看看官方的文档,里面讲的很好。

  4. 最好还是使用mq,把请求es的操作放到mq中,既不影响业务,实时性也不错

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