ElasticsearchはスナップショットをAmazon S3に保存できる
検索エンジンであるElasticsearchにはインデックスのスナップショットを取って保存する機能があります。要はある時点でのバックアップを取れます。
説明を読んだ感じ、全マスターノードとデータノードで共有しているストレージに保存するのがデフォルトっぽいですが、共有ストレージに障害があると即ES自体の障害になるらしいとかで、Amazon S3に保存するようにしました。
直後はいいが、数日経つとスナップショットを保存できなくなる
設定自体は特に問題なく入れた後の動作確認もできたため、実際に定期的に保存をしていたのですが、どういうわけかしばらくするとスナップショットをS3に保存できなくなってしまっていました。ノードを再起動すると再び保存できるようになるのですが、やはりしばらくするとダメ。保存できなくなるまでの期間も特に周期があるというわけでもなく、数日から数週間程度だったでしょうか。
ESのノードの再起動は結構な苦行ですので(自動化はできますが)、定期再起動をかけるという原始的な解決策は取りづらいですし、何よりダサすぎます。
原因と対策
普通にインターネットを通してS3に保存しているわけではなかったので、経路を疑ったりもしたのですが、どうも分からず。
困っていたところ、何かの拍子で以下のページにたどり着きました。
Java 仮想マシン (JVM) は DNS 名参照をキャッシュします。JVM がホスト名を IP アドレスに変換するとき、time-to-live (TTL) と呼ばれる指定期間 IP アドレスをキャッシュします。
AWS リソースは、ときどき変更される DNS 名を使用するため、60 秒を超えない TTL 値で JVM を設定することをお勧めします。(略)
一部の Java 設定では JVM のデフォルトの TTL が設定されるため、JVM が再起動されるまで、DNS エントリが更新されることはありません。
JVMが揮発しないDNSエントリーのキャッシュを持っていたとは…。ElasticsearchはJavaのアプリケーションですので、この指摘に当てはまります。というわけでそのページに書いてある通り、 networkaddress.cache.ttl
の設定を行うことで無事S3に保存し続けることができるようになりました。
分かっていれば簡単なんですけどね。ElasticsearchとS3に保存する手順を検索しても特に注意事項として書いてなくハマりましたので、同じような目にあった人のためにメモを残しておきます。