壊れたリポジトリの診断

複数のElasticsearchデプロイメントが同じスナップショットリポジトリに書き込んでいます。Elasticsearchはこの構成をサポートしておらず、同じリポジトリに書き込むことができるのは1つのクラスターのみです。リポジトリの内容が壊れた場合の潜在的な副作用については、リポジトリの内容を参照してください。これらは以下のガイドでは解決できないかもしれません。この状況を改善するには、リポジトリを読み取り専用としてマークするか、他のすべてのデプロイメントから削除し、現在のデプロイメントでリポジトリを再追加(再作成)します:

壊れたリポジトリを修正するには、同じスナップショットリポジトリに書き込む複数のデプロイメントで変更を行う必要があります。リポジトリに書き込むのは1つのデプロイメントのみでなければなりません。リポジトリに書き込み続けるデプロイメントを「プライマリ」デプロイメント(現在のクラスター)と呼び、リポジトリを読み取り専用としてマークする他のデプロイメントを「セカンダリ」デプロイメントと呼びます。

まず、セカンダリデプロイメントでリポジトリを読み取り専用としてマークします:

Kibanaを使用

  • 1. Elastic Cloudコンソールにログインします。
  • 2. Elasticsearchサービスパネルで、デプロイメントの名前をクリックします。
    デプロイメントの名前が無効になっている場合、Kibanaインスタンスが正常でない可能性があります。その場合は、Elasticサポートにお問い合わせください。デプロイメントにKibanaが含まれていない場合は、最初に有効にするだけで済みます。
  • 3. デプロイメントのサイドナビゲーションメニュー(左上隅のElasticロゴの下に配置)を開き、スタック管理 “> スナップショットと復元 “> リポジトリに移動します。
    Kibanaコンソール
  • 4. リポジトリのテーブルが表示されるはずです。読み取り専用としてマークするリポジトリの右側にある鉛筆アイコンをクリックします。開いた編集ページで下にスクロールし、「読み取り専用リポジトリ」をチェックします。「保存」をクリックします。代わりにリポジトリを完全に削除することが望ましい場合は、リポジトリ名の左側にあるチェックボックスを選択し、テーブルの左上にある「リポジトリを削除」赤ボタンをクリックします。

この時点で、リポジトリが書き込み可能としてマークされているのはプライマリ(現在の)デプロイメントのみです。Elasticsearchはそれを壊れていると見なすため、リポジトリを削除して再追加する必要があります。そうすれば、Elasticsearchは再び使用できるようになります:

現在、プライマリ(現在の)デプロイメントを構成していることに注意してください。

  • 1. プライマリデプロイメントのサイドナビゲーションメニュー(左上隅のElasticロゴの下に配置)を開き、スタック管理 “> スナップショットと復元 “> リポジトリに移動します。
    Kibanaコンソール
  • 2. リポジトリの右側にある鉛筆アイコンをクリックします。開いた編集ページで下にスクロールし、既存の設定に変更を加えずに「保存」をクリックします。

壊れたリポジトリを修正するには、同じスナップショットリポジトリに書き込む複数のクラスターで変更を行う必要があります。リポジトリに書き込むのは1つのクラスターのみでなければなりません。リポジトリに書き込み続けるクラスターを「プライマリ」クラスター(現在のクラスター)と呼び、リポジトリを読み取り専用としてマークする他のクラスターを「セカンダリ」クラスターと呼びます。

まず、セカンダリクラスターに取り組みましょう:

  • 1. リポジトリの構成を取得します。

Python

  1. resp = client.snapshot.get_repository(
  2. name="my-repo",
  3. )
  4. print(resp)

Ruby

  1. response = client.snapshot.get_repository(
  2. repository: 'my-repo'
  3. )
  4. puts response

Js

  1. const response = await client.snapshot.getRepository({
  2. name: "my-repo",
  3. });
  4. console.log(response);

Console

  1. GET _snapshot/my-repo

レスポンスは次のようになります:

Console-Result

  1. {
  2. "my-repo": {
  3. "type": "s3",
  4. "settings": {
  5. "bucket": "repo-bucket",
  6. "client": "elastic-internal-71bcd3",
  7. "base_path": "myrepo"
  8. }
  9. }
  10. }
リポジトリの現在の構成を表します。
  • 2. 上記で取得した設定を使用して、リポジトリを読み取り専用としてマークするためにreadonly: trueオプションを追加します:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my-repo",
  3. repository={
  4. "type": "s3",
  5. "settings": {
  6. "bucket": "repo-bucket",
  7. "client": "elastic-internal-71bcd3",
  8. "base_path": "myrepo",
  9. "readonly": True
  10. }
  11. },
  12. )
  13. print(resp)

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my-repo",
  3. repository: {
  4. type: "s3",
  5. settings: {
  6. bucket: "repo-bucket",
  7. client: "elastic-internal-71bcd3",
  8. base_path: "myrepo",
  9. readonly: true,
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. PUT _snapshot/my-repo
  2. {
  3. "type": "s3",
  4. "settings": {
  5. "bucket": "repo-bucket",
  6. "client": "elastic-internal-71bcd3",
  7. "base_path": "myrepo",
  8. "readonly": true
  9. }
  10. }
リポジトリを読み取り専用としてマークします。
  • 3. 代わりに、リポジトリを削除するオプションがあります:

Python

  1. resp = client.snapshot.delete_repository(
  2. name="my-repo",
  3. )
  4. print(resp)

Ruby

  1. response = client.snapshot.delete_repository(
  2. repository: 'my-repo'
  3. )
  4. puts response

Js

  1. const response = await client.snapshot.deleteRepository({
  2. name: "my-repo",
  3. });
  4. console.log(response);

Console

  1. DELETE _snapshot/my-repo

レスポンスは次のようになります:

Console-Result

  1. {
  2. "acknowledged": true
  3. }

この時点で、リポジトリが書き込み可能としてマークされているのはプライマリ(現在の)クラスターのみです。ただし、Elasticsearchはそれを壊れていると見なすため、再作成してElasticsearchが再び使用できるようにします。現在、プライマリ(現在の)クラスターを構成していることに注意してください:

  • 1. リポジトリの構成を取得し、その構成を保存します。リポジトリを再作成するために使用します:

Python

  1. resp = client.snapshot.get_repository(
  2. name="my-repo",
  3. )
  4. print(resp)

Ruby

  1. response = client.snapshot.get_repository(
  2. repository: 'my-repo'
  3. )
  4. puts response

Js

  1. const response = await client.snapshot.getRepository({
  2. name: "my-repo",
  3. });
  4. console.log(response);

Console

  1. GET _snapshot/my-repo
  • 2. 上記で取得した構成を使用して、リポジトリを再作成します:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my-repo",
  3. repository={
  4. "type": "s3",
  5. "settings": {
  6. "bucket": "repo-bucket",
  7. "client": "elastic-internal-71bcd3",
  8. "base_path": "myrepo"
  9. }
  10. },
  11. )
  12. print(resp)

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my-repo",
  3. repository: {
  4. type: "s3",
  5. settings: {
  6. bucket: "repo-bucket",
  7. client: "elastic-internal-71bcd3",
  8. base_path: "myrepo",
  9. },
  10. },
  11. });
  12. console.log(response);

Console

  1. PUT _snapshot/my-repo
  2. {
  3. "type": "s3",
  4. "settings": {
  5. "bucket": "repo-bucket",
  6. "client": "elastic-internal-71bcd3",
  7. "base_path": "myrepo"
  8. }
  9. }

レスポンスは次のようになります:

Console-Result

  1. {
  2. "acknowledged": true
  3. }