Elasticsearch のスケールアウトを EC2 で構築する手順。
どうも!
Elasticsearch の ZenDiscovery は、同一ネットワーク上の ES を発見し、クラスタに追加することが出来る機能ですが、クラスターに入った後は、シャードの再分配が自動で行われます。これにより、Solr と比べても非常に簡単にノードの追加が可能になっています。
この機能を活かし、IaaS を使った Elasticsearch の自動スケールアウトの実現が可能なのですが、その前提として仮想マシン起動→即クラスタ入り、という状態を作る必要があります。AWS のクラウドデザインパターンでは、スケールアウトパターン*1 というものがあり、ES をインストールした状態の仮想マシンイメージを使って2台目以降の仮想マシンを起動することで、自動的にスケールアウトすることができる、というものです。
今日はその手順を検証してみたので、以下に記載します。
環境
- AWS EC2 *2
- Elasticsearch 1.3.4
- Amazon Linux
- t2.micro
手順
以下のパーミッションをもつ User を IAM で作成。
IAM Role を使う形が理想的ですが、今回はシンプルに User です。
{ "Statement": [ { "Action": [ "ec2:DescribeInstances" ], "Effect": "Allow", "Resource": [ "*" ] } ], "Version": "2012-10-17" }
EC2 を起動。以下のセキュリティグループを作成。
以下のポートが開いていることが必須です。なお、同一のセキュリティグループに2台目以降も入れる前提なので、対象のIPの欄にはセキュリティグループIDを設定しておきます。また、確認のため、9200 は、自分のクライアント機のグローバルIPにも開いておきましょう。
- 9300 (elasticsearch transport)
- 22 (SSH)
- 9200 (for HTTP testing)
Elasticsearch をインストール
サービス化するために、rpm でインストール
sudo rpm -ivhhttps://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.4.noarch.rpm
インストール後に、自動起動するように設定。
sudo chkconfig elasticsearch on
プラグインをインストール
必要なプラグインをインストールします。AWS EC2 はその仕様上、マルチキャスト通信ができません。Elasticsearch はデフォルトでマルチキャスト通信で、ノードを発見し、クラスタを追加するため、そのままではクラスタを構成できません。そこで、マルチキャストの代わりに elasticsearch-cloud-aws プラグインを使用して、自動スケールを実現します。
bin/plugin -install elasticsearch/elasticsearch-cloud-aws/2.3.0
https://github.com/elasticsearch/elasticsearch-cloud-aws
elasticsearch.yml に以下を追記。
cluster.name: ec2-demo cloud: aws: access_key: <上記2.で作ったUserのアクセスキー> secret_key:<上記2.で作ったUserのシークレットキー> region: ap-northeast discovery: type: ec2
Elasticsearch を起動
service elasticsearch start
起動後に、9200 にアクセスし、起動していることを確認します。
AMI イメージを作成。
2台目以降の仮想マシンを作成・起動するためつかう仮想マシンのイメージを作成します。Action > crate Image を選択し、適当な名前をつけて保存。この時、インスタンスの再起動が強制的にかかるので注意します。
作成した AMI から、インスタンスを作成。
2台目のマシンを作成するために、上記の手順で作成した AMI からインスタンスを作成します。この際、使用するセキュリティグループは上記の手順で作ったものを使用します。また、リージョンをまたぐことはできないので、同じリージョンで起動します。(今回は ap-northeast)
まとめ
以上の手順で、仮想マシンを起動するだけで、スケールアウトする Elasticsearch を作成できます。1点注意は、縮退時(サーバーの停止時)に、シャードの配置を気にする必要があります。自動でシャードが配置されるため、配置された状態によってはサーバーを止めると、インデックスデータが欠損する場合があります。シャード数、レプリカ数および起動するノード数の設定や、ルーティングAPIでコントロールすることができます。
この状態から、ELB のオートスケーリング機能を使用することで、負荷に応じて自動スケールする Elasticseach を構築することができます!
訂正(2014-10-21): 設定上、2レプリカとなっているので、1台停止してもシャードの欠損は発生しません。いずれかのノードがかならずシャードを持っている状態になります。ただし、1台停止した場合、全体で2つのレプリカがあったシャードが、いくつかは1レプリカになるので、その際に2レプリカになるようにコピーが行われます。
ご参考まで。
参考書籍
バージョンは古いがまだまだイケるぜ!今なら kindle 版がお得。
高速スケーラブル検索エンジン ElasticSearch Server
- 作者: Rafal Kuc,Marek Rogozinski,株式会社リクルートテクノロジーズ,大岩達也,大谷純,兼山元太,水戸祐介,守谷純之介
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/03/21
- メディア: 大型本
- この商品を含むブログ (2件) を見る