AWS OpenSearch (ElasticSearch) でCold storageを調査し、試す
始まり
いつの時代も公式ドキュメントから始めましょう。
前提条件をクリアしてるかどうかを確認。全部満たしてるっぽいので次へ。
コールドストレージには、OpenSearch または Elasticsearch バージョン 7.9 以降が必要です
OpenSearch Service ドメインでコールドストレージを有効にするには、同じドメインで UltraWarm も有効にする必要があります。
コールドストレージを使用するには、ドメインに専用のマスターノードがある必要があります。
ドメインでデータノードに T2 または T3 インスタンスタイプが使用されている場合、コールドストレージを使用することはできません。
インデックスがおおよその k-NN ("index.knn": true) [1]を使用している場合、コールドストレージに移すことはできません。
ドメインがきめ細かなアクセスコントロールを使用する場合、管理者以外のユーザーは、コールドインデックスを管理するために OpenSearch Dashboards の cold_manager ロールにマッピングされている必要があります。
-
DevToolで
GET <index>/_settings
を見て確認。index.knnの説明 ↩︎
値段表(https://aws.amazon.com/opensearch-service/pricing/)を見るとそこそこのお値段がするのでミニマム構成でスタート: ultrawarm1.medium.search * 2
Amazonのコンソール上では以下の通りGreen/Blue Deploymentが実行されるのでしばらく待つ。
Step 1 of 6: Creating a new environment
Preparing resources.Step 2 of 6: Provisioning new nodes
Provisioning new nodes.Step 3 of 6: Traffic routing on new nodes
Enabling traffic routing through the new nodes.Step 4 of 6: Traffic routing on old nodes
Disabling traffic routing through the old nodes.Step 5 of 6: Copying shards to new nodes
Copying shards to new nodes.Step 6 of 6: Deleting older resources
Deleting resources associated with the old environment.
Hot/(Ultra)Warm/Cold の違いについて
何が違うのかを一言で表すなら
- Hot: 通常のOpenSearch
- Warm: ReadOnlyのみ。書き込みの際はHotに戻す必要あり👉Qiita: UltraWarmにデータを移す
- Cold: S3にデータを置く。クエリする際はWarmに戻す必要あり👉AWS: Migrating cold indexes to warm storage
以下のzennまとめはfreeeさんのOpenSearch運用例を示しています。
テンプレートを少し変えてSlackに通知する形にして運用開始!
{
"policy_id": "<index>-retention-policy",
"description": "hot-warm-cold-delete policy <index>",
"schema_version": 1,
"error_notification": null,
"default_state": "hot",
"states": [
{
"name": "hot",
"actions": [],
"transitions": [
{
"state_name": "warm",
"conditions": {
"min_index_age": "1d"
}
}
]
},
{
"name": "warm",
"actions": [
{
"retry": {
"count": 5,
"backoff": "exponential",
"delay": "1h"
},
"warm_migration": {}
}
],
"transitions": [
{
"state_name": "cold",
"conditions": {
"min_index_age": "7d"
}
}
]
},
{
"name": "cold",
"actions": [
{
"cold_migration": {
"start_time": null,
"end_time": null,
"timestamp_field": "@timestamp",
"ignore": "none"
}
}
],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "180d"
}
}
]
},
{
"name": "delete",
"actions": [
{
"notification": {
"destination": {
"slack": {
"url": "<url>"
}
},
"message_template": {
"source": "As the index {{ctx.index}} is older than 180 days, it's being removed",
"lang": "mustache"
}
}
},
{
"cold_delete": {}
}
],
"transitions": []
}
],
"ism_template": [
{
"index_patterns": [
"<index>-*"
]
}
]
}