MySQL処理分散環境の構築



              2012.8.24
              株式会社シーエー・アドバンス
              佐久本 正太
自己紹介

 佐久本   正太 29歳

 株式会社シーエー・アドバンス
 技術推進Gマネージャー


MySQLClusterやDRBD、PaceMakerの
HA化ソリューションで遊んでます。
自己紹介
SNSアカウント

 アメブロ:さくちゃん
 Facebook:本名で検索!
 Twitter:@vSakumoto




趣味:囲碁 (四段持ってます!)
MySQLとは!
みなさん知って
 ますよね?
 ってことで
早速MySQL
レプリケーション
  説明!
そもそもレプリケーションって?
データベースのレプリケーションは多くのデータベース管理システムが採用している
概念で、データベースのオリジナルとコピーのマスタースレーブ関係を意味する。
マスター側は更新を記録し、それがスレーブ群に通知される。スレーブ側は更新を正
しく受け取ったというメッセージを送り、次の更新を受け付けられる状態であることを
通知する。

                                 Wikipedia引用




         分かります?
そもそもレプリケーションって?
 一応、図で表すとこんなかんじ
              マスタ
              サーバ



            INSERT・・・
            UPDATE・・・
            DELETE・・・




     スレーブ    スレーブ       スレーブ
     サーバ     サーバ        サーバ
そもそもレプリケーションって?
非同期レプリケーションの注意点!
非同期レプリケーションはマスタサーバーに書き込
まれたデータが必ずしも、スレーブにデータが有る
ことは約束されていません!

注意!過去の体験談・・・
MySQL Replicationとは
WEBアプリケーションでセッションDBをスレーブか
ら読み取ると・・・


⇒画面遷移が著しく多いアプリケーションに置いて
は、少々の遅延でもセッションが正常に読み取れ
ず、ログアウトされる事象が多発

更新後のデータを即座に見るアプリケーション部
分はマスターサーバから読み取りましょう
MySQL
  もう1つの
レプリケーション
   説明!
SemiSyncReplicationとは
MySQL5.5から組み込み!
SemiSyncReplicationとは準同期レプリケーショ
ンと言われ通常のレプリケーションと異なります。

通常レプリケーション(非同期レプリケーション)
SemiSyncReplication(準同期レプリケーション)
の違いは次のとおりです。
SemiSyncReplicationとは
■通常レプリケーション
①アプリケーションからマスタサーバへクエリ送信
②マスタサーバでクエリを受信し、バイナリログに書き込み
③マスタサーバがアプリケーションにコミットしたことを伝達
④バイナリログに書き込まれたクエリをスレーブサーバーに転送




          ①                         ④
                        マスタ                     スレーブ
 WEB-AP
                        サーバ                     サーバ
                        ②
          ③
                            Table       Relay          Table
               BinLog
                            Space        Log           Space
SemiSyncReplicationとは
■準同期レプリケーション(SemiSyncReplication)
①アプリケーションからマスタサーバへクエリ送信
②マスタサーバでクエリを受信し、バイナリログに書き込み
③マスタからクエリをスレーブに転送   ④リレーログに書き込み
⑤スレーブのリレーログ書き込み確認後 ⑥アプリケーションにコミットされたことを伝達




            ①                          ③
                           マスタ                     スレーブ
 WEB-AP
                           サーバ                     サーバ
                           ②
            ⑥                          ⑤
                               Table       Relay          Table
                  BinLog
                               Space        Log           Space
