ECCUBEでMySQLRouterを使って負荷分散
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台に集中する。理想的な負荷分散に成功した!
完璧です。想像通りの動きになっている。あとは性能検証を行い、チューニングを施せば本番運用に耐えうるものに仕上がるだろう。
ディスカッション
コメント一覧
まだ、コメントがありません