【Elasticsearch】エイリアスの活用術:ダウンタイムなしの再インデックスから時系列インデックス管理まで
この記事では、ObjectRocketがホストするCurator実装でAliasアクションが利用可能になったことを記念して、Elasticsearch®のエイリアスについて詳しく解説します。エイリアスのメリットや、実際の運用でどのように活用できるのかをご紹介します。
はじめに:Elasticsearchにおけるエイリアスとは
※本記事は2017年8月24日にObjectRocket.com/blogで公開された内容をもとにしています。
優れたElasticsearch運用の基本戦略として、大量のデータを1つの巨大なインデックスに詰め込むことは避けるべきとされています。しかし、データが複数のインデックスに分散した後は、それらを横断的に検索する最適な方法が必要になります。そこで役立つのがエイリアスです。
Elasticsearchのエイリアスは、その名の通り「別名」のことです。1つまたは複数のインデックスを参照できる二次的な名前であり、ニーズに合わせてフィルタリングを組み込むことも可能です。この記事では、エイリアスの便利な活用方法と、ObjectRocketの機能を使ってElasticsearchクラスタ向けにAlias Curatorタスクを素早く簡単にセットアップする手順を解説します。
エイリアスを使ったCRUD操作(作成・読み取り・更新・削除)
まず、エイリアスの基本的な動作を簡単な例で見てみましょう。_cat APIを使うと、エイリアスとインデックスの関連付けごとに行が返され、フィルタリングやルーティングが適用されているかどうかも確認できます。
GET _cat/aliases?v
alias index filter routing.index routing.search
atest test1 – – –
atest test2 – – –
atest2 test2 * – –
また、/_aliasエンドポイントですべてのエイリアスを確認したり、/index/_aliasエンドポイントで特定のインデックスのエイリアスだけを確認したりすることもできます。さらに、インデックステンプレートを使用するか、PUTコマンドを使って、インデックス作成時にエイリアスを追加することも可能です。
PUT /test2
{
"aliases" : {
"atest" : {},
"atest2" : {
"filter" : {
"term" : {"user" : "objectrocket" }
}
}
}
}
後から追加・変更する場合は、/_aliasesエンドポイントで、追加または削除するインデックスとエイリアスを指定します。
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test1", "alias" : "atest" } },
{ "remove" : { "index" : "test3", "alias" : "atest" } }
] }
設定後は、クエリ内でインデックス名の代わりにエイリアス名を使用できます。ただし、ドキュメントの書き込み(インデックス登録)ができるのは、単一のインデックスを指すエイリアスに対してのみである点に注意してください。エイリアスには他にも多くの機能がありますので、詳細は公式ドキュメントをご参照ください。
エイリアスが威力を発揮する場面
ここまでの説明はシンプルで、すでにその利便性を実感していただけたかもしれません。まだの方のために、エイリアスが特に役立つユースケースを2つご紹介します。
ダウンタイムなしでの再インデックス
Elasticsearchの最も有用な機能の1つがReindex APIです。しかし、再インデックス後も、古いインデックスから新しいインデックスへの切り替え作業が必要です。エイリアスを使えば、この切り替えをダウンタイムなしで実現できます。手順は以下の通りです。
oldIndexというインデックスがあり、それをnewIndexに再インデックスしたいと仮定します。myaliasというエイリアスを作成し、oldIndexに追加します。- アプリケーションが
oldIndexではなくmyaliasを参照するようにします。 newIndexを作成し、oldIndexからのデータ再インデックスを開始します。myaliasにnewIndexを追加し、oldIndexを削除します。この操作は1つのコマンドで実行します。変更はアトミック(極めて小さく独立した単位)に行われるため、移行中に問題が発生することはありません。- エイリアス経由で期待通りの結果が得られることを確認し、準備が整ったら
oldIndexを削除します。
アプリケーションからの読み取りやクエリにはエイリアスを使用するのが良いプラクティスです。そうすることで、余計な手順を踏まずに済みます。
時系列インデックスの範囲指定
Logstash®やBeats®を使用している方なら、something-yyyy.mm.ddのような形式のインデックス名に馴染みがあるでしょう。この命名規則により、データの管理が非常に容易になります。ただし、ワイルドカードやインデックスリストは、特に日付範囲を横断して検索したい場合など、必ずしも十分な柔軟性があるとは言えません。こうしたケースでは、エイリアスが簡単な解決策となります。
例えば、Logstashの日次インデックスがあり、ログを30日間保持しているとします。しかし、特定の種類のクエリでは過去7日間のデータだけを参照できれば十分な場合があります。エイリアスとCuratorを組み合わせれば、これを比較的簡単に実現できます。
lastSevenDaysのようなエイリアスを作成します。- インデックステンプレートを設定し、新しく作成されるインデックスがデフォルトでこのエイリアスに追加されるようにします。
- Elasticsearch Curatorのエイリアスアクションと年齢/パターンフィルター、または基本的なスクリプトを使用して、7日より古いインデックスを削除する定期タスクを設定します。
- 以降、
lastSevenDaysへのすべての検索は、過去7日以内に作成されたインデックスのみを対象とします。
導入事例:パフォーマンス改善の実例
最後に、実際のお客様の事例を少し紹介します。あるお客様がパフォーマンス低下の問題に悩まされていました。調査の結果、頻繁に使用されるクエリの1つが、クラスタ全体の日付範囲を横断して検索していることが判明しました。このクエリは前述のシナリオと非常によく似ており、実際には過去7日間のデータのみが必要だったため、過去7日分のインデックスを指すよう定期的に更新されるエイリアスで管理するのに理想的なケースでした。以下のグラフを見ると、クラスタのパフォーマンスへの影響は驚異的です。
このエイリアスは頻繁にクエリされていたため、変更による影響を明確に確認できます。グラフが示すように、すべてのノードでCPU使用率が50%以上低下し、クエリキャッシュの退避数は約75%減少しました。クエリの頻度やインデックスサイズによって、ここまで劇的な結果が出るとは限りませんが、検索範囲とインデックスを適切に管理することの重要性を如実に示しています。
まとめ
エイリアスは、Elasticsearchのツールボックスの中でも、クラスタの日々の管理や運用を容易にしてくれる強力なツールの1つです。この記事ですべてを網羅したわけではありませんが、Elasticsearchの実装において、エイリアスをどこでどのように活用できるのか、そのイメージをつかんでいただけたのではないでしょうか。
ObjectRocketでAlias Curatorタスクを設定する方法
当社のElasticsearchクラスタはすでにエイリアスをサポートしていますが、新機能のAlias Curatorタスクを使えば、条件に基づいて一定間隔でインデックスをエイリアスに追加または削除するフィルターを指定できるため、エイリアスの定期的なメンテナンスを簡単に自動化できます。
例として、先ほどのlastSevenDaysエイリアスの例を挙げます。これはすでにElasticsearch Curatorで参照されています。話を簡単にするために、Curatorタスクの初回実行時にエイリアスを設定させることにします。Curatorタスク内で既存のエイリアスを参照することもできるため、よりカスタマイズされた設定にしたい場合は、エイリアスを別途セットアップしておくことも可能です。
このエイリアスを管理するには、「過去7日以内に作成された」という年齢基準に合致するインデックスのみを含むよう、常に最新の状態に保つ必要があります。まず、Alias Curatorタスクを追加したいクラスタのインスタンス詳細ページにアクセスします。
次に、Curatorタブを選択して、現在のCuratorタスクを確認します。
すでにいくつかのCuratorタスクが存在することがわかります。今回はAlias Curatorタスクとしてもう1つ作成しましょう。Add Taskを選択します。
タスクタイプとしてAliasを選択します。
タスクに名前を付けたら、エイリアス名を指定します。この例ではlastSevenDaysを使用します。AddとRemoveというオプションも表示されます。これらにより、エイリアスに追加または削除したいインデックスのフィルターを指定できます。lastSevenDaysの場合、一部のインデックスを追加し、他を削除する必要があるため、両方を選択します。
目的のフィルターは、「7日以内に作成されたすべてのインデックスを追加し、7日より古いインデックスを削除する」ものです。入力すると、インデックスの設定は次の例のようになります。
タスクを定期的に実行してエイリアスを最新に保ちたいので、間隔はデフォルト(5分ごと)のままにします。Save Taskを選択すれば完了です。これで、5分ごとにタスクが実行され、Elasticsearchエイリアスが常に最新の状態に保たれます。
Rackspace DBA Servicesの詳細については、ぜひご確認ください。
コメントやご質問がある場合は、フィードバックタブからお気軽にお寄せください。Sales Chatをクリックして、今すぐチャットを始めることもできます。
-
Filebeatモジュールを使った簡単なログ分析の始め方
Elastic{on} 17以降、Elastic Stackに追加される新機能の中でも特に注目されているのが、Filebeatの「モジュール」という新しい概念です。従来、Filebeatでデータ収集を始めるには、Filebeat自体の設定、Elasticsearch用マッピングテンプレートの作成、Ingest PipelineやLogstashインスタンスの構築・テスト、さらにKibanaでの可視化ダッシュボード作成など、多くの手順が必要でした。Beatsチームは、この面倒なセットアッププロセスをモジュールの仕組みによって大幅に簡素化しました。Filebeatモジュールは、こうした一連の設定作
-
ObjectRocketのElasticsearchでKibana 4をDockerコンテナで稼働させる方法
数百万件(あるいは数十億件!)にも及ぶElasticsearchのドキュメントを、見栄えの良いチャート・グラフ・テーブルに変換したいとお考えなら、答えはKibanaです。KibanaはElastic社が提供するプロダクトであり、Elasticsearchと密接に連携し、膨大なデータを直感的に分析するための使いやすいインターフェースを提供します。現在、ObjectRocketのすべてのElasticsearchインスタンスにはKibana 3がプリロードされており、各HTTPエンドポイントの「/_plugin/kibana」からアクセスできます。しかし、Kibana 4には多くの改善点や新機能が