Fessで大量のドキュメントを検索したい場合、サーバのスペックを上げて対応する方法以外に、複数台のサーバを用意して対応することも可能です。今回は複数サーバ上にFessを構築する方法をご紹介します。
Fessをクラスタ構成にする方法
Fessをクラスタ構成にする場合、Fessが利用しているElasticsearchをクラスタ構成にすることで実現できます。まずElasticsearchクラスタを構築し、そのElasticsearchクラスタに複数のFessのインスタンスが接続することで、Fessをクラスタ構成として利用できるわけです。
今回はFess 13.7.0を利用し、2台のWindwos Server 2016にFessをインストールしてクラスタ化する方法を説明します。FessのZIPファイルは、適宜公式サイトのダウンロードページから入手してください。
Fessのインストールガイドを参考に、FessとElasticsearchを各サーバにインストールします。なお、以降でクラスタの設定をしていくので、FessとElasticsearchはまだ起動しないでください。
Elasticsearchのクラスタ用設定
まず、Elasticsearchのクラスタ化に必要な設定を行います。本稿ではd:\optディレクトリ配下にインストールする前提で解説しますが、パスに関しては構築する環境に合わせて設定してください。
今回は2台のサーバしかないため、全てのノードを「Master-eligible node」とし、全てのアドレスからアクセス可能な設定にしています。本運用のクラスタを作成する場合は、要件に合わせてElasticsaearchのドキュメントを参照し、適切なクラスタ構成で構築してください。
elasticsearch\config\elasticsearch.ymlを開いて、以下を入力します。「cluster.name」は両サーバとも同じ名前を設定してください。今回は、2台のサーバのホスト名をそれぞれ「fess01」「fess02」としています。
◆fess01サーバでの設定
cluster.name: elasticsearch-test
node.name: fess01
network.host: 0.0.0.0
discovery.seed_hosts: ["fess01", "fess02"]
cluster.initial_master_nodes: ["fess01", "fess02"]
configsync.config_path: d:/opt/elasticsearch/data/config/
◆fess02サーバでの設定
cluster.name: elasticsearch-test
node.name: fess02
network.host: 0.0.0.0
discovery.seed_hosts: ["fess01", "fess02"]
cluster.initial_master_nodes: ["fess01", "fess02"]
configsync.config_path: d:/opt/elasticsearch/data/config/
Fessのクラスタ用設定
FessがElasticsearchクラスタを利用するための設定をします。fess\bin\fess.in.batを開いて、以下を設定します。
ES_HTTP_URL=http://localhost:9200
FESS_DICTIONARY_PATH=d:/opt/elasticsearch/data/config/
ジョブの起動を制御する設定をします。fess\app\WEB-INF\classes\fess_config.propertiesを開いて、各サーバでそれぞれのホスト名を指定します。
◆fess01サーバでの設定
scheduler.target.name=fess01
◆fess02サーバでの設定
scheduler.target.name=fess02
Elasticsearchの起動
サービスの起動は、Elastisearchを起動してからFessを起動する、という順になります。まずは各サーバのElasticsearchだけを起動します。
各サーバでサービスを起動したら以下のコマンドを実行して、Elasticsearchのクラスタの状態を確認します。
> curl –X GET localhost:9200/_cluster/health?pretty
{
"cluster_name" : "elasticsearch-test",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 1,
"active_shards" : 2,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
「status」が「green」になり、「numberofnodes」の値がクラスタ内のサーバの数と一致していればOKです。結果が違う場合は、Elasticsearchのログを見てメッセージを確認してください。
Elasticsearchの起動が完了したら、次はFessのサービスを起動します。
Fessの起動
Fessの初回起動の場合、必要な設定をElasticsearch上に作成するため、まずは1つのFessサービスだけを起動します。
管理画面にログインして、ダッシュボード上部の「cluster」「nodes」「rest」「more」部分が緑色であることを確認してください。
正常に起動できていることを確認してからほかのサーバのFessを起動します。起動後は、各サーバでFessにアクセスできることを確認してください。また、管理画面にログインしてダッシュボードにElasticsearchクラスタが表示されれば問題ありません。
以上でFessをクラスタ化することできました。
クロール設定
クラスタ化したFessでクロールしてみましょう。今回は、fess01サーバだけで実行されるクロールジョブを作成します。
まずは、管理画面の左メニューで「クローラ」>「ウェブ」をクリックして、適当にクロール設定を作成します。
次に、管理画面の左メニューで「システム」>「スケジューラ」をクリックして、「Default Crawler」をクリックします。「編集」ボタンをクリックして、「対象」に「fess01」を入力し、「更新」ボタンをクリックします。
対象を設定することで、ジョブは指定されたサーバだけで起動するようになります。 対象を設定したジョブをfess01で「今すぐ開始」をクリックして、ジョブを開始してください。クロールが完了するまでしばらく待ちます。
検索
クロール完了後、fess01またはfess02のサーバにアクセスして、検索してみてください。以下のような検索結果が表示されます。
* * *
今回は2台のサーバをクラスタ化しましたが、同じ設定方法で2台以上をクラスタ化することも可能です。数十台のサーバをクラスタ化することで、インデックスが冗長化され、数千万ドキュメント以上の検索環境を構築することもできます。
著者紹介
菅谷 信介 (Shinsuke Sugaya)
Apache PredictionIOにて、コミッター兼PMCとして活動。また、自身でもCodeLibs Projectを立ち上げ、オープンソースの全文検索サーバFessなどの開発に従事。