13th
Dec, 2013

Fluentd as a Middleware Engine
MySQLのテーブルをElasticsearchへレプリケートする話
Kentaro Yoshida at Fluentd Casual Talks #3

page 1
MySQLのテーブルを
Elasticsearchにレプリケート…?

page 2
それをFluentdで!?

page 3
はい、作ってみました。
その名は Yamabiko です。

page 4
1. Yamabikoとは

本日の流れ

2. 自己紹介
3. 活用方法
4. まとめ

page 5
1. Yamabikoとは

page 6
Yamabikoとは

https://github.com/y-ken/yamabiko
page 7
Yamabikoのコアプラグイン

https://github.com/y-ken/fluent-plugin-mysql-replicator
page 8
Yamabikoの機能概要
Fluentd (td-agent) をコアエンジンに利用
出力のバッファリングやリトライ機構などを任せられる
Fluentd + fluent-plugin-mysql-replicatorをデーモン化したもの
MySQLから、透過的にElasticsearchへレコードの同期を行う
AWS RDS・MariaDB・PerconaServer等の互換DBにも対応
任意のSQL文の結果の差分から、insert/update/deleteイベントを検知
SELECT * FROM search_test WHERE DATE_ADD(updated_at,
INTERVAL 5 MINUTE) > NOW(); といったクエリで差分同期も可能
page 9
Elasticsearchとは
Luceneベースの検索エンジン(SolrもLuceneベース)
MySQLが苦手とするファセット検索等も当然対応している
日本語全文検索にも対応(kuromoji)
GitHub・stackoverflow・PATH・foursquareなどが採用
マルチテナント・スキーマレス・RestfulAPIがアツい
複数ノードを利用した高速な分散検索も可能
RPMコマンドで簡単にインストール可能
page 10
Yamabikoの挙動
mysql> create database myweb;
mysql> create table search_test (
id int auto_increment,
text text,
PRIMARY KEY (id)
);

page 11
Yamabikoの挙動
# query
insert into search_test(text) values('aaa');
# notify event to fluentd
# format: replicator.${db}.${table}.${event}.${pk}
tag:
replicator.myweb.search_test.insert.id
record:
{"id":"1","text":"aaa"}

page 12
Yamabikoの挙動
# query
update search_test set text='bbb' where text = 'aaa';
# notify event to fluentd
tag:
replicator.myweb.search_test.update.id
record:
{"id":"1","text":"bbb"}

page 13
Yamabikoの挙動
# query
delete from search_test where text='bbb';
# notify event to fluentd
tag:
replicator.myweb.search_test.delete.id
record:
{"id":"1"}

page 14
2. 自己紹介

page 15
自己紹介
• よしけんさん
• @yoshi_ken
• (株)リブセンス
• Web系インフラの

研究開発エンジニア
• Fluentd歴
好きなプロダクト

page 16

2012/4月∼
page 17
3. 活用方法

page 18
インストール
手元のfluentd環境への導入
$ gem install fluent-plugin-mysql-replicator
既存のFluentdとは独立した Yamabiko としての導入
github.com/y-ken/yamabiko にてRPMパッケージを配布中
詳しい設定方法は README.md にまとめています
github.com/y-ken/fluent-plugin-mysql-replicator

page 19
設定サンプル
<source>
type mysql_replicator
host localhost
username your_mysql_user
password your_mysql_password
database myweb
query SELECT id, text, updated_at from search_test;
tag replicator.myweb.search_test.${event}.$
{primary_key}
</source>
page 20
設定サンプル
<source>
type mysql_replicator_multi
manager_host localhost
manager_username your_mysql_user
manager_password your_mysql_password
manager_database replicator_manager
tag replicator.${name}.${event}.${primary_key}
</source>

page 21
設定サンプル
<match replicator.**>
type mysql_replicator_elasticsearch
host localhost
port 9200
flush_interval 5s
flush_at_shutdown yes
</match>

page 22
運用実績
テーブル数
28テーブル
総行数
約800万行
総容量
約4GB

page 23

Yamabiko稼働サーバ
KVMの仮想マシン
CPU 1コア
メモリ1GB
取り分は50MB程度
6. まとめ

page 24
まとめ
github.com/y-ken/fluent-plugin-mysql-replicator
MySQLのレコードを非同期にElasticsearchに転送するプラグイン。
github.com/y-ken/yamabiko
Fluentd+上記プラグインをパッケージ化したミドルウェアであり、
既存のRubyやtd-agentと競合せずに独立して動作する。
想定ユースケース
MySQLを利用したまま、Elasticsearchとの並行運用を行う。
例えばAWS RDSと組み合わせると、運用の手間を最小化した
準リアルタイムでレコードが同期される全文検索サーバが手に入る。
page 25
Yamabiko
[やまびこ]

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

page 26
We’re hiring!
お知らせ
Thanks!
ご清聴ありがとうございました。

page 34

Fluentdベースのミドルウェア"Yamabiko"でMySQLのテーブルをElasticsearchへレプリケートする話 #fluentdcasual