ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Amazon OpenSearch Serviceのシャード数について備忘録 ~ 課題となった事柄を添えて ~

こんにちは、AWS チームの平原です。

皆様は、タレントの勝俣州和さんをご存知でしょうか?
私は勝俣さんのシャーッという気合いを込める掛け声が好きで、たまに聞くと元気が出ます!

といったところで今回は、AWS OpenSearch Serviceのシャードについて備忘も含め記事にします。
初期のシャード設定がよろしくなくシャード溢れが課題となったことについても書きますので、参考になれば幸いです。

はじめに

"シャード"とは、データベースや検索システムなどでデータを分割して複数の機器(ストレージ)に分けて保管することで、
機器への負荷分散やパフォーマンスの向上となる仕組みのことです。
データを分割して保管することを"シャーディング"と言います。

OpenSearchのシャードも上記と同様の意味合いとなります。
ただし、OpenSearchの場合、インデックス(RDBでいうテーブル)毎にシャード設定が行われる仕組みとなっています。

Amazon OpenSearch Serviceのシャードについての詳細は下記を参考にして頂ければと思います。
https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/sizing-domains.html

OpenSearch のシャード数について

 OpenSearch シャード数の上限

OpenSearchのシャード数の上限は、「データノード数 × 1,000」です。
(マスターノード数は含まれない)

例)
マスターノード: 3台 / データノード: 3台 構成の場合
3 × 1,000 = 3,000 : シャード数の上限

 OpenSearch 使用シャード数

上述したように、OpenSearchのシャード数は、インデックス毎に設定し、インデックス数に比例してシャード数を使用することになります。
インデックス毎に使用されるシャード数は、「number_of_shards × ( 1 + replica_of_number ) 」です。
"number_of_shards" と "replica_of_number" は、インデックスの設定項目です。
"1" は、プライマリを指しています。

例)
number_of_shards: 3 / replica_of_number: 1 と設定した場合
3 × ( 1 + 1 ) = 6 : インデックス1つで使用するシャード数

なお使用されているシャード数は、CloudWatchメトリクス: Shards.active で確認および監視が可能です。

課題となったシャード数溢れについて

初期のインデックスに設定していたシャードの設定では、シャード数が短期間で上限を超えることが判明し、
シャードの再設定を行う必要がありました。

設定の変更について

シャードの設定は、Index Templateを利用し、インデックスが作成されるタイミングで適用される方法をとっています。

課題対応前

  • シャードの上限: 3,000 (データノード数 3台)
  • インデックス毎の使用シャード数: 6 ( 3 × ( 1 + 1 ) )
  • インデックスローテーション: 日次 (日毎に新規インデックスが作成される)
  • インデックスの種類: 7

上記の設定だと、1ヶ月で約 1,260 ( 6 × 7 × 30 ) シャードが使用される設定で、3ヶ月足らずでシャードの上限に達してしまいます。

課題対応後

  • シャードの上限: 3,000 (データノード数 3台)
  • インデックス毎の使用シャード数: 4 ( 2 × ( 1 + 1 ) ) ※ number_of_shards を "2" に変更
  • インデックスローテーション: 月次 ※ 月次に新規インデックスが作成される様に変更
  • インデックスの種類: 7

上記の設定だと、1ヶ月で 28 ( 4 × 7 × 1 ) シャードが使用される設定となります。

シャード設定の変更方法について

シャードの設定は、インデックスが新規で作成されるタイミングで適用されます。
その為、今回の対応では、インデックスを再作成するReindexを利用して行いました。
また Reindex は、複数のインデックスを1つのインデックスにまとめることもできます。
Reindex 実施後に、日次で作成されていたインデックスを削除しました。

POST _reindex
{
    "source": {
        "index": "<作成元 Index>"
    },
    "dest": {
        "index": "<作成先 Index>"
    }
}

今回の対応では、日次インデックスを月次インデックスに再作成するため、以下の様になります。

POST _reindex
{
    "source": {
        "index": "example-index-2024-06-*"
    },
    "dest": {
        "index": "example-index-2024-06"
    }
}

※ バックアップとして、SnapShot などを取得した上で実施することを推奨します

さいごに

OpenSearchのシャードは、インデックスに保存される容量に応じて設計、設定する必要があります。
今回、初期段階ではデータ保存量がどれほどになるか不透明なままシャードの設定を行ったことで課題が発生しました。
基本的にシャードの変更は、困難なものですので、初期段階できちんと設計することが推奨されます。

同様の課題をお持ちの方の少しでも参考になると幸いです!