59
page Feb, 2014 07th MySQLユーザ視点での 小さく始めるElasticsearch Kentaro Yoshida in 3Elasticsearch勉強会 1

MySQLユーザ視点での小さく始めるElasticsearch

Embed Size (px)

DESCRIPTION

第3回Elasticsearch勉強会での発表資料です

Citation preview

Page 1: MySQLユーザ視点での小さく始めるElasticsearch

page

Feb, 201407th

MySQLユーザ視点での小さく始めるElasticsearchKentaro Yoshida in 第3回 Elasticsearch勉強会

1

Page 2: MySQLユーザ視点での小さく始めるElasticsearch

page

1. はじめに2. 自己紹介3. 今回のテーマ4. Yamabikoの紹介5. 検索ことはじめ6. Elasticsearch雑感7. まとめ

本日の流れ

2

Page 3: MySQLユーザ視点での小さく始めるElasticsearch

page

1. はじめに

3

Page 4: MySQLユーザ視点での小さく始めるElasticsearch

page

こんなお悩みを抱えていませんか?

4

Page 5: MySQLユーザ視点での小さく始めるElasticsearch

page

MySQLを利用している

5

Page 6: MySQLユーザ視点での小さく始めるElasticsearch

page

だけれども、

6

Page 7: MySQLユーザ視点での小さく始めるElasticsearch

page

検索漏れが少ない日本語全文検索 “Kuromoji”を使いたい!

7

Searchモード・Extendedモードが秀逸

Page 8: MySQLユーザ視点での小さく始めるElasticsearch

page

つまり

8

Page 9: MySQLユーザ視点での小さく始めるElasticsearch

page

“Solr” or “Elasticsearch” が必要

9

Page 10: MySQLユーザ視点での小さく始めるElasticsearch

page

APIをRESTfulに扱える “Elasticsearch” がアツい

10

Page 11: MySQLユーザ視点での小さく始めるElasticsearch

page

【課題】異種RDB間のデータ同期

11

Page 12: MySQLユーザ視点での小さく始めるElasticsearch

page

2. 自己紹介

12

Page 13: MySQLユーザ視点での小さく始めるElasticsearch

page

自己紹介

13

•よしけんさん• (株)リブセンス• Web系インフラの研究開発エンジニア

• Elasticsearch歴:2013年 初夏~

好きなプロダクト

Page 14: MySQLユーザ視点での小さく始めるElasticsearch

お知らせ

Page 15: MySQLユーザ視点での小さく始めるElasticsearch
Page 16: MySQLユーザ視点での小さく始めるElasticsearch

page

3.今回のテーマ

16

Page 17: MySQLユーザ視点での小さく始めるElasticsearch

page

今回のテーマ

17

実データを用いて手軽にElasticsearchと連携した検索を行いたいElasticsearchをスモールスタートで使い始めたい既存プログラムの更新系処理に触れずに小さく始めたい

メインRDBはMySQLではあるが、検索のみElasticsearchを使う構成Amazon RDS for MySQLにも応用できる手離れの良い構成にしたい

MySQLサーバの管理無しに冗長化構成を実現できる (Multi-AZ)

Page 18: MySQLユーザ視点での小さく始めるElasticsearch

page

MySQLのレコードをElasticsearchへ同期したい

18

Page 19: MySQLユーザ視点での小さく始めるElasticsearch

page

つまり異種RDB間のデータ同期

19

Page 20: MySQLユーザ視点での小さく始めるElasticsearch

page

既存製品はElasticsearch非対応Attunity Replicate / Tungsten Replicator

20

Page 21: MySQLユーザ視点での小さく始めるElasticsearch

page

そこに... Riverプラグインを発見

21

Page 22: MySQLユーザ視点での小さく始めるElasticsearch

page

elasticsearch-river-jdbc

22

概要ElasticsearchのRiverプラグインとして動作するJDBCドライバを指定することで各種RDBからレコードを流し込めるSQLを一定間隔で実行し、その結果を基に取り込みを行う実テーブルだけでなくVIEWテーブルからも取り込める

Page 23: MySQLユーザ視点での小さく始めるElasticsearch

page

elasticsearch-river-jdbc

23

不都合な点動作が安定せずElasticsearchサーバを再起動する必要があるしばらく動いていたがいつの間にか止まっている現象Elasticsearchサーバ側の役割が増え、単機能ではなくなる

同期する度にElasticsearch側のドキュメントが空になる挙動

Page 24: MySQLユーザ視点での小さく始めるElasticsearch

page

MySQL BinlogAPIが役立つのでは?

24

Page 25: MySQLユーザ視点での小さく始めるElasticsearch

page

試してみたものの・・・

25

Page 26: MySQLユーザ視点での小さく始めるElasticsearch

page

安定稼働への道が遠く、挫折...

26

Page 27: MySQLユーザ視点での小さく始めるElasticsearch

page

そこで!

27

Page 28: MySQLユーザ視点での小さく始めるElasticsearch

page

欲しいものが無いので作りました

28

