共有ファイルシステムリポジトリ

このリポジトリタイプは、Elasticsearchを自分のハードウェアで実行している場合にのみ利用可能です。Elasticsearch Serviceを使用している場合は、Elasticsearch Serviceリポジトリタイプを参照してください。

共有ファイルシステムリポジトリを使用して、共有ファイルシステムにスナップショットを保存します。

共有ファイルシステムリポジトリを登録するには、まずすべてのマスターノードとデータノードで同じ場所にファイルシステムをマウントします。次に、各マスターノードとデータノードのpath.repo設定のelasticsearch.ymlにファイルシステムのパスまたは親ディレクトリを追加します。稼働中のクラスターの場合、これには各ノードのローリング再起動が必要です。

サポートされているpath.repoの値はプラットフォームによって異なります:

LinuxおよびmacOSのインストールはUnixスタイルのパスをサポートしています:

Yaml

  1. path:
  2. repo:
  3. - /mount/backups
  4. - /mount/long_term_backups

各ノードを再起動した後、Kibanaまたはスナップショットリポジトリ作成APIを使用してリポジトリを登録します。リポジトリを登録する際には、ファイルシステムのパスを指定します:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_fs_backup",
  3. repository={
  4. "type": "fs",
  5. "settings": {
  6. "location": "/mount/backups/my_fs_backup_location"
  7. }
  8. },
  9. )
  10. print(resp)

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_fs_backup",
  3. repository: {
  4. type: "fs",
  5. settings: {
  6. location: "/mount/backups/my_fs_backup_location",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. PUT _snapshot/my_fs_backup
  2. {
  3. "type": "fs",
  4. "settings": {
  5. "location": "/mount/backups/my_fs_backup_location"
  6. }
  7. }

相対パスを指定した場合、Elasticsearchはpath.repo設定の最初の値を使用してパスを解決します。

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_fs_backup",
  3. repository={
  4. "type": "fs",
  5. "settings": {
  6. "location": "my_fs_backup_location"
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.snapshot.create_repository(
  2. repository: 'my_fs_backup',
  3. body: {
  4. type: 'fs',
  5. settings: {
  6. location: 'my_fs_backup_location'
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_fs_backup",
  3. repository: {
  4. type: "fs",
  5. settings: {
  6. location: "my_fs_backup_location",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. PUT _snapshot/my_fs_backup
  2. {
  3. "type": "fs",
  4. "settings": {
  5. "location": "my_fs_backup_location"
  6. }
  7. }
path.repo設定の最初の値は/mount/backupsです。この相対パスmy_fs_backup_location/mount/backups/my_fs_backup_locationに解決されます。

クラスターは特定のスナップショットリポジトリバケットを一度だけ登録する必要があります。同じスナップショットリポジトリを複数のクラスターで登録する場合、リポジトリへの書き込みアクセスを持つのは1つのクラスターのみであるべきです。他のクラスターでは、リポジトリを読み取り専用として登録します。

これにより、複数のクラスターが同時にリポジトリに書き込むことを防ぎ、リポジトリの内容が破損するのを防ぎます。また、Elasticsearchがリポジトリの内容をキャッシュするのを防ぎ、他のクラスターによって行われた変更がすぐに可視化されることを意味します。

スナップショットリポジトリを読み取り専用として登録するには、スナップショットリポジトリ作成APIを使用してreadonlyパラメータをtrueに設定します。あるいは、ファイルシステム用のURLリポジトリを登録することもできます。

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_fs_backup",
  3. repository={
  4. "type": "fs",
  5. "settings": {
  6. "location": "my_fs_backup_location",
  7. "readonly": True
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.snapshot.create_repository(
  2. repository: 'my_fs_backup',
  3. body: {
  4. type: 'fs',
  5. settings: {
  6. location: 'my_fs_backup_location',
  7. readonly: true
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_fs_backup",
  3. repository: {
  4. type: "fs",
  5. settings: {
  6. location: "my_fs_backup_location",
  7. readonly: true,
  8. },
  9. },
  10. });
  11. console.log(response);

Console

  1. PUT _snapshot/my_fs_backup
  2. {
  3. "type": "fs",
  4. "settings": {
  5. "location": "my_fs_backup_location",
  6. "readonly": true
  7. }
  8. }

Windowsのインストールは、DOSおよびMicrosoft UNCパスの両方をサポートしています。パス内のバックスラッシュはエスケープしてください。UNCパスの場合、サーバーと共有名をプレフィックスとして提供します。

Yaml

  1. path:
  2. repo:
  3. - "E:\\Mount\\Backups"
  4. - "\\\\MY_SERVER\\Mount\\Long_term_backups"
DOSパス
UNCパス

各ノードを再起動した後、Kibanaまたはスナップショットリポジトリ作成APIを使用してリポジトリを登録します。リポジトリを登録する際には、ファイルシステムのパスを指定します:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_fs_backup",
  3. repository={
  4. "type": "fs",
  5. "settings": {
  6. "location": "E:\\Mount\\Backups\\My_fs_backup_location"
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.snapshot.create_repository(
  2. repository: 'my_fs_backup',
  3. body: {
  4. type: 'fs',
  5. settings: {
  6. location: 'E:\\Mount\\Backups\\My_fs_backup_location'
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_fs_backup",
  3. repository: {
  4. type: "fs",
  5. settings: {
  6. location: "E:\\Mount\\Backups\\My_fs_backup_location",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. PUT _snapshot/my_fs_backup
  2. {
  3. "type": "fs",
  4. "settings": {
  5. "location": "E:\\Mount\\Backups\\My_fs_backup_location"
  6. }
  7. }

相対パスを指定した場合、Elasticsearchはpath.repo設定の最初の値を使用してパスを解決します。

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_fs_backup",
  3. repository={
  4. "type": "fs",
  5. "settings": {
  6. "location": "My_fs_backup_location"
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.snapshot.create_repository(
  2. repository: 'my_fs_backup',
  3. body: {
  4. type: 'fs',
  5. settings: {
  6. location: 'My_fs_backup_location'
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_fs_backup",
  3. repository: {
  4. type: "fs",
  5. settings: {
  6. location: "My_fs_backup_location",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. PUT _snapshot/my_fs_backup
  2. {
  3. "type": "fs",
  4. "settings": {
  5. "location": "My_fs_backup_location"
  6. }
  7. }
path.repo設定の最初の値はE:\Mount\Backupsです。この相対パスMy_fs_backup_locationE:\Mount\Backups\My_fs_backup_locationに解決されます。

クラスターは特定のスナップショットリポジトリバケットを一度だけ登録する必要があります。同じスナップショットリポジトリを複数のクラスターで登録する場合、リポジトリへの書き込みアクセスを持つのは1つのクラスターのみであるべきです。他のクラスターでは、リポジトリを読み取り専用として登録します。

これにより、複数のクラスターが同時にリポジトリに書き込むことを防ぎ、リポジトリの内容が破損するのを防ぎます。また、Elasticsearchがリポジトリの内容をキャッシュするのを防ぎ、他のクラスターによって行われた変更がすぐに可視化されることを意味します。

スナップショットリポジトリを読み取り専用として登録するには、スナップショットリポジトリ作成APIを使用してreadonlyパラメータをtrueに設定します。あるいは、ファイルシステム用のURLリポジトリを登録することもできます。

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_fs_backup",
  3. repository={
  4. "type": "fs",
  5. "settings": {
  6. "location": "my_fs_backup_location",
  7. "readonly": True
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.snapshot.create_repository(
  2. repository: 'my_fs_backup',
  3. body: {
  4. type: 'fs',
  5. settings: {
  6. location: 'my_fs_backup_location',
  7. readonly: true
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_fs_backup",
  3. repository: {
  4. type: "fs",
  5. settings: {
  6. location: "my_fs_backup_location",
  7. readonly: true,
  8. },
  9. },
  10. });
  11. console.log(response);

Console

  1. PUT _snapshot/my_fs_backup
  2. {
  3. "type": "fs",
  4. "settings": {
  5. "location": "my_fs_backup_location",
  6. "readonly": true
  7. }
  8. }

リポジトリ設定

  • chunk_size
  • (オプション、バイト値) スナップショット内のファイルの最大サイズ。このサイズを超えるファイルは、このサイズまたはそれ以下のチャンクに分割されます。デフォルトはnull(無制限のファイルサイズ)です。
  • compress
  • (オプション、ブール値) trueの場合、メタデータファイル(インデックスマッピングや設定など)はスナップショット内で圧縮されます。データファイルは圧縮されません。デフォルトはtrueです。
  • location
  • (必須、文字列) スナップショットを保存および取得するために使用される共有ファイルシステムの場所。この場所は、クラスター内のすべてのマスターノードとデータノードのpath.repo設定に登録されている必要があります。path.repoとは異なり、この設定は単一のファイルパスのみをサポートします。
  • max_number_of_snapshots
  • (オプション、整数) リポジトリが含むことができるスナップショットの最大数。デフォルトはInteger.MAX_VALUEで、2^31-1または2147483647です。
  • max_restore_bytes_per_sec
  • (オプション、バイト値) ノードごとの最大スナップショット復元率。デフォルトは無制限です。復元はリカバリ設定を通じても制限されます。
  • max_snapshot_bytes_per_sec
  • (オプション、バイト値) ノードごとの最大スナップショット作成率。デフォルトは40mb毎秒です。管理サービスのためのリカバリ設定が設定されている場合、デフォルトは無制限で、さらにリカバリ設定を通じて制限されます。

  • readonly

  • (オプション、ブール値) trueの場合、リポジトリは読み取り専用です。クラスターはリポジトリからスナップショットを取得および復元できますが、リポジトリに書き込んだり、スナップショットを作成したりすることはできません。
    書き込みアクセスを持つクラスターのみがリポジトリにスナップショットを作成できます。リポジトリに接続されている他のすべてのクラスターは、readonlyパラメータをtrueに設定する必要があります。
    falseの場合、クラスターはリポジトリに書き込み、スナップショットを作成できます。デフォルトはfalseです。
    同じスナップショットリポジトリを複数のクラスターで登録する場合、リポジトリへの書き込みアクセスを持つのは1つのクラスターのみであるべきです。複数のクラスターが同時にリポジトリに書き込むと、リポジトリの内容が破損するリスクがあります。

共有ファイルシステムリポジトリのトラブルシューティング

Elasticsearchは、オペレーティングシステムのファイルシステム抽象を使用して共有ファイルシステムリポジトリと相互作用します。これは、すべてのElasticsearchノードが、ファイルの作成、オープン、名前変更、ディレクトリの作成およびリストなど、リポジトリパス内での操作を実行できる必要があることを意味します。また、1つのノードによって実行された操作は、完了するとすぐに他のノードに可視化されなければなりません。

スナップショットリポジトリの検証APIおよびリポジトリ分析APIを使用して、一般的な設定ミスを確認してください。リポジトリが正しく構成されている場合、これらのAPIは正常に完了します。検証リポジトリまたはリポジトリ分析APIが問題を報告した場合、ファイルシステム上で同様の操作を実行することで、この問題をElasticsearchの外部で再現できるようになります。

検証リポジトリまたはリポジトリ分析APIが、権限不足を示すエラーで失敗した場合は、オペレーティングシステム内でリポジトリの構成を調整して、Elasticsearchに適切なアクセスレベルを与えてください。このような問題を直接再現するには、Elasticsearchが実行されているのと同じセキュリティコンテキストで、Elasticsearchと同様の操作を実行します。たとえば、Linuxでは、suのようなコマンドを使用して、Elasticsearchが実行されるユーザーに切り替えます。

検証リポジトリまたはリポジトリ分析APIが、1つのノードでの操作が他のノードで即座に可視化されないことを示すエラーで失敗した場合は、オペレーティングシステム内でリポジトリの構成を調整してこの問題に対処してください。リポジトリが十分な可視性保証で構成できない場合、それはElasticsearchスナップショットリポジトリとして使用するのに適していません。

検証リポジトリおよびリポジトリ分析APIは、オペレーティングシステムがリポジトリにアクセスする際に他の種類のI/Oエラーを返す場合にも失敗します。この場合、オペレーティングシステムによって報告されたI/Oエラーの原因に対処してください。

多くのNFS実装は、ノード間でアカウントを数値ユーザーID(UID)およびグループID(GID)を使用して一致させます。Elasticsearchが各ノードで同じ名前(通常はelasticsearch)のアカウントで実行されることは可能ですが、これらのアカウントが異なる数値のユーザーまたはグループIDを持つことがあります。共有ファイルシステムがNFSを使用している場合は、すべてのノードが同じ数値のUIDおよびGIDで実行されていることを確認するか、ノード間の数値IDの変動を考慮してNFS構成を更新してください。

線形化可能なレジスタの実装

共有ファイルシステムリポジトリの線形化可能なレジスタの実装は、ファイルロックに基づいています。レジスタで比較と交換の操作を実行するために、Elasticsearchはまず基盤となるファイルをロックし、その後同じロックの下で更新された内容を書き込みます。これにより、その間にファイルが変更されていないことが保証されます。