Post on 02-Jul-2015
description
Elasticsearch at !
@mumoshu
@mumoshu• 2008年~ NECビッグローブ
• 2010年~ フリュー
• 2013年~ グリー
• 2014年~ クラウドワークス
• 元々Scalaエンジニア
• 今はRuby/インフラエンジニア
福井県出身おろし蕎麦が好き
仕事を探す・仕事をする・報酬をもらうインターネット上で完結
仕事の発注と受注ができるリモートワーク前提
188種類の仕事が発注できる
“自分が将来リモートワークをする際の下地づくり”@mumoshu
「ありがとう」ボタン
感謝の気持ちの可視化
Elasticsearch at CrowdWorks
検索対象仕事
結果• 検索時間が一桁短くなった
Elasticsearchなし(db.m3.large)
• Completed 200 OK in 7096.3ms (Views: 217.5ms | ActiveRecord: 6794.6ms | Elasticsearch: 0.0ms)Completed 200 OK in 1676.2ms (Views: 211.3ms | ActiveRecord: 1409.3ms | Elasticsearch: 0.0ms)Completed 200 OK in 1657.5ms (Views: 210.7ms | ActiveRecord: 1405.8ms | Elasticsearch: 0.0ms)
Elasticsearchあり(Found 4GB)• Completed 200 OK in 648.7ms (Views: 355.5ms
| ActiveRecord: 77.6ms | Elasticsearch: 194.5ms)Completed 200 OK in 580.4ms (Views: 372.7ms | ActiveRecord: 67.4ms | Elasticsearch: 118.6ms)Completed 200 OK in 626.9ms (Views: 367.8ms | ActiveRecord: 71.1ms | Elasticsearch: 152.2ms)
要件と仕様• 高可用性
• 検索性能重視
高可用性• Elasticsearchが落ちた場合はInnoDB FTS(Full-text
search)で代替 (いわゆるGraceful Degradationの仕組み)
• 一部ユーザにだけElasticsearchによる検索を公開
(Feature Toggleの仕組み)
• 非同期でインデックス更新、失敗時はインターバルを変えながらリトライ
• サービス無停止でインデックス再構築
検索性能重視• Dynamic Scriptingオフ
• Object Type/Nested Objects
• Parent/ChildでもNested Type/Documentsでもなく
• インデックス更新
• Elasticsearchのドキュメントを必要なフィールドだけ部分更新
• http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/partial-updates.html
Mapping定義83行
Elasticsearch
• Elasticsearch 1.3.4
• Foundというサービス
• メモリ 2GB、ディスク容量 16GBのクラスタ
Gems
• elasticsearch-rails
• elasticsearch-model
• crowdworks/gracefully
• crowdworks/elasticsearch-model-extensions
• delayed_job
Gracefullyの紹介• https://github.com/crowdworks/gracefully
• 「処理が失敗したときに、代替処理を呼び出す」を汎用化したライブラリ
• Graceful Degradationの実現に利用可能
• リトライ回数、代替処理と主処理の入れ替え(Fail-fast)までの連続失敗回数、タイムアウト秒数など設定可能
• Proc、メソッドを簡単にGraceful Degradation対応に
*-extensionsの紹介• https://github.com/crowdworks/elasticsearch-model-extensions
• elasticsearch-modelの追加機能集
• Mappingからas_indexed_jsonメソッドの自動生成
• エイリアスを利用した無停止のインデックス再構築を1メソッドで
• ドキュメントの部分更新(ActiveRecord::Dirtyという変更検知の仕組みとElasticsearchのPartial Updateの仕組みを利用)
Elasticsearch as a service• ダウンタイムなしでクラスタサイズ変更可能
• ダウンタイムなしでElasticsearchアップグレード可能
• 最小クラスタ: メモリ256MB、ディスク2GB
• 最大クラスタ: メモリ32GB、ディスク256GB
• SSDあり
• HA構成(2つ以上のDCにサーバを分散)可能
• ただし日本リージョンは未対応…
Elasticsearch as a service• Elasticsearchに(まだ)ない機能
• Web UIでクラスタ設定変更
• セキュリティ
• httpsとBasic認証、ACL
• read、read/write用ユーザを作成可能
まとめ• クラウドワークスのRailsアプリの検索をElasticsearchベースに→検索時間が1桁短く
• Elasticsearch as a serviceであるFoundを利用→運用フリー
• 高可用性→Elasticsearchが落ちても安心
• 検索速度重視の設計が特徴
• そのために開発したソフトウェアはOSSとして公開→Elasticsearchコミュニティに還元
TODO
• Elasticsearchによる検索を
100%のユーザに公開
• 仕事検索以外にもElasticsearchを適用
ありがとうございました!
:bow:
質疑応答
本番テスト手順1. Elasticsearchのインデックス更新を100%公開
2. インデックスを再構築
• 再構築開始時点の全データがインデックス化される
• 再構築の開始から終了までに作成されたデータがインデックスから漏れると困るので、予め1を実行した
3. Elasticsearchによる検索を
10%のユーザに公開
4. しばらくスモークテスト
5. 問題あれば非公開に戻す
学習リソース• Wantedlyさんのブログとスライド
• http://www.elasticsearch.org/guide/
• https://www.found.no/foundation/
• 分散システム一般
開発リソース• 全エンジニア: 8名(うち鳥取1名)
• Elasticsearch対応: 1名
負荷テスト• CloudFormationとFoundで立ち上げた環境+本番相当の規模のデータセット
• Gatling