Page 29: MySQLユーザ視点での小さく始めるElasticsearch

page

4. Yamabiko

29

Page 30: MySQLユーザ視点での小さく始めるElasticsearch

page

Yamabiko

30

https://github.com/y-ken/yamabiko

���������� ����� � ����������������� ����� � ����

����������

��� �������� ��

���� ������������������ ��

�������������

���� ������������������ ��

��������

����������� �������������������

������������ !"#$���������%&'(��")*

� �� ����������+,-./0�1�2345%6789:

�������������

���

���

������������

Page 31: MySQLユーザ視点での小さく始めるElasticsearch

page

Yamabiko

31

概要MySQLからElasticsearchへデータを非同期に逐次反映

Amazon RDS・MariaDB・PerconaServer等の互換DBにも対応

Elasticsearchとは別の単体ミドルウェアとして動作

CentOS 6.x向けのRPMパッケージとして配布中任意のSQL文の結果の差分から、insert/update/deleteイベントを検知

SELECT * FROM contents WHERE DATE_ADD(updated_at, INTERVAL 5 MINUTE) > NOW(); といったクエリで差分同期も可能

Page 32: MySQLユーザ視点での小さく始めるElasticsearch

page

Yamabiko

32

ユニークな特徴:delete検知が出来るPrimaryKeyのギャップ判定を行うことで実現行が物理削除されてしまうケースでも追従可能

数十万行単位でも動作します

なぜ更新ログ(BinaryLog)ではなくSQLの結果を同期するのか?JOIN無しで検索するnoSQL的概念に対応させるため非正規化VIEWテーブルを作ることを想定

Page 33: MySQLユーザ視点での小さく始めるElasticsearch

page

Yamabikoシステム構成例

33

mysql_replicator_multi を利用する場合Yamabikoが使うメタデータを格納するためのMySQLを指定同期情報管理テーブル更新/削除判定用のハッシュテーブル

同期する行数がさほど無ければデータ参照元に相乗りしても良い

INSERT/SELECT

全文検索

Page 34: MySQLユーザ視点での小さく始めるElasticsearch

page

5. 検索ことはじめ

34

Page 35: MySQLユーザ視点での小さく始めるElasticsearch

page

データ投入

35

かねてから無償配布されているライブドアグルメのCSVデータを利用MySQLをGUI管理できるMacアプリ”Sequel Pro"を用いてDBへ流し込むYamabikoを利用し、MySQLからデータの同期を始める登録クエリ:SELECT * FROM restaurants WHERE closed = 0;

次のトピックは後ほど解説mapping:緯度経度を扱えるgeo_point型を使うためanalyzer:高機能な全文検索を扱えるKuromojiを使うため

Page 36: MySQLユーザ視点での小さく始めるElasticsearch

page 36

Page 37: MySQLユーザ視点での小さく始めるElasticsearch

page

検索クエリ

37

curl -X POST 'http://localhost:9200/livedoor-gourmet/_search?pretty' -d '{ "query":{ "query_string":{ "query":"name:ワイン AND pref_id:13" } }, "sort" : [ { "access_count" : "desc" }, "fan_count", "_score" ], "from" : 0, "size" : 10}'

Luceneクエリで条件指定いわゆるWHERE句

並び替え条件を指定ORDER BY access_count DESC ...

範囲選択 LIMIT 0, 10

Page 38: MySQLユーザ視点での小さく始めるElasticsearch

page

意外と簡単!

38

Page 39: MySQLユーザ視点での小さく始めるElasticsearch

page

緯度経度検索

39

MySQLでのGeo検索はイケてないのですSPATIALインデックスを使えるのはMyISAMだけ最近はInnoDBでGeohashを用いればある程度のことは出来る

Geohashにも対応しているElasticsearchであれば、Z曲線のグループ毎にfacet検索できるので、地域毎に何件ヒットしたかの検索も(多分)可能MySQL側で緯度と経度が別カラムに格納されているテーブルをYamabikoを使ってElasticsearchに流し込む場合には、SELECT文に CONCAT(lat, ",", lon) AS location という列を追加し、次ページのmapping定義をすれば緯度経度や近傍検索が出来る

Page 40: MySQLユーザ視点での小さく始めるElasticsearch

page

緯度経度検索

40

# mapping定義を行った後にデータを流し込む$ curl -XPUT "http://localhost:9200/livedoor/restaurants/_mapping" -d '{ "restaurants" : { "properties" : { "location": { "type": "geo_point", "lat_lon": "true" } } }}'

Page 41: MySQLユーザ視点での小さく始めるElasticsearch

page

緯度経度検索

41

# 検索例 渋谷近辺で店名に「ワイン」を含むお店を10件リストアップします$ curl -XGET "http://localhost:9200/livedoor/restaurants/_search?pretty" -d '{ "query" : { "filtered" : { "query":{ "query_string":{ "query":"name:ワイン" } }, "filter" : { "geo_distance" : { "distance" : "1km", "location" : { "lat" : 35.3924, "lon" : 139.4157 } } } } }, "from" : 0, "size" : 10}'

