よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

HyperEstraierを利用する際に知っておきたいこと〜Node作成に限界?〜

全文検索エンジンのHyperEstraierは、用途に応じて複数のノードを作成することができます。
なので、ノード1ではサービスA関連のインデックス情報のみを、ノード2ではサービスBのインデックス情報のみを格納しておくということができます。
最近だと、マルチテナント化したアプリケーションが増えてきているため、HyperEstraierやSolrを活用してテナント毎にノードを作成しているところも多いかと思います。
テナント毎にノードを作成するようにしておけば、アプリケーションのバグによる他テナントへの情報漏えいなども防ぐこともできますしね。

今回は、そのHyperEstraierで複数のノードを作成するときに躓くポイントを1つ紹介します。

複数のノードを作成していると、ノードの作成時に以下のようなエラーがログに表示されることがあります。

ERROR DB-ERROR: database problem

何かのはずみでデータベースがロックされたので、初期化が必要なのだろうと思ってノードの再生成をしても、同一のエラーが発生してしまう状況に陥ります。
そんなときは、"ファイルディスクリプタの上限に達したのではないか"を疑いましょう。
私が試した環境(Fedora)だと、ファイルディスクリプタのデフォルト値は1024になっていました。
で、43のノード作成が正常終了した後から、上記で示したエラーが発生するようになりました。
調査の結果、ノード10個作成で消費するファイルディスクリプタはおおよそ256であることがわかりました。
そのため、44個目のノード作成でちょうどファイルディスクリプタの上限である1024に達したことになります。

もし、さらに多くのノードを追加したいのなら、ファイルディスクリプタの上限値を大きくする必要があります。
変更方法については以下のとおりです。

※ノード作成をするユーザは、ここではinteruとし、ファイルディスクリプタの上限値を2048に変更するとします。

(1) /etc/security/limits.conf に以下を追加


interu soft nofile 2048

interu hard nofile 2048

(2) システムにログインしなおす


interuユーザになって以下のコマンドを実施して2048になっていればOKです


$ ulimit -n


以上で、ファイルディスクリプタの上限値を引き上げることができ、新規ノード追加が可能になります。
#ファイルディスクリプタの上限値は2048であるため、ノード数が80数個になるとまたエラーが発生するようになりますが...

まぁ、HyperEstraierはP2P機構を備えており、これを活用すればあまり問題とはならないかもしれませんが、ファイルディスクリプタが原因でノードが作成できないというのはなかなか気づくことができないので、知識として覚えておいたら問題発生時に迅速に対応できるかと思います。