Fessで扱うデータはElasticsearchのインデックス内に保持して管理されています。ある時点のデータをバックアップしておき、データを復元できるようにしたい場合は、Elasticsearchスナップショット機能を使ってインデックスのデータをリストアします。今回はインデックスのバックアップやリストアなど、インデックスの管理方法についてご紹介します。

インデックスのバックアップとリストア

スナップショットは「ある時点における状態」のバックアップデータで、ローカルのファイルシステムやS3などのオンラインのストレージ上に作成できます。今回は、ローカルのファイルシステムに保存したスナップショットを別サーバにリストアする場合の手順を説明していきます。

操作は以下の順番で行います。

  1. リポジトリの登録
  2. スナップショットの取得
  3. リストアの実行

動作は、Fess 13.9.3、Elasticsearch 7.9.3で確認しています。また、FessとElasticsearchの環境は既に構築してあるものとします。

スナップショットのリポジトリの登録

まず、スナップショットを保存する出力先として、リポジトリ用のディレクトリを作成します。そのディレクトリはElasticsearchのプロセスがアクセスできるように、ユーザーとグループは「elasticsearch」に指定します。

$ sudo mkdir -p /var/backup/elasticsearch/
$ sudo chown elasticsearch:elasticsearch /var/backup/elasticsearch/

Elasticsearchがそのディレクトリを利用するために、「elasticsearch.yml」に「path.repo」を登録します。「path.repo」に設定するパスは、先ほど作成したディレクトリです。

path.repo: ["/var/backup/elasticsearch/"]

elasticsearch.ymlを更新したら、Elasticsearchを再起動します。Fessが起動している場合は、Fessのサービスを停止してからElasticsearchを再起動してください。

再起動後、以下のコマンドでリポジトリをElasticsearchに登録します。

curl -X PUT "localhost:9200/_snapshot/fess_backup?pretty" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "fess_backup"
  }
}
'

以下が返ってきたら成功です。

{
  "accepted" : true
}

スナップショットの取得

次にスナップショットを取得します。以下は全てのインデックスを取得する例ですが、保存したいインデックスを指定して取得することも可能です。

curl -XPUT "localhost:9200/_snapshot/fess_backup/[スナップショット名]?wait_for_completion=true&pretty"

以下は実行例です。ここではスナップショット名はいつ取得したかわかるように日付を指定しています。「”state”」が「”SUCCESS”」になっていることを確認します。

# curl -XPUT "localhost:9200/_snapshot/fess_backup/snapshot_20200715?wait_for_completion=true&pretty"
{
  "snapshot" : {
    "snapshot" : "snapshot_20200715",
    "uuid" : "FLSNb3ffRzuPOnAqZ5G_Kw",
    "version_id" : 7080099,
    "version" : "7.9.3",
    "indices" : [
      ".fess_config.file_authentication",
      ".fess_user.user",
      "fess_log.search_log",
            ... 省略 ...
      ".fess_config.duplicate_host",
      "fess_log.click_log",
      ".fess_config.related_content"
    ],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "start_time" : "2020-07-15T04:08:37.731Z",
    "start_time_in_millis" : 1594786117731,
    "end_time" : "2020-07-15T04:08:39.743Z",
    "end_time_in_millis" : 1594786119743,
    "duration_in_millis" : 2012,
    "failures" : [ ],
    "shards" : {
      "total" : 87,
      "failed" : 0,
      "successful" : 87
    }
  }
}

リポジトリ登録時に作成したディレクトリを見ると、/var/backup/elasticsearch/fess_backupディレクトリ配下にスナップショットが出力されているのが確認できます。

リストアの実行

取得したスナップショットからインデックスをリストアします。

取得したスナップショットを保存しているディレクトリ「/var/backup/elasticsearch/」をリストア先のサーバにコピーします。リストア先のElasticsearchにも同じ手順でリポジトリ登録をしておきます。

リストアする際、同じ名前のインデックスが存在しているとリストアはできないので、以下のいずれかを実施する必要があります。

  • インデックスを削除する
  • インデックス名を変更してリストアする

ここでは、検索用のインデックスが保存されている「fess.20200715」を「restored_fess.20200715」という別の名前にしてリストアします。

curl -XPOST "localhost:9200/_snapshot/fess_backup/snapshot_20200715/_restore?pretty" -H 'Content-Type: application/json' -d '{
    "indices": "fess.20200715",
    "ignore_unavailable": "true",
    "include_global_state": false,
    "rename_pattern": "fess.20200715",
    "rename_replacement": "restored_fess.20200715"
}'

以下が返ってきたら成功です。

{
  "accepted" : true
}

リストア先のFessの管理画面を見てみます。ダッシュボードに「fess.20200715」と、別名でリストアした「restored_fess.20200715」が表示されていれば成功です。

リストア先のダッシュボード

リストア先のダッシュボード

リストアしたインデックスをFessに反映するために「fess.search」と「fess.update」のエイリアスを張り替える必要があります。

curl -XPOST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d '{
  "actions": [
         {"add": {"index": "restored_fess.20200715", "alias": "fess.search"}},
         {"add": {"index": "restored_fess.20200715", "alias": "fess.update"}},
         {"remove": {"index": "fess.20200715", "alias": "fess.search"}},
         {"remove": {"index": "fess.20200715", "alias": "fess.update"}}
    ]
}'

リストア後は、古いインデックスは削除してください。

インデックスデータの操作

Fessでは、コマンドでElasticsearchのデータを扱う以外に、管理画面でもインデックスのデータに対する操作を行うことができます。管理画面にログインして、「システム情報」の「メンテナンス」画面で操作します。

再インデクシング

既存のfessインデックスから新しいインデックスを再作成することができます。インデックスされているドキュメント内容は変更されませんが、Analyzerや辞書などのインデックス系の設定を更新し、新しいインデックスを作成します。また、辞書の初期化やシャード数などを変更することができます。

ドキュメントインデックスのリロード

ドキュメントインデックスのリロードボタンをクリックすると、Analyzerなどのインデックスの設定情報を反映できます。

Crawlerインデックス

.crawlerインデックスにはクロール中の情報が保存されます。クロールを強制終了などしたときに残ったクロール情報を削除したい場合などに利用することができます。

* * *

今回は、インデックスの管理について紹介しました。バックアップやインデックスのメンテナンスをする際はぜひ利用してみてください。

著者紹介

菅谷 信介 (Shinsuke Sugaya)

Apache PredictionIOにて、コミッター兼PMCとして活動。また、自身でもCodeLibs Projectを立ち上げ、オープンソースの全文検索サーバFessなどの開発に従事。