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などの開発に従事。