20110809 mysql casual talks vol2
DESCRIPTION
TRANSCRIPT
![Page 1: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/1.jpg)
マスタ n 対 スレーブ 1
レプリケーションの作り方
2011/08/09 do_aki
![Page 2: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/2.jpg)
自己紹介
• 識別: do_aki (どぅーあき)• 所属:(株)もしも• 生態:インフラ兼 Web アプリケーション
エンジニア
–サーバラッキング・ケーブリング–ネットワーク / ミドルウェア構築– WAF/ Library / Web アプリ / GUI アプ
リ( #isucon 参加します )
![Page 3: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/3.jpg)
レプリケーション
![Page 4: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/4.jpg)
一般的なレプリケーション
Master
Slave:1 Slave:2 Slave:n……
1:n
![Page 5: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/5.jpg)
n:1 レプリケーション
MasterA
SlaveAB
MasterB
A と B 両方の データが格納
![Page 6: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/6.jpg)
なぜ作ろうと思ったか
![Page 7: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/7.jpg)
MasterA
Slave:1A
Slave:2A
Slave:3B
MasterB
アプリケーション
水平分割シャー
ディン
グ
Slave:4B
![Page 8: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/8.jpg)
横断的な SQL が発行できない
![Page 9: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/9.jpg)
MasterA
Slave:1A
Slave:2A
Slave:3B
MasterB
アプリケーション
Slave:4B
JOIN の壁
1:n1:n
![Page 10: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/10.jpg)
n:1 レプリケーション
MasterA
SlaveAB
MasterB
JOIN 可能!
![Page 11: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/11.jpg)
CHANGE MASTER TO
![Page 12: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/12.jpg)
Master を切り替え
MasterA
SlaveAB
MasterB
![Page 13: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/13.jpg)
Master を切り替え
MasterA
SlaveAB
MasterB
![Page 14: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/14.jpg)
Master を切り替え
MasterA
SlaveAB
MasterB
![Page 15: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/15.jpg)
START SLAVE 少し待つ
STOP SLAVE スレーブ止める
現在の位置を記録( Master_Log_File および Read_Master_Log_Pos )
CHANGE MASTER( 次のマスタへスイッチ )
![Page 16: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/16.jpg)
Duplicate entry...
データ不整合 orz
![Page 17: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/17.jpg)
レプリケーション(スレーブ)
Slave
data
IO SQL
relay log
Master から
エキスパートのための MySQL 運用 + 管理トラブルシューティングガイド より
![Page 18: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/18.jpg)
レプリケーション(スレーブ)
Slave
data
IO SQL
relay log
Master から
エキスパートのための MySQL 運用 + 管理トラブルシューティングガイド より
CHANGE MASTER で消
される
![Page 19: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/19.jpg)
binlog の 位置(SHOW SLAVE STATUS)
• IO thread: Master_Log_File Read_Master_Log_Pos
• SQL thread : Relay_Master_Log_File Exec_Master_Log_Pos
![Page 20: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/20.jpg)
SQL thread の位置を利用すると
• 同じデータを再度取得–ネットワーク帯域–マスタへの負荷
• 切り替え時間が短いと進まない?
-> 却下
![Page 21: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/21.jpg)
IO thread の位置まで待つ• MASTER_POS_WAIT(log_name,log_pos[,timeout])
この関数は、マスター / スレーブの同期化のコントロールに役立ちます。スレーブがマスターログで指定された位置まで読み取り、すべてのアップデートを適用するまでブロックします。戻り値は、指定の位置まで進むまでスレーブが待たなければいけないログ イベントの数です。この関数は、スレーブ SQL スレッドが開始されていない、スレーブのマスター情報が初期化されていない、引数が正しくない、またはエラーが発生、という場合は NULL を戻します。タイムアウトの時間を越えると -1 が戻されます。MASTER_POS_WAIT() の待機中にスレーブ SQL スレッドが停止すると、関数は NULL を戻します。スレーブが指定の位置を過ぎたら、関数はただちに戻しを行います。(以下略)
http://dev.mysql.com/doc/refman/5.1/ja/miscellaneous-functions.html#function_master-pos-wait
![Page 22: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/22.jpg)
MASTER_POS_WAIT
指定したバイナリログの位置まで処理をブロック
![Page 23: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/23.jpg)
Seconds_Behind_Master
が 0 になるまで待つ
START SLAVE
STOP SLAVE IO_THREAD
MASTER_POS_WAIT()
STOP SLAVE
CHANGE MASTER
IO thread が読み取った位置まで実行
![Page 24: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/24.jpg)
Seconds_Behind_Master
が 0 になるまで待つ
START SLAVE
STOP SLAVE IO_THREAD
MASTER_POS_WAIT()
STOP SLAVE
CHANGE MASTER
原因不明の停止
![Page 25: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/25.jpg)
STOP SLAVE IO_THREAD 時
IO thread :トランザクション途中でも停止する
SQL thread :トランザクション毎に実行してる
![Page 26: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/26.jpg)
Seconds_Behind_Master
が 0 になるまで待つ
START SLAVE
STOP SLAVE IO_THREAD
MASTER_POS_WAIT()
Timeout?
START SLAVE IO_THREAD
STOP SLAVE
CHANGE MASTER
Yes
No
![Page 27: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/27.jpg)
稼働実績
• 3 秒ごとの切り替え
• 1ヶ月近く安定稼働
• 目に見えるマスタの負荷はなし
![Page 28: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/28.jpg)
まとめ
• n:1 レプリケーションは実現可能• 遅延は必ず発生してしまう– 集計に便利
• 実際にやってみると躓くことって結構ある
• ソースコードは github にあります( https://github.com/do-aki/SwitchMaster )
![Page 29: 20110809 mysql casual talks vol2](https://reader034.vdocuments.site/reader034/viewer/2022051514/54b7238b4a795903798b481c/html5/thumbnails/29.jpg)
おしまい
かなり端折ったので伝わりにくかったら
ごめんなさい