読者です 読者をやめる 読者になる 読者になる

よしだのブログ

サブタイトルはありません。

Elasticsearch のスケールアウトを EC2 で構築する手順。

f:id:yoshi0309:20141020180205p:plain

どうも!

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

高速スケーラブル検索エンジン ElasticSearch Server

  • 作者: Rafal Kuc,Marek Rogozinski,株式会社リクルートテクノロジーズ,大岩達也,大谷純,兼山元太,水戸祐介,守谷純之介
  • 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
  • 発売日: 2014/03/21
  • メディア: 大型本
  • この商品を含むブログ (2件) を見る