2019年6月19日水曜日

エクストリーム・FESS・クローリング

こんばんは。
現在、知禅は1日に100万URLをクロールして処理する能力があります。

このあたりになると、意外なLimitに足を引っ張られるので、僕の解決策を書くことにしました。

きっちりソースを読んでいないのでアレですが、FESSは検索エンジンにかかわるデータをelasticsearchに保存しています。
※各インスタンス(サーバ)に依存する部分は/etcや/usr/share/fessの設定ファイルに書き込んでいます。
この時はBulk APIを多用しているみたいです。

通常のクロール速度だと問題ないのですが、クロール速度を上げるとelasticsearchのbulk数の上限に当たるようになります。
/etc/elasticsearch/elasticsearch.ymlでbulk上限を1000まで引き上げてみてください。
普通はこれで大丈夫だと思います。

さて、ここからがエクストリーム。
FESSのクローラは、.crawler.data、.crawler.filter、.crawler.queueの3つのindexを作ります。
この中で、.crawler.filterがクロール対象を制御しているようです。
100万件/dayぐらいになると、buik limitを1000に引き上げても、まだ足りずにbulk queueからあふれることがあります。

こうなると、クローラーがelasticsearchから.crawler.filterを読もうとしても、elasticsearchがデータを返してくれません。
クローラーは処理を続けてしまうので、クロール対象を正しく読み取れず、意図しないサイトをクロールしてしまうようなのです。

もし、FESSで100万URL/dayを超えるようなクロールを目指すなら、.cralwer.filterは別のノードに置いて、bulk queueからあふれても読み出せるようにインデックスを配置しないとならないでしょう。