Transcript
Page 1: Elasticsearch at CrowdWorks

Elasticsearch at !

@mumoshu

Page 2: Elasticsearch at CrowdWorks

九岡 佑介(くおか ~)https://www.wantedly.com/users/392910

Page 3: Elasticsearch at CrowdWorks

@mumoshu• 2008年~ NECビッグローブ

• 2010年~ フリュー

• 2013年~ グリー

• 2014年~ クラウドワークス

• 元々Scalaエンジニア

• 今はRuby/インフラエンジニア

Page 4: Elasticsearch at CrowdWorks

福井県出身おろし蕎麦が好き

Page 5: Elasticsearch at CrowdWorks

クラウドワークスクラウドソーシングサービス http://crowdworks.jp/

Page 6: Elasticsearch at CrowdWorks

仕事を探す・仕事をする・報酬をもらうインターネット上で完結

Page 7: Elasticsearch at CrowdWorks

仕事の発注と受注ができるリモートワーク前提

Page 8: Elasticsearch at CrowdWorks

188種類の仕事が発注できる

Page 9: Elasticsearch at CrowdWorks

“クラウドソーシングは労働の「オープンソース化」”ジェフ・ハウ http://crowdworks.jp/adviser

Page 10: Elasticsearch at CrowdWorks

“自分が将来リモートワークをする際の下地づくり”@mumoshu

Page 11: Elasticsearch at CrowdWorks

「働く」を通して人々に笑顔を クラウドワークスのスローガン http://crowdworks.co.jp/

Page 12: Elasticsearch at CrowdWorks

「ありがとう」ボタン

感謝の気持ちの可視化

Page 13: Elasticsearch at CrowdWorks

Elasticsearch at CrowdWorks

Page 14: Elasticsearch at CrowdWorks

検索対象仕事

Page 15: Elasticsearch at CrowdWorks

結果• 検索時間が一桁短くなった

Page 16: 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)

Page 17: Elasticsearch at CrowdWorks

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)

Page 18: Elasticsearch at CrowdWorks

要件と仕様• 高可用性

• 検索性能重視

Page 19: Elasticsearch at CrowdWorks

高可用性• Elasticsearchが落ちた場合はInnoDB FTS(Full-text

search)で代替 (いわゆるGraceful Degradationの仕組み)

• 一部ユーザにだけElasticsearchによる検索を公開

(Feature Toggleの仕組み)

• 非同期でインデックス更新、失敗時はインターバルを変えながらリトライ

• サービス無停止でインデックス再構築

Page 20: Elasticsearch at CrowdWorks

検索性能重視• Dynamic Scriptingオフ

• Object Type/Nested Objects

• Parent/ChildでもNested Type/Documentsでもなく

• インデックス更新

• Elasticsearchのドキュメントを必要なフィールドだけ部分更新

• http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/partial-updates.html

Page 21: Elasticsearch at CrowdWorks

Mapping定義83行

Page 22: Elasticsearch at CrowdWorks

Elasticsearch

• Elasticsearch 1.3.4

• Foundというサービス

• メモリ 2GB、ディスク容量 16GBのクラスタ

Page 23: Elasticsearch at CrowdWorks

Gems

• elasticsearch-rails

• elasticsearch-model

• crowdworks/gracefully

• crowdworks/elasticsearch-model-extensions

• delayed_job

Page 24: Elasticsearch at CrowdWorks

Gracefullyの紹介• https://github.com/crowdworks/gracefully

• 「処理が失敗したときに、代替処理を呼び出す」を汎用化したライブラリ

• Graceful Degradationの実現に利用可能

• リトライ回数、代替処理と主処理の入れ替え(Fail-fast)までの連続失敗回数、タイムアウト秒数など設定可能

• Proc、メソッドを簡単にGraceful Degradation対応に

Page 25: Elasticsearch at CrowdWorks

*-extensionsの紹介• https://github.com/crowdworks/elasticsearch-model-extensions

• elasticsearch-modelの追加機能集

• Mappingからas_indexed_jsonメソッドの自動生成

• エイリアスを利用した無停止のインデックス再構築を1メソッドで

• ドキュメントの部分更新(ActiveRecord::Dirtyという変更検知の仕組みとElasticsearchのPartial Updateの仕組みを利用)

Page 26: Elasticsearch at CrowdWorks

FoundElasticsearch as a service http://found.no/

Page 27: Elasticsearch at CrowdWorks

Elasticsearch as a service• ダウンタイムなしでクラスタサイズ変更可能

• ダウンタイムなしでElasticsearchアップグレード可能

• 最小クラスタ: メモリ256MB、ディスク2GB

• 最大クラスタ: メモリ32GB、ディスク256GB

• SSDあり

• HA構成(2つ以上のDCにサーバを分散)可能

• ただし日本リージョンは未対応…

Page 28: Elasticsearch at CrowdWorks

Elasticsearch as a service• Elasticsearchに(まだ)ない機能

• Web UIでクラスタ設定変更

• セキュリティ

• httpsとBasic認証、ACL

• read、read/write用ユーザを作成可能

Page 29: Elasticsearch at CrowdWorks

まとめ• クラウドワークスのRailsアプリの検索をElasticsearchベースに→検索時間が1桁短く

• Elasticsearch as a serviceであるFoundを利用→運用フリー

• 高可用性→Elasticsearchが落ちても安心

• 検索速度重視の設計が特徴

• そのために開発したソフトウェアはOSSとして公開→Elasticsearchコミュニティに還元

Page 30: Elasticsearch at CrowdWorks

TODO

• Elasticsearchによる検索を

100%のユーザに公開

• 仕事検索以外にもElasticsearchを適用

Page 31: Elasticsearch at CrowdWorks

ありがとうございました!

:bow:

Page 32: Elasticsearch at CrowdWorks

We are hiring!https://crowdworks.co.jp/recruit/engineer/

Page 33: Elasticsearch at CrowdWorks

質疑応答

Page 34: Elasticsearch at CrowdWorks

本番テスト手順1. Elasticsearchのインデックス更新を100%公開

2. インデックスを再構築

• 再構築開始時点の全データがインデックス化される

• 再構築の開始から終了までに作成されたデータがインデックスから漏れると困るので、予め1を実行した

3. Elasticsearchによる検索を

10%のユーザに公開

4. しばらくスモークテスト

5. 問題あれば非公開に戻す

Page 35: Elasticsearch at CrowdWorks

学習リソース• Wantedlyさんのブログとスライド

• http://www.elasticsearch.org/guide/

• https://www.found.no/foundation/

• 分散システム一般

Page 36: Elasticsearch at CrowdWorks

開発リソース• 全エンジニア: 8名(うち鳥取1名)

• Elasticsearch対応: 1名

Page 37: Elasticsearch at CrowdWorks

負荷テスト• CloudFormationとFoundで立ち上げた環境+本番相当の規模のデータセット

• Gatling


Top Related