SlideShare a Scribd company logo
Binlog Events で
ストリーム処理してみた
ヤフー株式会社
三谷 智史
自己紹介
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
2
• 三谷 智史(@mita2)
• 所属
ヤフー(株)
DBMS技術
• RDB専門部隊 13名
• DB Administration 黒帯
本日の流れ
1. Yahoo JAPAN! のMySQL 利用状況
2. ストリーム処理の利点
3. Binlog Events を検証してみた
1. サンプルコード解説
2. 更新内容を取り出す方法
3. ありそうで、なかった機能
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
3
本日の流れ
1. Yahoo JAPAN! のMySQL 利用状況
2. ストリーム処理の利点
3. Binlog Events を検証してみた
1. サンプルコード解説
2. 更新内容を取り出す方法
3. ありそうで、なかった機能
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
4
Yahoo! JAPANのMySQL環境
• Yahoo!ニュース、Yahoo!ショッピン
グ、Yahoo!ブログ、Yahoo!路線 etc
ほぼ全サービスで利用
• 約550DB
構成
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
6
サーバ台数
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
7
• 約220台
• オンプレです
• 容量18TB
• ※ マスターのみカウント
マスター
サーバ
スレーブ
サーバ
バックアップ用
スレーブ
サーバ構成比率
共有ストレージのHAです
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
8
• 複数MySQLを集約
• 商用ストレージ
• 詳細:
「レプリケーションを使わない」
でWEB検索
共有ストレージのHAです
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
9
• 複数MySQLを集約
• 商用ストレージ
• 詳細:
「レプリケーションを使わない」
でWEB検索
Oracle Clusterware
使ってます
Oracle Clusterware
使ってます
世間で実績の少なそうな?機能の実績
• 5.6 + GTID
• 100DB以上で動かしてますが問題ないです
• パーティション
• 20DB以上で採用
• DROP PARITTIONによる高速データ削除
• ALTERに問題あり、使うなら5.6から… (Bug 77318)
• InnoDBテーブル 圧縮
• 20DB以上で採用。READ IO減ってかなりGOOD。
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
10
We love MySQL
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
11
0
100
200
300
400
500
600
We Love
本日の流れ
1. Yahoo JAPAN! のMySQL 利用状況
2. ストリーム処理の利点
3. Binlog Events を検証してみた
1. サンプルコード解説
2. 更新内容を取り出す方法
3. ありそうで、なかった機能
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
12
Yahoo! におけるストリーム処理
13
• 設立初期からストリーム処理を活用
• fluentd的なミドルウェア
決済システム
購入処理購入処理
Log
Reader
Log
Reader
Log
Consumer
Log
Consumer
Log
Consumer
Log
Consumer
トランザク
ションログ
トランザク
ションログ
ECサービス
システム
ストレージサービス
システム
キャンペーン
フラグON
容量増量
フラグON
プレミアム
会員購入 非同期転送
処理イメージ、実際とは異なります
ストリーム処理の3つの利点
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
14
1.スケールアウト
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
15
スケールアウトしやすいスケールアウトしやすい
決済システム
購入処理購入処理
Log
Reader1
Log
Reader1
Log
Consumer2
Log
Consumer2
Log
Consumer1
Log
Consumer1
トランザク
ションログ
トランザク
ションログ
ECサービス
システム
キャンペーン
フラグON
Log
Reader2
Log
Reader2
ユーザIDで
分散
ユーザIDで
分散
2.連携先の影響を受けにくい
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
16
連携先の影響を受けにくい連携先の影響を受けにくい
決済システム
購入処理購入処理
Log
Reader
Log
Reader
Log
Consumer
Log
Consumer
Log
Consumer
Log
Consumer
トランザク
ションログ
トランザク
ションログ
ECサービス
システム
ストレージサービス
システム
キャンペーン
フラグON
容量増量
フラグON
非同期転送
DOWNDOWN
3.リアルタイム
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
17
リアルタイムリアルタイム
☆ チン マチクタビレタ~
マチクタビレタ~
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < MySQLでストリーム処理まだ~
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 愛媛みかん |/
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
18
(社内の声)
本日の流れ
1. Yahoo JAPAN! のMySQL 利用事例
2. ストリーム処理の利点
3. Binlog Events を検証してみた
1. サンプルコード解説
2. 更新内容を取り出す方法
3. ありそうで、なかった機能
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
19
MySQL Binlog Events
• バイナリログを用いたストリーム処理ができる
• MySQL Labs で公開中(2015/12現在)
• 昔はBinlog APIっていうやつがあったらしい
• C++ libraries
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
20
利用イメージ
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
21
決済システム
購入処理購入処理
BinlogEvents
を使ったプログラム
BinlogEvents
を使ったプログラム
バイナリログバイナリログ
ECサービス
システム
ストレージサービス
システム
キャンペーン
フラグON
容量増量
フラグON
非同期転送
処理イメージ
• さっきの例だとこう
BinlogEvents
を使ったプログラム
BinlogEvents
を使ったプログラム
まずはサンプルコード
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
22
Binlog Eventsのビルド
• Labs から mysql-binlog-events-1.0.1-src.tar.gz をDL
• サンプルが同梱されてます
• mysql-devel パッケージだけではビルド不可
• MySQL5.7 のソースもダウンロードしましょう
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
23
$ cmake -DMYSQLCLIENT_STATIC_LINKING:BOOL=TRUE ¥
-DMYSQL_DIR=/usr/bin ¥
-DMYSQL_SOURCE_INCLUDE_DIR=<ソース置いた場所>/include ¥
-DENABLE_DOWNLOADS=1 .
$ make
$ cd example
$ make
接続先はどのバージョンでも大丈夫
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
24
MySQL 5.5
MySQL 5.6
MySQL 5.7
CHANGE LOG
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
25
############################
ChangeLog for Binary Log API
############################
Release 0.1.0 (released April 20, 2013)
---------------------------------------
* BAPI-1: In the binlog-replication-listener library,
mysql::Binary_log::connect function does not abort when
non-existent file name or server is provided
付属のサンプルは3つ
• basic-1
• basic-2
• binlog-browser
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
26
付属のサンプルは3つ
• basic-1
• basic-2
• binlog-browser
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
27
basic-1
• URI の書き方
mysql://user:password@localhost:3306
file:///var/lib/mysql/mysql-bin.000002
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
28
$ ./basic-1 mysql://root:Password123_@localhost:3306
basic-1 のソース - 接続方法
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
29
Binary_log_driver *drv= create_transport(argv[1]);
if (drv == NULL)
return 1;
Binary_log binlog(drv);
if (binlog.connect() != ERR_OK)
{
delete drv;
return 1;
}
URIを渡して接続URIを渡して接続
basic-1 を動かしてみる
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
30
$ ./basic-1 mysql://root:Password123_@localhost:3306
Found event of type 2
Found event of type 19
Found event of type 30
mysql> CREATE TABLE `mytable` ~
mysql> INSERT INTO mytable (v1) VALUES('abc');
イベントとは
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
31
QueryQuery BEGINBEGIN
Table_MapTable_Map 処理する対象テーブルの指定処理する対象テーブルの指定
Write_rowsWrite_rows INSERT INTO ~INSERT INTO ~
Update_rowsUpdate_rows UPDATE ~UPDATE ~
• 1つのトランザクションは複数イベントで構成
• 「Table_Map」や「Rotate」など特殊なイベン
トもある
イベントタイプ イベント内容(イメージ)
トランザクション
POS
POS
POS
POS
EVENT_TYPE 一覧
Unknown
Start_v3
Query
Stop
Rotate
Intvar
Load
Slave
Create_file
Append_block
Exec_load
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
32
Delete_file
New_load
RAND
User var
Format_desc
Xid
Begin_load_query
Execute_load_query
Table_map
Write_rows_event_old
Update_rows_event_old
Delete_rows_event_old
Write_rows_v1
Update_rows_v1
Delete_rows_v1
Incident
Heartbeat
Ignorable
Rows_query
Write_rows
Update_rows
Delete_rows
Gtid
Anonymous_Gtid
Previous_gtids
User Defined
付属のサンプルは3つ
• basic-1
• basic-2
• binlog-browser
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
33
basic-2 を動かしてみる
• SQLが表示される・・・?
• basic-2 はバグってます
• 本当は 変数 を値に置換してSQLを表示する
プログラムです
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
34
$ ./basic-2 mysql://root:Password123_@localhost:3306
create table mytable (pk serial, v1 varchar(255))
BEGIN
insert into mytable (v1) values(@myvar) 置換されてない置換されてない
なおしました
パッチ
https://gist.github.com/anonymous/02593d4981ac826f9837
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
35
basic-2 を動かしてみる(修正ver)
• binlog_format=STATEMENTで動かしましょう
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
36
$ ./basic-2 mysql://root:Password123_@localhost:3306
create database hogex
create table mytable (pk serial, v1 varchar(255))
insert into mytable (v1) values(123) @myvarが置換される@myvarが置換される
mysql> CREATE TABLE mytable (pk SERIAL, v1 VARCHAR(5));
mysql> SET @myvar=“123”;
mysql> INSERT INTO mytable (v1) VALUES(@myvar);
basic-2 のソース
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
37
basic-2 のソース - main
Map variables;
Save_variables<Map> save_variables(variables);
Content_stream_handler handler;
handler.add_listener(save_variables);
Replace_variables<Map> replace_variables(variables);
handler.add_listener(replace_variables);
<snip>
while (true)
{
int error_number;
error_number= drv->get_next_event(&buf_and_len);
<snip>
handler.handle_event(&event);
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
38
ハンドラーを生成ハンドラーを生成
ハンドラーを登録ハンドラーを登録
バイナリログから
イベントを読み取る
バイナリログから
イベントを読み取る
登録したハンドラーに
イベントを渡してを処理
登録したハンドラーに
イベントを渡してを処理
ループループ
Binlog Events の設計思想
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
39
Get_next_eventGet_next_event
ループループ
ループ
コンテンツハンドラ
(クラス)
コンテンツハンドラ
(クラス)
- process_event(Delete_rows)
- process_event(Write_rows)
- process_event(Delete_rows)
- process_event(Write_rows)
コンテンツハンドラコンテンツハンドラ
コンテンツハンドラコンテンツハンドラ
• 1イベントごとにハンドラで定義し
たprocess_eventが呼び出される
• イベントタイプごとに処理したい内
容をコーディングする
• コンテンツハンドラは複数設定可能
INSERTされたとき
に実施したい処理を
書く
INSERTされたとき
に実施したい処理を
書く
Save_variablesコンテンツハンドラ
template <class AssociativeContainer>
class Save_variables : public Content_handler {
Binary_log_event *process_event(User_var_event *event) {
std::string a(event->val, 0, event->val_len);
m_var[event->name] = a;
return event;
}
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
40
変数のSETイベント
を受け入れる
例)SET @abc = 123
変数のSETイベント
を受け入れる
例)SET @abc = 123
val には値(123)が
入ってる
val には値(123)が
入ってる
グローバル変数のハッシュに
登録しておく
例)m_var[abc] = 123
グローバル変数のハッシュに
登録しておく
例)m_var[abc] = 123
Replace_variablesコンテンツハンドラ
Binary_log_event *process_event(Query_event *event) {
std::string query = event->query;
size_t start, end = 0;
while (true) {
start = query.find_first_of("@", end);
if (start == std::string::npos)
break;
end = query.find_first_not_of("abcdefghijklmnopqrstuvwxyz", start+1);
std::string key = query.substr(start + 1, end - start - 1);
query.replace(start, end - start, "'" + m_var[key] + "'");
}
event->query= query.c_str();
return event;
}
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
41
クエリから@を探すクエリから@を探す
@に続く英字の位置を検索@に続く英字の位置を検索
@~ を置換@~ を置換
クエリに対する
イベントのみ処理する
クエリに対する
イベントのみ処理する
Save_variablesで
保存しておいたもの
Save_variablesで
保存しておいたもの
付属のサンプルは3つ
• basic-1
• basic-2
• binlog-browser
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
42
binlog-browser
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
43
$ ./binlog-browser mysql://root:Password123_@localhost:3306
Start Position End Position Event Length Event Type
219 344 125 Query[2]
Event Info: use `hoge`; create table mytable (pk serial, v1 varchar(255))
344 409 65 Anonymous_Gtid[34]
Event Info:
409 482 73 Query[2]
Event Info: BEGIN
482 536 54 Table_map[19]
Event Info: table id: 109 (hogex.mytable)
536 584 48 Write_rows[30]
Event Info: table id: 109 flags: Last event of the statement
584 615 31 Xid[16]
Event Info: Xid ID=26
binlog-browser のソース
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
44
Binary_log_driver *drv= create_transport(uri.c_str());
Binary_log binlog(drv);
int error_number= binlog.connect();
if (const char* msg= str_error(error_number))
cerr << msg << endl;
<snip>
if (binlog.set_position(opt_start_pos) != ERR_OK)
{
cerr << "The specified position "
<< opt_start_pos
<< " cannot be set"
<< endl;
return 1;
}
引数で指定したポジション
にジャンプ
引数で指定したポジション
にジャンプ
バイナリログから更新内容
を取り出すには?
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
45
サンプルコードにはない
• tests/replaybinlog.cpp が参考になります
• ・・・これも動かなかった orz
• Binlog API のテストコードっぽい
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
46
値を取り出すサンプル
https://gist.github.com/anonymous/
4f9e59a6e22593fdcaf0
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
47
カラムの値をとるコード
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
48
Binary_log_event *process_event(binary_log::Rows_event *event) {
Int2event_map::iterator ti_it= m_table_index.find(event->get_table_id());
binary_log::Row_event_set rows(event, ti_it->second);
binary_log::Row_of_fields fields= *row_it;
if (event->get_event_type() == binary_log::WRITE_ROWS_EVENT ||
event->get_event_type() == binary_log::WRITE_ROWS_EVENT_V1) {
std::cout << event_start_pos << "¥tINSERT¥t" <<
ti_it->second->m_dbnam << "." << ti_it->second->m_tblnam << "¥t";
binary_log::Row_of_fields::iterator field_it= fields.begin();
binary_log::Converter converter;
if (field_it != fields.end()) {
do {
std::string str;
converter.to(str, *field_it);
std::cout << str << "¥t";
} while (++field_it != fields.end());
ROWモードの
イベントを受け取る
ROWモードの
イベントを受け取る
INSERTの場合INSERTの場合
バイナリをデコードバイナリをデコード
直前のTable_Map
イベントからテーブル情報を
取得
直前のTable_Map
イベントからテーブル情報を
取得
実行例
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
49
$ ./decode mysql://root:Password123_@localhost:3306
1401 INSERT t.mytable 1 123
1664 UPDATE t.mytable 1 123 1 456
1941 DELETE t.mytable 1 456
mysql> INSERT INTO mytable VALUES(1, "123");
mysql> UPDATE mytable SET c1 = "456";
mysql> DELETE mytable WHERE pk = 1;
バイナリログ関連の
設定について
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
50
サーバのbinlog_formatはROWで
• binlog_format=ROW
• タイプ Rows_event で記録
• 変更内容がバイナリで記録されている
• バイナリから実際の値にデコードする関数がある
• binlog eventsを使うにはこちらが前提
• binlog_format=STATEMENT
• タイプ Query_event で記録
• SQLがそのままバイナリログに記載される
• SQLから変更内容を特定するのは困難、Binlog
Events を使う場合は使わない想定
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
51
binlog_image にも注意
• binlog_image=full
• デフォルト
• 変更された行のPKと、その行の内容を記録
• binlog_image=minimal
• 更新を再現するのに最小限の情報のみを記録
• バイナリログのサイズが小さくて済む
• 例)DELETEだとPKのみ
• Binlog Events でPKしか拾えなくなるので注意
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
52
ありそうで、なかった機能
x2
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
53
ありそうで、なかった機能 その1
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
54
分散、ルーティングの仕組み分散、ルーティングの仕組み
Binlog
Events
Binlog
Events
バイナリログバイナリログ
ユーザID: 1-1000を担当
するサーバ
Binlog
Events
Binlog
Events
ユーザID: 1000-2000を担当
するサーバ
関係ないログは
読み飛ばす実装
が必要
関係ないログは
読み飛ばす実装
が必要
ありそうで、なかった機能 その2
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
55
「どこまで処理したか」を記録しておく仕組み「どこまで処理したか」を記録しておく仕組み
• 「BEGIN」イベントが来たら、それまでのバイ
ナリログ、ログポジションをファイルに書く
• 再開時、ファイルを読んで、そこまで読み飛ばす
まとめ
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
56
まとめ
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
57
C++つらいC++つらい
なんとかストリーム処理できそうですなんとかストリーム処理できそうです
LLラッパーを一緒に書いてくれる人募集LLラッパーを一緒に書いてくれる人募集
Enjoy MySQL
Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
58

More Related Content

PPTX
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
PDF
はじめてのGit forデザイナー&コーダー
PDF
ダブル配列の実装方法
PDF
15分でわかるGit入門
PPTX
[2018 .NET Conf].NET Core與Azure DevOps應用於企業開發
PPTX
比較サイトの検索改善(SPA から SSR に変換)
PDF
글쓰는 개발자 모임, 글또
PDF
C/C++とWebAssemblyを利用したライブラリ開発
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
はじめてのGit forデザイナー&コーダー
ダブル配列の実装方法
15分でわかるGit入門
[2018 .NET Conf].NET Core與Azure DevOps應用於企業開發
比較サイトの検索改善(SPA から SSR に変換)
글쓰는 개발자 모임, 글또
C/C++とWebAssemblyを利用したライブラリ開発

What's hot (20)

PDF
Re永続データ構造が分からない人のためのスライド
PDF
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
PDF
プログラミングコンテストでの動的計画法
PPTX
Python製BDDツールで自動化してみた
PDF
realpathキャッシュと OPcacheの面倒すぎる関係
PDF
[DL輪読会]YOLO9000: Better, Faster, Stronger
PDF
僕がつくった 70個のうちの48個のWebサービス達
PDF
PostgreSQLによるデータ分析ことはじめ
PDF
第7回WBAシンポジウム:予測符号化モデルとしての 深層予測学習とロボット知能化
PDF
맵매칭 (부정확한 GPS포인트들로부터 경로 추정하기)
PPTX
冬のLock free祭り safe
PDF
PHP7の内部実装から学ぶ性能改善テクニック
PDF
ICML2021の連合学習の論文
PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
PPTX
BuildKitによる高速でセキュアなイメージビルド
PPTX
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
PDF
高速な倍精度指数関数expの実装
PDF
MyBatisとMyBatis Generatorの話
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
PostgreSQLバックアップの基本
Re永続データ構造が分からない人のためのスライド
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
プログラミングコンテストでの動的計画法
Python製BDDツールで自動化してみた
realpathキャッシュと OPcacheの面倒すぎる関係
[DL輪読会]YOLO9000: Better, Faster, Stronger
僕がつくった 70個のうちの48個のWebサービス達
PostgreSQLによるデータ分析ことはじめ
第7回WBAシンポジウム:予測符号化モデルとしての 深層予測学習とロボット知能化
맵매칭 (부정확한 GPS포인트들로부터 경로 추정하기)
冬のLock free祭り safe
PHP7の内部実装から学ぶ性能改善テクニック
ICML2021の連合学習の論文
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
BuildKitによる高速でセキュアなイメージビルド
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
高速な倍精度指数関数expの実装
MyBatisとMyBatis Generatorの話
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLバックアップの基本
Ad

Viewers also liked (9)

PDF
VCSクエスト
PDF
Why MySQL High Availability Matters
PDF
Multi thread slave_performance_on_opc
PPTX
CloudSQL v2は デキる子なのか?
PDF
MySQL High Availability -- InnoDB Clusters
PPTX
Random Forest による分類
PDF
Embulk, an open-source plugin-based parallel bulk data loader
PDF
データ分析グループの組織編制とその課題 マーケティングにおけるKPI設計の失敗例 ABテストの活用と、機械学習の導入 #CWT2016
PDF
The ninja elephant, scaling the analytics database in Transwerwise
VCSクエスト
Why MySQL High Availability Matters
Multi thread slave_performance_on_opc
CloudSQL v2は デキる子なのか?
MySQL High Availability -- InnoDB Clusters
Random Forest による分類
Embulk, an open-source plugin-based parallel bulk data loader
データ分析グループの組織編制とその課題 マーケティングにおけるKPI設計の失敗例 ABテストの活用と、機械学習の導入 #CWT2016
The ninja elephant, scaling the analytics database in Transwerwise
Ad

Similar to MySQL Binlog Events でストリーム処理してみた #MySQLUC15 (20)

PDF
Introducing MySQL MHA (JP/LT)
PDF
MHA for MySQLとDeNAのオープンソースの話
PDF
20120824 PHP+MySQL勉強会LT
PPTX
MySQL clients
PDF
Enter the-dolphine
PPTX
トランザクションの設計と進化
PDF
Art of MySQL Replication.
PDF
MySQLトラブル解析入門
PDF
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
PDF
My sql event_scheduler_casual_slideshare__
PDF
MySQL 5.6新機能解説@dbtechshowcase2012
PDF
MySQLレプリケーションあれやこれや
PDF
さいきんのMySQLに関する取り組み(仮)
ODP
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
PDF
MySQLの冗長化 2013-01-24
PPT
Online schema change in mysql casual #1(2010/12/11)
PPT
Online schema change in mysql casual #1(2010/12/11)
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
PDF
MySQLとオープンソースビジネスの10年、そして未来へ
PDF
PerlとSQLのいろいろ
Introducing MySQL MHA (JP/LT)
MHA for MySQLとDeNAのオープンソースの話
20120824 PHP+MySQL勉強会LT
MySQL clients
Enter the-dolphine
トランザクションの設計と進化
Art of MySQL Replication.
MySQLトラブル解析入門
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
My sql event_scheduler_casual_slideshare__
MySQL 5.6新機能解説@dbtechshowcase2012
MySQLレプリケーションあれやこれや
さいきんのMySQLに関する取り組み(仮)
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQLの冗長化 2013-01-24
Online schema change in mysql casual #1(2010/12/11)
Online schema change in mysql casual #1(2010/12/11)
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
MySQLとオープンソースビジネスの10年、そして未来へ
PerlとSQLのいろいろ

More from Yahoo!デベロッパーネットワーク (20)

PDF
ゼロから始める転移学習
PDF
継続的なモデルモニタリングを実現するKubernetes Operator
PDF
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
PDF
オンプレML基盤on Kubernetes パネルディスカッション
PDF
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
PDF
Persistent-memory-native Database High-availability Feature
PDF
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
PDF
eコマースと実店舗の相互利益を目指したデザイン #yjtc
PDF
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PDF
ビッグデータから人々のムードを捉える #yjtc
PDF
サイエンス領域におけるMLOpsの取り組み #yjtc
PDF
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
PDF
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
PDF
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PDF
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PDF
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
PDF
「新しいおうち探し」のためのAIアシスト検索 #yjtc
PDF
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ゼロから始める転移学習
継続的なモデルモニタリングを実現するKubernetes Operator
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Persistent-memory-native Database High-availability Feature
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
eコマースと実店舗の相互利益を目指したデザイン #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
ビッグデータから人々のムードを捉える #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc

MySQL Binlog Events でストリーム処理してみた #MySQLUC15

  • 2. 自己紹介 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 2 • 三谷 智史(@mita2) • 所属 ヤフー(株) DBMS技術 • RDB専門部隊 13名 • DB Administration 黒帯
  • 3. 本日の流れ 1. Yahoo JAPAN! のMySQL 利用状況 2. ストリーム処理の利点 3. Binlog Events を検証してみた 1. サンプルコード解説 2. 更新内容を取り出す方法 3. ありそうで、なかった機能 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 3
  • 4. 本日の流れ 1. Yahoo JAPAN! のMySQL 利用状況 2. ストリーム処理の利点 3. Binlog Events を検証してみた 1. サンプルコード解説 2. 更新内容を取り出す方法 3. ありそうで、なかった機能 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 4
  • 6. 構成 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 6
  • 7. サーバ台数 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 7 • 約220台 • オンプレです • 容量18TB • ※ マスターのみカウント マスター サーバ スレーブ サーバ バックアップ用 スレーブ サーバ構成比率
  • 8. 共有ストレージのHAです Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 8 • 複数MySQLを集約 • 商用ストレージ • 詳細: 「レプリケーションを使わない」 でWEB検索
  • 9. 共有ストレージのHAです Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 9 • 複数MySQLを集約 • 商用ストレージ • 詳細: 「レプリケーションを使わない」 でWEB検索 Oracle Clusterware 使ってます Oracle Clusterware 使ってます
  • 10. 世間で実績の少なそうな?機能の実績 • 5.6 + GTID • 100DB以上で動かしてますが問題ないです • パーティション • 20DB以上で採用 • DROP PARITTIONによる高速データ削除 • ALTERに問題あり、使うなら5.6から… (Bug 77318) • InnoDBテーブル 圧縮 • 20DB以上で採用。READ IO減ってかなりGOOD。 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 10
  • 11. We love MySQL Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 11 0 100 200 300 400 500 600 We Love
  • 12. 本日の流れ 1. Yahoo JAPAN! のMySQL 利用状況 2. ストリーム処理の利点 3. Binlog Events を検証してみた 1. サンプルコード解説 2. 更新内容を取り出す方法 3. ありそうで、なかった機能 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 12
  • 13. Yahoo! におけるストリーム処理 13 • 設立初期からストリーム処理を活用 • fluentd的なミドルウェア 決済システム 購入処理購入処理 Log Reader Log Reader Log Consumer Log Consumer Log Consumer Log Consumer トランザク ションログ トランザク ションログ ECサービス システム ストレージサービス システム キャンペーン フラグON 容量増量 フラグON プレミアム 会員購入 非同期転送 処理イメージ、実際とは異なります
  • 14. ストリーム処理の3つの利点 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 14
  • 15. 1.スケールアウト Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 15 スケールアウトしやすいスケールアウトしやすい 決済システム 購入処理購入処理 Log Reader1 Log Reader1 Log Consumer2 Log Consumer2 Log Consumer1 Log Consumer1 トランザク ションログ トランザク ションログ ECサービス システム キャンペーン フラグON Log Reader2 Log Reader2 ユーザIDで 分散 ユーザIDで 分散
  • 16. 2.連携先の影響を受けにくい Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 16 連携先の影響を受けにくい連携先の影響を受けにくい 決済システム 購入処理購入処理 Log Reader Log Reader Log Consumer Log Consumer Log Consumer Log Consumer トランザク ションログ トランザク ションログ ECサービス システム ストレージサービス システム キャンペーン フラグON 容量増量 フラグON 非同期転送 DOWNDOWN
  • 17. 3.リアルタイム Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 17 リアルタイムリアルタイム
  • 18. ☆ チン マチクタビレタ~ マチクタビレタ~ ☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・) < MySQLでストリーム処理まだ~ \_/⊂ ⊂_ ) \_____________ / ̄ ̄ ̄ ̄ ̄ ̄ /| | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 愛媛みかん |/ Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 18 (社内の声)
  • 19. 本日の流れ 1. Yahoo JAPAN! のMySQL 利用事例 2. ストリーム処理の利点 3. Binlog Events を検証してみた 1. サンプルコード解説 2. 更新内容を取り出す方法 3. ありそうで、なかった機能 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 19
  • 20. MySQL Binlog Events • バイナリログを用いたストリーム処理ができる • MySQL Labs で公開中(2015/12現在) • 昔はBinlog APIっていうやつがあったらしい • C++ libraries Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 20
  • 21. 利用イメージ Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 21 決済システム 購入処理購入処理 BinlogEvents を使ったプログラム BinlogEvents を使ったプログラム バイナリログバイナリログ ECサービス システム ストレージサービス システム キャンペーン フラグON 容量増量 フラグON 非同期転送 処理イメージ • さっきの例だとこう BinlogEvents を使ったプログラム BinlogEvents を使ったプログラム
  • 22. まずはサンプルコード Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 22
  • 23. Binlog Eventsのビルド • Labs から mysql-binlog-events-1.0.1-src.tar.gz をDL • サンプルが同梱されてます • mysql-devel パッケージだけではビルド不可 • MySQL5.7 のソースもダウンロードしましょう Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 23 $ cmake -DMYSQLCLIENT_STATIC_LINKING:BOOL=TRUE ¥ -DMYSQL_DIR=/usr/bin ¥ -DMYSQL_SOURCE_INCLUDE_DIR=<ソース置いた場所>/include ¥ -DENABLE_DOWNLOADS=1 . $ make $ cd example $ make
  • 24. 接続先はどのバージョンでも大丈夫 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 24 MySQL 5.5 MySQL 5.6 MySQL 5.7
  • 25. CHANGE LOG Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 25 ############################ ChangeLog for Binary Log API ############################ Release 0.1.0 (released April 20, 2013) --------------------------------------- * BAPI-1: In the binlog-replication-listener library, mysql::Binary_log::connect function does not abort when non-existent file name or server is provided
  • 26. 付属のサンプルは3つ • basic-1 • basic-2 • binlog-browser Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 26
  • 27. 付属のサンプルは3つ • basic-1 • basic-2 • binlog-browser Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 27
  • 28. basic-1 • URI の書き方 mysql://user:password@localhost:3306 file:///var/lib/mysql/mysql-bin.000002 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 28 $ ./basic-1 mysql://root:Password123_@localhost:3306
  • 29. basic-1 のソース - 接続方法 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 29 Binary_log_driver *drv= create_transport(argv[1]); if (drv == NULL) return 1; Binary_log binlog(drv); if (binlog.connect() != ERR_OK) { delete drv; return 1; } URIを渡して接続URIを渡して接続
  • 30. basic-1 を動かしてみる Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 30 $ ./basic-1 mysql://root:Password123_@localhost:3306 Found event of type 2 Found event of type 19 Found event of type 30 mysql> CREATE TABLE `mytable` ~ mysql> INSERT INTO mytable (v1) VALUES('abc');
  • 31. イベントとは Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 31 QueryQuery BEGINBEGIN Table_MapTable_Map 処理する対象テーブルの指定処理する対象テーブルの指定 Write_rowsWrite_rows INSERT INTO ~INSERT INTO ~ Update_rowsUpdate_rows UPDATE ~UPDATE ~ • 1つのトランザクションは複数イベントで構成 • 「Table_Map」や「Rotate」など特殊なイベン トもある イベントタイプ イベント内容(イメージ) トランザクション POS POS POS POS
  • 32. EVENT_TYPE 一覧 Unknown Start_v3 Query Stop Rotate Intvar Load Slave Create_file Append_block Exec_load Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 32 Delete_file New_load RAND User var Format_desc Xid Begin_load_query Execute_load_query Table_map Write_rows_event_old Update_rows_event_old Delete_rows_event_old Write_rows_v1 Update_rows_v1 Delete_rows_v1 Incident Heartbeat Ignorable Rows_query Write_rows Update_rows Delete_rows Gtid Anonymous_Gtid Previous_gtids User Defined
  • 33. 付属のサンプルは3つ • basic-1 • basic-2 • binlog-browser Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 33
  • 34. basic-2 を動かしてみる • SQLが表示される・・・? • basic-2 はバグってます • 本当は 変数 を値に置換してSQLを表示する プログラムです Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 34 $ ./basic-2 mysql://root:Password123_@localhost:3306 create table mytable (pk serial, v1 varchar(255)) BEGIN insert into mytable (v1) values(@myvar) 置換されてない置換されてない
  • 35. なおしました パッチ https://gist.github.com/anonymous/02593d4981ac826f9837 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 35
  • 36. basic-2 を動かしてみる(修正ver) • binlog_format=STATEMENTで動かしましょう Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 36 $ ./basic-2 mysql://root:Password123_@localhost:3306 create database hogex create table mytable (pk serial, v1 varchar(255)) insert into mytable (v1) values(123) @myvarが置換される@myvarが置換される mysql> CREATE TABLE mytable (pk SERIAL, v1 VARCHAR(5)); mysql> SET @myvar=“123”; mysql> INSERT INTO mytable (v1) VALUES(@myvar);
  • 37. basic-2 のソース Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 37
  • 38. basic-2 のソース - main Map variables; Save_variables<Map> save_variables(variables); Content_stream_handler handler; handler.add_listener(save_variables); Replace_variables<Map> replace_variables(variables); handler.add_listener(replace_variables); <snip> while (true) { int error_number; error_number= drv->get_next_event(&buf_and_len); <snip> handler.handle_event(&event); Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 38 ハンドラーを生成ハンドラーを生成 ハンドラーを登録ハンドラーを登録 バイナリログから イベントを読み取る バイナリログから イベントを読み取る 登録したハンドラーに イベントを渡してを処理 登録したハンドラーに イベントを渡してを処理 ループループ
  • 39. Binlog Events の設計思想 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 39 Get_next_eventGet_next_event ループループ ループ コンテンツハンドラ (クラス) コンテンツハンドラ (クラス) - process_event(Delete_rows) - process_event(Write_rows) - process_event(Delete_rows) - process_event(Write_rows) コンテンツハンドラコンテンツハンドラ コンテンツハンドラコンテンツハンドラ • 1イベントごとにハンドラで定義し たprocess_eventが呼び出される • イベントタイプごとに処理したい内 容をコーディングする • コンテンツハンドラは複数設定可能 INSERTされたとき に実施したい処理を 書く INSERTされたとき に実施したい処理を 書く
  • 40. Save_variablesコンテンツハンドラ template <class AssociativeContainer> class Save_variables : public Content_handler { Binary_log_event *process_event(User_var_event *event) { std::string a(event->val, 0, event->val_len); m_var[event->name] = a; return event; } Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 40 変数のSETイベント を受け入れる 例)SET @abc = 123 変数のSETイベント を受け入れる 例)SET @abc = 123 val には値(123)が 入ってる val には値(123)が 入ってる グローバル変数のハッシュに 登録しておく 例)m_var[abc] = 123 グローバル変数のハッシュに 登録しておく 例)m_var[abc] = 123
  • 41. Replace_variablesコンテンツハンドラ Binary_log_event *process_event(Query_event *event) { std::string query = event->query; size_t start, end = 0; while (true) { start = query.find_first_of("@", end); if (start == std::string::npos) break; end = query.find_first_not_of("abcdefghijklmnopqrstuvwxyz", start+1); std::string key = query.substr(start + 1, end - start - 1); query.replace(start, end - start, "'" + m_var[key] + "'"); } event->query= query.c_str(); return event; } Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 41 クエリから@を探すクエリから@を探す @に続く英字の位置を検索@に続く英字の位置を検索 @~ を置換@~ を置換 クエリに対する イベントのみ処理する クエリに対する イベントのみ処理する Save_variablesで 保存しておいたもの Save_variablesで 保存しておいたもの
  • 42. 付属のサンプルは3つ • basic-1 • basic-2 • binlog-browser Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 42
  • 43. binlog-browser Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 43 $ ./binlog-browser mysql://root:Password123_@localhost:3306 Start Position End Position Event Length Event Type 219 344 125 Query[2] Event Info: use `hoge`; create table mytable (pk serial, v1 varchar(255)) 344 409 65 Anonymous_Gtid[34] Event Info: 409 482 73 Query[2] Event Info: BEGIN 482 536 54 Table_map[19] Event Info: table id: 109 (hogex.mytable) 536 584 48 Write_rows[30] Event Info: table id: 109 flags: Last event of the statement 584 615 31 Xid[16] Event Info: Xid ID=26
  • 44. binlog-browser のソース Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 44 Binary_log_driver *drv= create_transport(uri.c_str()); Binary_log binlog(drv); int error_number= binlog.connect(); if (const char* msg= str_error(error_number)) cerr << msg << endl; <snip> if (binlog.set_position(opt_start_pos) != ERR_OK) { cerr << "The specified position " << opt_start_pos << " cannot be set" << endl; return 1; } 引数で指定したポジション にジャンプ 引数で指定したポジション にジャンプ
  • 45. バイナリログから更新内容 を取り出すには? Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 45
  • 46. サンプルコードにはない • tests/replaybinlog.cpp が参考になります • ・・・これも動かなかった orz • Binlog API のテストコードっぽい Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 46
  • 48. カラムの値をとるコード Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 48 Binary_log_event *process_event(binary_log::Rows_event *event) { Int2event_map::iterator ti_it= m_table_index.find(event->get_table_id()); binary_log::Row_event_set rows(event, ti_it->second); binary_log::Row_of_fields fields= *row_it; if (event->get_event_type() == binary_log::WRITE_ROWS_EVENT || event->get_event_type() == binary_log::WRITE_ROWS_EVENT_V1) { std::cout << event_start_pos << "¥tINSERT¥t" << ti_it->second->m_dbnam << "." << ti_it->second->m_tblnam << "¥t"; binary_log::Row_of_fields::iterator field_it= fields.begin(); binary_log::Converter converter; if (field_it != fields.end()) { do { std::string str; converter.to(str, *field_it); std::cout << str << "¥t"; } while (++field_it != fields.end()); ROWモードの イベントを受け取る ROWモードの イベントを受け取る INSERTの場合INSERTの場合 バイナリをデコードバイナリをデコード 直前のTable_Map イベントからテーブル情報を 取得 直前のTable_Map イベントからテーブル情報を 取得
  • 49. 実行例 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 49 $ ./decode mysql://root:Password123_@localhost:3306 1401 INSERT t.mytable 1 123 1664 UPDATE t.mytable 1 123 1 456 1941 DELETE t.mytable 1 456 mysql> INSERT INTO mytable VALUES(1, "123"); mysql> UPDATE mytable SET c1 = "456"; mysql> DELETE mytable WHERE pk = 1;
  • 50. バイナリログ関連の 設定について Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 50
  • 51. サーバのbinlog_formatはROWで • binlog_format=ROW • タイプ Rows_event で記録 • 変更内容がバイナリで記録されている • バイナリから実際の値にデコードする関数がある • binlog eventsを使うにはこちらが前提 • binlog_format=STATEMENT • タイプ Query_event で記録 • SQLがそのままバイナリログに記載される • SQLから変更内容を特定するのは困難、Binlog Events を使う場合は使わない想定 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 51
  • 52. binlog_image にも注意 • binlog_image=full • デフォルト • 変更された行のPKと、その行の内容を記録 • binlog_image=minimal • 更新を再現するのに最小限の情報のみを記録 • バイナリログのサイズが小さくて済む • 例)DELETEだとPKのみ • Binlog Events でPKしか拾えなくなるので注意 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 52
  • 53. ありそうで、なかった機能 x2 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 53
  • 54. ありそうで、なかった機能 その1 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 54 分散、ルーティングの仕組み分散、ルーティングの仕組み Binlog Events Binlog Events バイナリログバイナリログ ユーザID: 1-1000を担当 するサーバ Binlog Events Binlog Events ユーザID: 1000-2000を担当 するサーバ 関係ないログは 読み飛ばす実装 が必要 関係ないログは 読み飛ばす実装 が必要
  • 55. ありそうで、なかった機能 その2 Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 55 「どこまで処理したか」を記録しておく仕組み「どこまで処理したか」を記録しておく仕組み • 「BEGIN」イベントが来たら、それまでのバイ ナリログ、ログポジションをファイルに書く • 再開時、ファイルを読んで、そこまで読み飛ばす
  • 56. まとめ Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 56
  • 57. まとめ Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 57 C++つらいC++つらい なんとかストリーム処理できそうですなんとかストリーム処理できそうです LLラッパーを一緒に書いてくれる人募集LLラッパーを一緒に書いてくれる人募集
  • 58. Enjoy MySQL Copyright (C) 2015 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止 58