ECCUBEでMySQLRouterを使って負荷分散

Pocket

MySQLRouterで負荷分散

久しぶりの技術ネタ。ECCUBE-MYSQLの構成において、MySQLの接続を負荷分散する。

通常、負荷分散といえば、WEBサーバーに対して負荷分散を行い、WEBアクセスに対する負荷を軽減させるために用いることが多いが、今回はDBに対する処理を分散させることが目的。

負荷分散はMySQLRouter

負荷分散はMySQLRouterを使用。様々な負荷分散方法があるようだが、検証の結果MySQLRouterが一番シンプルで使いやすかった。フェイルオーバーも有効で拡張性も高い。ドキュメントが全て英語なのと、導入事例が少なかったのが少々難儀ではあるが、できないことはないはず。

構成イメージ

構成イメージとしては、WEBサーバー内にMySQLRouterを入れ、レプリケーションしているDBへの接続を負荷分散する。MySQLはDBレプリケーションで同期している状態。

分散ポリシーの決定

負荷分散を考える上でポリシー決めは重要である。負荷バランスを均等にするために、どういったルールに基づいて負荷分散させるのか。

今回の負荷分散は以下のように定義

  • トランザクション系処理→Master参照
  • トランザクション中の参照処理→Master参照
  • それ以外の参照処理→Master/Slave負荷分散

MySQLレプリケーションの仕様上、Slaveを更新するのはご法度なため、上記のような定義とした。あとは、EC-CUBEの中でどうやって処理を振り分けるのか。

SC_Queryをカスタマイズ

SC_Query内部をカスタマイズして、負荷分散ロジックを追記。

if ( $this->isTransaction() ) {

//分散しない

} else {

//分散させる

}

単純にこのような分岐処理を書いただけ。意外と簡単にできた。

分散結果は?

バッチリ負荷分散されている!単純な参照処理はDB2台に均等に割り振られるが、更新系になると1台に集中する。理想的な負荷分散に成功した!

完璧です。想像通りの動きになっている。あとは性能検証を行い、チューニングを施せば本番運用に耐えうるものに仕上がるだろう。

linux

Posted by wpmaster