Page 42: MySQLユーザ視点での小さく始めるElasticsearch

page

意外と簡単!

42

Page 43: MySQLユーザ視点での小さく始めるElasticsearch

page

Mapping

43

個別指定したい場合には全てのフィールドを定義しなくとも、個別指定したいカラムのみのmappingをPOSTすることでも動くindexやtypeの動的生成をする場合の注意フィールドの型を推論してくれるのは便利だが、意図せぬ挙動を防ぐためにも、実運用時はきちんと定義しておきたい初回に投入されたドキュメントの内容でカラムが決まるため

MySQLと違い、後でMappingの定義の変更は不可パフォーマンス的観点からも、not_analyzedも含めて指定すると良いデフォルトではString型の文字は全てngramで分解するため

Page 44: MySQLユーザ視点での小さく始めるElasticsearch

page

Analyzer

44

Kuromojiの利用方法環境:Elasticsearch 1.0.0 RC2 RPM注意点次のような手順でプラグインをインストール indexを作る前に登録する必要がある(既にある場合は作り直し)プラグインを入れた後はelasticsearchを再起動する

$ cd /usr/share/elasticsearch$ sudo ./bin/plugin --install \ elasticsearch/elasticsearch-analysis-kuromoji/2.0.0.RC1$ sudo /etc/init.d/elasticsearch restart

Page 45: MySQLユーザ視点での小さく始めるElasticsearch

page

Analyzer

45

$ curl -XPUT 'http://localhost:9200/livedoor/' -d'{ "index":{ "analysis":{ "tokenizer" : { "kuromoji" : { "type" : "kuromoji_tokenizer", "mode" : "extended" } }, "analyzer" : { "analyzer" : { "type" : "custom", "tokenizer" : "kuromoji" } } } }}'

Page 46: MySQLユーザ視点での小さく始めるElasticsearch

page

6. Elasticsearch雑感

46

Page 47: MySQLユーザ視点での小さく始めるElasticsearch

page

MySQL脳から見たElasticsearch

47

Page 48: MySQLユーザ視点での小さく始めるElasticsearch

page

Elasticsearch ステキな所

48

MySQL同様にRPMパッケージを利用して手軽に構築できるSolrと異なり、完全RestAPIで操作できるFacet検索は大変便利配列型はタグ検索にも大変便利Luceneクエリは学習コストが低く直感的複数カラムに渡る検索条件を指定しても速い

MySQLと異なり1テーブル1インデックスという制約が無いため複数のソートキーを重み付けしながら使える (boost)緯度経度周りの検索がMySQLのそれよりも高機能である

Page 49: MySQLユーザ視点での小さく始めるElasticsearch

page

Elasticsearch ハマり所

49

Query DSLは奥が深く実に複雑なため、未だに自在に操れません...mapping定義を更新するためには、index/typeごと消す必要があること列はinsertAPIやbulkAPIでは自動追加されないため、updateAPIを用いるnoSQL的な概念の理解

GROUP BYに相当する機能は無いGitHubの Field Collapsing/Combining · Issue #256 の今後に期待

MySQLでは正規化さえしておけばSQL言語で自在に扱えるが、JOINが出来ないElasticsearchでは厳しい。そのため、取り出したい形式に合わせた非正規化データ構造を入念に準備する必要があること

Page 50: MySQLユーザ視点での小さく始めるElasticsearch

page

Elasticsearch ハマり所

50

noSQL故にJOIN出来ないということは、結果として各typeに同じデータを複製された状態で持たせることになり、一貫性が失われるという懸念

mappingやデータ登録時の_parentや_childを使うと類似の事は可能ただし、1:Nとしての紐付け、つまりLEFT JOIN的な事は不可能こちらのページの「Parent & child」が分かりやすいのでオススメFun with elasticsearch's children and nested documents - Space Vaticanhttp://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/

Page 51: MySQLユーザ視点での小さく始めるElasticsearch

page

7. まとめ

51

Page 52: MySQLユーザ視点での小さく始めるElasticsearch

page

まとめ

52

Elasticsearchの手軽さは革命的

ElasticsearchはKibanaの為だけのプロダクトではない

Yamabikoを使えば、並行運用しつつスモールスタートが可能

Page 53: MySQLユーザ視点での小さく始めるElasticsearch

お知らせ

Page 54: MySQLユーザ視点での小さく始めるElasticsearch

お知らせ

Page 55: MySQLユーザ視点での小さく始めるElasticsearch
Page 56: MySQLユーザ視点での小さく始めるElasticsearch
Page 57: MySQLユーザ視点での小さく始めるElasticsearch
Page 58: MySQLユーザ視点での小さく始めるElasticsearch

“Air Intern”にてオフィス動画を公開中 http://airintern.com/company/detail/livesense

“LIVESENSE made*”にてエンジニア求人掲載中

http://made.livesense.co.jp/

Page 59: MySQLユーザ視点での小さく始めるElasticsearch

page

Thanks!

59

ご清聴ありがとうございました。