Pairsの検索にElasticsearchを使ってみた。

Elasticsearch-Logo-Color-V

インフラチームの松尾です。
今回はPairsの検索のバックエンドをMySQLからElasticsearchにした話を書きたいと思います。

現在の検索の構成としては golang → Redis → Elasticsearchとなっています。

MySQLだった時の問題点

  • そもそも検索が遅かった。
  • 1台辺りのCPU使用率が高くなりがちだった為、
    台数を増やしてスケールさせていたがコストが結構かかっていた。
  • スキーマ変更を行う際にメンテナスが必要になる事があった。

この問題点を解決する為に、今回Elasticsearchを選んだのですが、
その中で「Elastic Cloud」・「Amazon Elasticsearch Service」・「Elasticsearch on EC2」を
使ってみたのでその所感を書いていきたいと思います。
念を押しますが僕の所感なので色々ツッコミがあっても暖かく見守ってください。

Elastic Cloudについて

Elastic CloudとはElastic Inc.がHostingとManageをしてくれる便利なサービスです。
Cloud なので簡単に利用する事ができます。
詳しくはここを見て下さい。

使ってみて良かった事

  • 自分でインストール等をしなくていいので導入までがすごくスムーズ。
  • すぐに最新のバージョンを試したりする事ができる。
  • プラグインや管理ツールが標準で入ってる。
  • JVMとか気にしなくていい。
  • サポートから構成やクエリについてもアドバイスを受ける事ができるので低コストで導入でできる。
  • さすが本家って感じでした。

改善してくれたらと思った事

  • on AWSなので、AWSのTokyoリージョンのデータセンターにはあるのだけれども、VPC内に作った場合と比べるとレイテンシーが遅い。
  • 同じVPC内で通信する訳ではない為、httpsで通信する必要がありオーバーヘッドが大きかった。
  • 一度に取得するデータ件数が多くまた取得頻度があまりにも高い場合においては、CPUに依存してしまう為コストが割高になってしまった。

Amazon Elasticsearch Serviceについて

Amazon Elasticsearch ServiceとはAWSがHostingとManageをしてくれる便利なサービスです。
AWSのコンソールから簡単に利用する事ができます。
詳しくはここ見て下さい。

使ってみて良かった事

  • AWSマネージドサービス。
  • 自分でインストール等をしなくていいので導入までがすごくスムーズ。
  • JVMとか気にしなくていい。
  • 毎日指定した時間にスナップショットを取得できるのでバックアップを考えなくていい。
  • エンタープライズサーポートを利用している為手厚いサポートが受けられる。

改善してくれたらと思った事

  • 最新バージョンへの対応が遅い。(2016/07/27に2.3に対応してました。)
  • プラグインが自由にいれる事ができない。
  • クエリチューニングや運用については自分達で解決していく必要がある。

Elasticsearch on EC2について

Elasticsearch on EC2については敢えて説明する必要もないと思いますが、
EC2のインスタンスにインストールして運用する。
これだけです。

使ってみて良かった事

  • 低レイテンシーで構築する事ができる。
  • なんでもできるので自由です。
  • カリカリにチューニングする事が可能です。
  • クラウドロックインがない。

辛かった事

  • JVMのパラメーターチューニング
  • Hosting されてる環境と比べると、可用性を考えた構成を考える必要がある。

結局どれにしたの?

  • Elastic Cloudだとレイテンシーが影響した事とCPUバウンスにより、大きめのインスタンスを用意する必要があった為コストが見合わなかった。
  • Amazon Elasticsearch Serviceだと導入検討時に2.3系統が使えなかった事と、自由にプラグインを追加する事ができなかかった為諦めた。

その結果、消去法でElasticsearch on EC2になりました。

Elasticsearch on EC2での運用について

現在は Master – Slave 構成で運用しています。
backupについてはsnapshotを取得してS3にあげる簡単なスクリプトを書いて運用しています。

#!/bin/bash
REPO="backup"
SNAPSHOT=`date +%Y%m%d%H%M%S`
LIMIT=7

# slack setting
CHANNEL=${CHANNEL:-"#test"}
BOTNAME=${BOTNAME:-"hoge"}

# send slack function
send_slack () {
  curl -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"link_names\": 1, \"text\": \"[$HOSTNAME] $1\" }" https://hooks.slack.com/services/****/****
}

# snapshot取得
curl -s -S -f -XPUT "http://localhost:9200/_snapshot/$REPO/$SNAPSHOT?wait_for_completion=true"

# snapshotが取得できたかチェック
if [ $? -ne 0 ];then
  send_slack "elasticsearch backup error!!\nbackup start error."
else
  # ここからはローテート
  # 現在のsnapshotのリストを取得
  SNAPSHOTS=`curl -s -S -f -XGET "http://localhost:9200/_snapshot/$REPO/_all"`
  # snapshotリストが取得できたかチェック
  if [ $? -ne 0 ];then
    send_slack "elasticsearch backup error!!\nsnapshot list error."
  else
    # 取得したsnapshotの構造チェック(snapshotsとその階層にsnapshotが存在する事)
    RESULT=`echo $SNAPSHOTS | jq '.snapshots[0] | has("snapshot")'`
    if [ $RESULT = false ];then
      send_slack "elasticsearch backup error!!\nsnapshot array check error."
    else
      # 取得したsnapshotのリストを常に7世代に保つように削除する
      # 7世代以下の時には走らない
      DELETE_SNAPSHOTS=`echo $SNAPSHOTS| jq -r ".snapshots[:-$LIMIT][].snapshot"`
      for DELETE_SNAPSHOT in $DELETE_SNAPSHOTS
      do
        curl -s -S -f -XDELETE \"http://localhost:9200/_snapshot/backup/$DELETE_SNAPSHOT\"
        # snapshotが削除できたかをチェック
        if [ $? -ne 0 ];then
          send_slack \"elasticsearch backup error!!\nold snapshot delete error.\"
        fi
      done
    fi
  fi
fi

JVMのパラメーターについては、導入当初Full GCが頻繁に起っていましたが、日々改善しながら頻度を下げる事ができました。

まとめ

Elasticsearchを利用する事で検索の速度をかなり改善する事ができました。
今後については5系のUPDATEを楽しみにしてます。
また、Elastic Inc.ではElasticサブスクリプションといった、
EC2のインスタンスやオンプレのサーバ上で動かしている、
Elasticsearchのサポートを受ける事ができるプランも存在するので導入を検討しています。
MySQLからElasticsearchにする上でGolang側でどういった工夫を行ったかについては、
別のメンバーが記事を書いてくれるので楽しみにしていてください。

  • このエントリーをはてなブックマークに追加

エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!

Recommend

【出張レポート】IAC XCO Security meeting@Dallas に参加してきました

SQLで分析を始めた人に贈る、中級者に上がるための10のTips -後編-