SemiSyncReplicationとは


     あれ?違いは?

   と思った方?挙手!

     (@`▽´@)/ ハイッ
SemiSyncReplicationとは
大きな違いとして・・・


コミット応答がスレーブのリレーログに
書き込まれた後になる!
※ただしテーブルスペースまでの書き込みは保証していません※
SemiSyncReplicationとは
何が出来る?
HA構成が出来る!
マスタ故障時でもスレーブへデータが転送されていることが保証されている
ので、PaceMaker等での自動フェイルオーバーが可能!


      サーバーが落ちたらどうしよう ((;゚Д ゚). ガクブル

                  から・・・


               (*μ _μ )oO(幸)
                 眠れる幸せ
SemiSyncReplicationとは
通常レプリケーション、準同期レプリケーション
使い分け!

ベンチマーク取ってはいませんが・・・
メリット
・サーバー故障時にもデータが転送されていることが保証
・コミット動作が、リレーログ書き込みまでを保証しているので通常レプリケー
ションより遅延が少ない

デメリット
・通常レプリケーションと比べ、コミット動作が違うため書き込み速度が劣る
次が本題!
MySQL
負荷分散方法!
複数台のスレー
 ブ接続をどう
 やって分散?
負荷分散方法その①
アプリケーション側でスレーブ接続先を選択


                          マスタ
                          サーバ




                                スレーブ
                                サーバ①
 WEB-AP
           プログラムで
                                スレーブ
          スレーブサーバを   参照系クエリ     サーバ②
            選択する
                                スレーブ
                                サーバ③
負荷分散方法その①
デメリット!

・スレーブへのコネクション数を見ていないため、本来の負
荷分散となっていない

・プログラム側でスレーブサーバへの接続確認(死活監
視)をするため、接続のオーバーヘッドが伴う

・遅延が起きていた場合は??
・レプリケーションが停止していたら??
じゃあ
どうする?
負荷分散方法その②
ロードバランサーを使用!
※KeepAlived

                                  マスタ
                                  サーバ




                                        スレーブ
                                        サーバ①
 WEB-AP

                       LB               スレーブ
          参照系クエリ   (keepalived)         サーバ②


                                        スレーブ
                                        サーバ③
負荷分散方法その②
メリット!

・接続先をロードバランサーに向けるだけで、自動的にバ
ランシングしてくれる
※サーバー追加してもコードの追加は不要※



・KeepAlivedならポート監視(MySQLでは3306)ができるの
で、自動切り離しが可能
しかし
・遅延が起きていた場合は??
・レプリケーションが停止していたら??
負荷分散方法その③
試行錯誤の組み合わせ
MySQL+(Apache+PHP) Keepalived(MISC)

                                  マスタ
                                  サーバ


                                        スレーブ
                                        サーバ①
                                        Apache
  WEB-AP
                                        スレーブ
                     keepalived
           参照系クエリ   MISC_CHECK
                                        サーバ②
                                        Apache


                                        スレーブ
                                        サーバ③
                                        Apache
負荷分散方法その③
MySQL+(Apache+PHP)

スレーブサーバーにWEBサーバーを立て次の
ソースコードを設置!

※環境※
php5.3系
Apache2.1系
cakephp 2.1系
負荷分散方法その③
<?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;
    }
負荷分散方法その③
            //$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;
    }
}
負荷分散方法その③
MySQL+(Apache+PHP)

ソースコード解説:

ローカルホストのMySQLの状態によりWEBで表示を変化
 ⇒MySQLの「show slave status」コマンドから判断!
※0が正常、1が異常の出力値
以下の場合に異常値を出力
・遅延が設定している閾値を超えた場合
・レプリケーションがストップしている場合
・MySQLが起動していない場合
負荷分散方法その③
Keepalived(MISC)

KeepAlivedに次のMISC_CHECKのスクリプトを設置
Keepalived.confも変更する


※環境※
Keepalived1.1.15
負荷分散方法その③
$ 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が返る
負荷分散方法その③
$ 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アドレス
負荷分散方法その③
#以下リアルサーバー
    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
         }
    }
}
負荷分散方法その③
MySQL+(Apache+PHP) Keepalived(Misc)

KeepalivedでスレーブのWEBページをチェック
 ⇒問題なければMySQLのバランシングに追加
※死活・遅延・レプリケーションストップ監視が一気にでき
ちゃう!!
                 keepalived
                 Misc Check




       スレーブ      スレーブ         スレーブ
       サーバ③      サーバ②         サーバ①
       Apache    Apache       Apache
・遅延が起きていた場合はどうするの??
・レプリケーションが停止していたらどうするの??




        解決!
まとめ

MySQL+(Apache+PHP) + KeepAlivedを使えば・・・

・自動で接続数の少ないサーバに接続を張ることが出来る!

・死活監視が出来る!

・遅延を検知することができる!

・レプリケーション停止を検知することが出来る!
ご清聴ありがとうございました。
続きはWEBで

    http://ameblo.jp/exgineer/

9月頭までには各種設定方法を記載いたします!

MySQL負荷分散の方法