Elasticsearchディスク容量は平常時の見積もりだと足りないかも

# 前提
- ディスク容量とシャード数の設計について
- 性能面に問題がないかどうかは、実計測すること
- Elasticsearch 7.10

# サマリー
- Elasticsearchはドキュメント更新時に一時的にディスク容量が増える
- なので、ディスク容量を設計する際は、上記を考慮する必要がある
- シャード数については、上記を考慮しなくていい

# ディスク容量
基本的には、[ドキュメント](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/sizing-domains.html)の式から算出する

> ソースデータ x (1+ レプリカの数) x (1 + インデックス作成オーバーヘッド) ÷ (1 - Linux 予約スペース) ÷ (1 - OpenSearch Service のオーバーヘッド) = 最小ストレージ要件

ポイントとしては、ディスク容量算出時は、ドキュメント更新時のディスク容量増加を加味する必要がある

Elasticsearchの仕様として、ドキュメント更新の際には、一時的に新旧分のディスク領域を使用し、セグメントマージが実施されるまで旧分のディスク領域は解放されない
参考: [ドキュメント](https://aws.amazon.com/jp/premiumsupport/knowledge-center/opensearch-deleted-documents/)

なので、上記の式で計算する際の `ソースデータ` は、平常時のサイズではなく、ドキュメント更新時のサイズを使う必要がある
平常時のディスク容量をソースデータとした場合、ドキュメント更新時に容量不足になる可能性がある

ちなみに、実際に運用していたドメインのインデックスは、定期的に全ドキュメント更新を行っており、一時的に平常時の2倍程のディスク容量を使っていることがわかったため（ `_cat/indices?v` の `pri.store.size`）、改めてサイジングすることになった

また、料金は[ドキュメント](https://aws.amazon.com/jp/opensearch-service/pricing/#:~:text=Amazon%20EBS%20%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%81%AE%E6%96%99%E9%87%91%20(EBS%20%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E9%81%A9%E7%94%A8))を参照
例. `汎用 (SSD) ストレージ` なら `1 GB あたり 0.162USD/月`

## 余談
上記ディスク容量で運用していたところ、ディスク容量監視のwarningが発砲した
※ 監視はノード単位のディスク容量を見ていて、[25%を切ったらwarning](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cloudwatch-alarms.html#:~:text=we%20recommend%20setting%20it%20to%2025%25%20of%20the%20storage%20space%20for%20each%20node.)、[20%を切ったらcritical](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/handling-errors.html#:~:text=If%20one%20or%20more%20nodes%20in%20your%20cluster%20has%20less%20than%2020%25%20of%20available%20storage%20space%2C%20or%20less%20than%2020%20GB%20of%20storage%20space)に設定している

上記はあくまで最小ストレージ容量なので、ノードによってディスク使用量の偏りが起きて、監視が発砲してしまったのだと理解している

というわけで、改めて監視が発砲しないようにディスク容量を設計することにした
具体的には、監視の発砲時のノード単位のディスク使用量から逆算してディスク容量を見積もる（AWS公式のやり方ではない）

監視の発砲時のノード単位のディスク使用量が全体の 30% に抑えられるよう、ノード単位のディスク使用量を再計算して、それにノード数を掛けて全体のディスク容量を算出する
※ warning監視の閾値である 25% 以上で切りのいい割合

具体的には、`X - (監視の発砲時のノード単位のディスク使用量 + 今後の拡張分) = X * 30%` を計算して、求めた X にノード数を掛ける

# シャード数
基本的には、[ドキュメント](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/sizing-domains.html#:~:text=(%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%20%2B%20%E6%8B%A1%E5%BC%B5%E3%81%AE%E4%BD%99%E5%9C%B0)%20*%20(1%20%2B%20%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E4%BD%9C%E6%88%90%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%98%E3%83%83%E3%83%89)/%E5%BF%85%E8%A6%81%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%89%E6%95%B0%20%3D%20%E3%83%97%E3%83%A9%E3%82%A4%E3%83%9E%E3%83%AA%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%89%E3%81%AE%E6%A6%82%E6%95%B0)の式から算出する

> (ソースデータ + 拡張の余地) * (1 + インデックス作成オーバーヘッド)/必要シャード数 = プライマリシャードの概数

シャード数の算出時は、平常時のディスク容量で考えれば良い
ドキュメント更新時にディスク容量が増えるのは一時的なものなので

ポイントとしては、上記の式を使う際の `必要シャードサイズ` を具体的にどの値にするか

AWS推奨されているのは[10~50GB](https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/sizing-domains.html#:~:text=%E7%B5%8C%E9%A8%93%E5%89%87%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E6%A4%9C%E7%B4%A2%E3%83%AC%E3%82%A4%E3%83%86%E3%83%B3%E3%82%B7%E3%83%BC%E3%81%8C%E4%B8%BB%E8%A6%81%E3%81%AA%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E7%9B%AE%E6%A8%99%E3%81%A7%E3%81%82%E3%82%8B%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A7%E3%81%AF%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%89%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%2010%EF%BD%9E30%20GiB%E3%80%81%E3%83%AD%E3%82%B0%E5%88%86%E6%9E%90%E3%81%AA%E3%81%A9%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%81%8C%E5%A4%9A%E3%81%84%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A7%E3%81%AF%2030%EF%BD%9E50%20GiB%20%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%AB%E7%B6%AD%E6%8C%81%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E3%81%8A%E5%8B%A7%E3%82%81%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)なので、ユースケースを踏まえて、10GB刻み（10,20,30,40,50GB）でシャード数を計算してみて、その中から適切なものを選定した

具体的な選定基準としては以下

- 現状のシャードサイズを計算して、それがAWS推奨値になっていること
    - 上記で求めたシャード数と上記式を使って、今度は逆にシャードサイズを求める
    - 今後の拡張分も考慮したシャード数から逆算するため、現状だと、少しシャードサイズが小さくなる
- シャードがノード数で割り切れること
    - [シャードがノード間で均一に分配される](https://aws.amazon.com/jp/blogs/news/best-practices-for-configuring-your-amazon-elasticsearch-service-domain/#:~:text=%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%89%E3%81%8C%E3%83%8E%E3%83%BC%E3%83%89%E9%96%93%E3%81%A7%E5%9D%87%E7%AD%89%E3%81%AB%E5%88%86%E9%85%8D%E3%81%95%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86)ことが推奨されている
- 基本的には多めに確保すること
    - シャード数変更はインデックス再構築が必要であり簡単に行えないため