Successfully reported this slideshow.
Your SlideShare is downloading. ×

MySQL負荷分散の方法

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 41 Ad

More Related Content

Slideshows for you (20)

Similar to MySQL負荷分散の方法 (20)

Advertisement

Recently uploaded (20)

Advertisement

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. 負荷分散方法その③ <?php class 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/sh URL="http://$1/checkhtml" ret=`wget -o /dev/null -O - "$URL"` if [ $ret == 0 ] then echo $ret exit $ret else echo $ret exit 1 fi $ ./misc.sh 192.168.1.21 #引数はスレーブサーバのIPアドレス $ 0 #正常値は0が返る $ ./misc.sh 192.168.1.22 $ 1 #異常値は1が返る
  35. 35. 負荷分散方法その③ $ vim /etc/keepalived/keepalived.conf virtual_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月頭までには各種設定方法を記載いたします!

×