Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20110809 mysql casual talks vol2

13,856 views

Published on

Published in: Technology
  • Be the first to comment

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 />

×