20110809 mysql casual talks vol2

13,363 views
13,267 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
13,363
On SlideShare
0
From Embeds
0
Number of Embeds
8,142
Actions
Shares
0
Downloads
19
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

20110809 mysql casual talks vol2

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

×