SlideShare a Scribd company logo
Elasticsearch at 
! 
@mumoshu
九岡 佑介(くおか ~) 
https://www.wantedly.com/users/392910
@mumoshu 
• 2008年~ NECビッグローブ 
• 2010年~ フリュー 
• 2013年~ グリー 
• 2014年~ クラウドワークス 
• 元々Scalaエンジニア 
• 今はRuby/インフラエンジニア
福井県出身 
おろし蕎麦が好き
クラウドワークス 
クラウドソーシングサービス 
http://crowdworks.jp/
仕事を探す・仕事をする・報酬をもらう 
インターネット上で完結
仕事の発注と受注ができる 
リモートワーク前提
188種類の仕事が発注できる
“クラウドソーシングは労働の 
「オープンソース化」” 
ジェフ・ハウ 
http://crowdworks.jp/adviser
“自分が将来リモートワークを 
する際の下地づくり” 
@mumoshu
「働く」を通して人々に笑顔を 
クラウドワークスのスローガン 
http://crowdworks.co.jp/
「ありがとう」ボタン 
感謝の気持ち 
の可視化
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の仕組みを利用)
Found 
Elasticsearch as a service 
http://found.no/
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: 
ありがとうございました!
We are hiring! 
https://crowdworks.co.jp/recruit/engineer/
質疑応答
本番テスト手順 
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

More Related Content

Elasticsearch at CrowdWorks