Successfully reported this slideshow.

MySQL負荷分散の方法

24,018 views

Published on

Published in: Career
  • Be the first to comment

MySQL負荷分散の方法

  1. 1. MySQL処理分散環境の構築  2012.8.24  株式会社シーエー・アドバンス  佐久本 正太
  2. 2. 自己紹介 佐久本 正太 29歳 株式会社シーエー・アドバンス 技術推進GマネージャーMySQLClusterやDRBD、PaceMakerのHA化ソリューションで遊んでます。
  3. 3. 自己紹介SNSアカウント アメブロ:さくちゃん Facebook:本名で検索! Twitter:@vSakumoto趣味:囲碁 (四段持ってます!)
  4. 4. MySQLとは!
  5. 5. みなさん知って ますよね? ってことで
  6. 6. 早速MySQLレプリケーション 説明!
  7. 7. そもそもレプリケーションって?データベースのレプリケーションは多くのデータベース管理システムが採用している概念で、データベースのオリジナルとコピーのマスタースレーブ関係を意味する。マスター側は更新を記録し、それがスレーブ群に通知される。スレーブ側は更新を正しく受け取ったというメッセージを送り、次の更新を受け付けられる状態であることを通知する。 Wikipedia引用 分かります?
  8. 8. そもそもレプリケーションって? 一応、図で表すとこんなかんじ マスタ サーバ INSERT・・・ UPDATE・・・ DELETE・・・ スレーブ スレーブ スレーブ サーバ サーバ サーバ
  9. 9. そもそもレプリケーションって?非同期レプリケーションの注意点!非同期レプリケーションはマスタサーバーに書き込まれたデータが必ずしも、スレーブにデータが有ることは約束されていません!注意!過去の体験談・・・
  10. 10. MySQL ReplicationとはWEBアプリケーションでセッションDBをスレーブから読み取ると・・・⇒画面遷移が著しく多いアプリケーションに置いては、少々の遅延でもセッションが正常に読み取れず、ログアウトされる事象が多発更新後のデータを即座に見るアプリケーション部分はマスターサーバから読み取りましょう
  11. 11. MySQL もう1つのレプリケーション 説明!
  12. 12. SemiSyncReplicationとはMySQL5.5から組み込み!SemiSyncReplicationとは準同期レプリケーションと言われ通常のレプリケーションと異なります。通常レプリケーション(非同期レプリケーション)SemiSyncReplication(準同期レプリケーション)の違いは次のとおりです。
  13. 13. SemiSyncReplicationとは■通常レプリケーション①アプリケーションからマスタサーバへクエリ送信②マスタサーバでクエリを受信し、バイナリログに書き込み③マスタサーバがアプリケーションにコミットしたことを伝達④バイナリログに書き込まれたクエリをスレーブサーバーに転送 ① ④ マスタ スレーブ WEB-AP サーバ サーバ ② ③ Table Relay Table BinLog Space Log Space
  14. 14. SemiSyncReplicationとは■準同期レプリケーション(SemiSyncReplication)①アプリケーションからマスタサーバへクエリ送信②マスタサーバでクエリを受信し、バイナリログに書き込み③マスタからクエリをスレーブに転送 ④リレーログに書き込み⑤スレーブのリレーログ書き込み確認後 ⑥アプリケーションにコミットされたことを伝達 ① ③ マスタ スレーブ WEB-AP サーバ サーバ ② ⑥ ⑤ Table Relay Table BinLog Space Log Space
  15. 15. SemiSyncReplicationとは あれ?違いは? と思った方?挙手! (@`▽´@)/ ハイッ
  16. 16. SemiSyncReplicationとは大きな違いとして・・・コミット応答がスレーブのリレーログに書き込まれた後になる!※ただしテーブルスペースまでの書き込みは保証していません※
  17. 17. SemiSyncReplicationとは何が出来る?HA構成が出来る!マスタ故障時でもスレーブへデータが転送されていることが保証されているので、PaceMaker等での自動フェイルオーバーが可能! サーバーが落ちたらどうしよう ((;゚Д ゚). ガクブル から・・・ (*μ _μ )oO(幸) 眠れる幸せ
  18. 18. SemiSyncReplicationとは通常レプリケーション、準同期レプリケーション使い分け!ベンチマーク取ってはいませんが・・・メリット・サーバー故障時にもデータが転送されていることが保証・コミット動作が、リレーログ書き込みまでを保証しているので通常レプリケーションより遅延が少ないデメリット・通常レプリケーションと比べ、コミット動作が違うため書き込み速度が劣る
  19. 19. 次が本題!
  20. 20. MySQL負荷分散方法!
  21. 21. 複数台のスレー ブ接続をどう やって分散?
  22. 22. 負荷分散方法その①アプリケーション側でスレーブ接続先を選択 マスタ サーバ スレーブ サーバ① WEB-AP プログラムで スレーブ スレーブサーバを 参照系クエリ サーバ② 選択する スレーブ サーバ③
  23. 23. 負荷分散方法その①デメリット!・スレーブへのコネクション数を見ていないため、本来の負荷分散となっていない・プログラム側でスレーブサーバへの接続確認(死活監視)をするため、接続のオーバーヘッドが伴う・遅延が起きていた場合は??・レプリケーションが停止していたら??
  24. 24. じゃあどうする?
  25. 25. 負荷分散方法その②ロードバランサーを使用!※KeepAlived マスタ サーバ スレーブ サーバ① WEB-AP LB スレーブ 参照系クエリ (keepalived) サーバ② スレーブ サーバ③
  26. 26. 負荷分散方法その②メリット!・接続先をロードバランサーに向けるだけで、自動的にバランシングしてくれる※サーバー追加してもコードの追加は不要※・KeepAlivedならポート監視(MySQLでは3306)ができるので、自動切り離しが可能
  27. 27. しかし・遅延が起きていた場合は??・レプリケーションが停止していたら??
  28. 28. 負荷分散方法その③試行錯誤の組み合わせMySQL+(Apache+PHP) Keepalived(MISC) マスタ サーバ スレーブ サーバ① Apache WEB-AP スレーブ keepalived 参照系クエリ MISC_CHECK サーバ② Apache スレーブ サーバ③ Apache
  29. 29. 負荷分散方法その③MySQL+(Apache+PHP)スレーブサーバーにWEBサーバーを立て次のソースコードを設置!※環境※php5.3系Apache2.1系cakephp 2.1系
  30. 30. 負荷分散方法その③<?phpclass CheckhtmlController extends AppController { public $name = User; public function index(){ $this->layout = ""; $DBTYPE = Configure::read("DBTYPE"); if ( $DBTYPE["MASTER_DB"] == 1 ){ $msg = 0; } elseif ( $DBTYPE["SLAVE_DB"] == 1 ){ try { $chkStatus = $this->User->slaveStatus(); $status = $chkStatus[0][0]; } catch (Exception $e){ $msg = 1; }
  31. 31. 負荷分散方法その③ //$DBTYPE["BEHIND"] 遅延許容値 if ( $status["Seconds_Behind_Master"] <= $DBTYPE["BEHIND"] && $status["Seconds_Behind_Master"] <> NULL && $status["Last_SQL_Errno"]== 0 ){ //print "遅延なし"; $msg = 0; } elseif ($status["Slave_IO_Running"] == "No" || $status["Slave_SQL_Running"] == "No" ) { //レプリケーションが止まっています。 $msg = 1; } else { //遅延しています。 $msg = 1; } } else { $msg = 1; } print $msg; }}
  32. 32. 負荷分散方法その③MySQL+(Apache+PHP)ソースコード解説:ローカルホストのMySQLの状態によりWEBで表示を変化 ⇒MySQLの「show slave status」コマンドから判断!※0が正常、1が異常の出力値以下の場合に異常値を出力・遅延が設定している閾値を超えた場合・レプリケーションがストップしている場合・MySQLが起動していない場合
  33. 33. 負荷分散方法その③Keepalived(MISC)KeepAlivedに次のMISC_CHECKのスクリプトを設置Keepalived.confも変更する※環境※Keepalived1.1.15
  34. 34. 負荷分散方法その③$ vim misc.sh#!/bin/shURL="http://$1/checkhtml"ret=`wget -o /dev/null -O - "$URL"`if [ $ret == 0 ]then echo $ret exit $retelse echo $ret exit 1fi$ ./misc.sh 192.168.1.21 #引数はスレーブサーバのIPアドレス$ 0 #正常値は0が返る$ ./misc.sh 192.168.1.22$ 1 #異常値は1が返る
  35. 35. 負荷分散方法その③$ vim /etc/keepalived/keepalived.confvirtual_server_group MySQLSlave { 192.168.1.20 3306 #VIP(仮想IP)}virtual_server group MySQLSlave { delay_loop 3 lvs_sched wrr lvs_method DR protocol TCP virtualhost health #スレーブが2つ落ちた場合はマスタへ向ける sorry_server 192.168.1.10 3306 #マスタサーバのIPアドレス
  36. 36. 負荷分散方法その③#以下リアルサーバー real_server 192.168.1.21 3306 { weight 1 inhibit_on_failure MISC_CHECK { misc_path "/bin/sh /root/misc.sh 192.168.1.21" misc_timeout 10 } } real_server 192.168.1.22 3306 { weight 1 inhibit_on_failure MISC_CHECK { misc_path "/bin/sh /root/misc.sh 192.168.1.22" misc_timeout 10 } }}
  37. 37. 負荷分散方法その③MySQL+(Apache+PHP) Keepalived(Misc)KeepalivedでスレーブのWEBページをチェック ⇒問題なければMySQLのバランシングに追加※死活・遅延・レプリケーションストップ監視が一気にできちゃう!! keepalived Misc Check スレーブ スレーブ スレーブ サーバ③ サーバ② サーバ① Apache Apache Apache
  38. 38. ・遅延が起きていた場合はどうするの??・レプリケーションが停止していたらどうするの?? 解決!
  39. 39. まとめMySQL+(Apache+PHP) + KeepAlivedを使えば・・・・自動で接続数の少ないサーバに接続を張ることが出来る!・死活監視が出来る!・遅延を検知することができる!・レプリケーション停止を検知することが出来る!
  40. 40. ご清聴ありがとうございました。
  41. 41. 続きはWEBで http://ameblo.jp/exgineer/9月頭までには各種設定方法を記載いたします!

×