GREE製 MySQL Proxy

こんにちは。プラットフォーム開発部のますやまと申します。

はじめに

梅雨が近づいてきてだんだん蒸し暑さを感じる季節になってまいりました。毎年この時期になると、我が家では梅酒を作ります。梅酒なんて完成品を買ってくればいいじゃない、と思うかもしれませんが、市販品だとなかなか好みの味に出会えないものです。そこで梅を数kg買ってきて漬けるわけですが、毎年ホワイトリカーや焼酎、ブランデーと酒を変えてみたり、氷砂糖の量を変えてみたり、はちみつにしてみたりするうちに、自分の理想の味に近づいてきました。やはり完全に自分好みにできると満足度は高くなります。
普段、グリーではオープンソースのソフトウェアを使用することがほとんどですが、やりたいことと「ちょっとちがう」ということが多々あります。そこで、複数のソフトウェアを組み合わせて何とか用途に合わせて使ったり、パッチを書いて挙動を変えてしまうのが一般的だと思いますが、やはり用途に合わせて作ってしまうのが一番理想に近いものができあがります。というわけで、グリー独自で作っているソフトウェアの紹介をさせていただきたいと思います。

MySQL Proxy

MySQLへの接続proxyというとlvsを使用するのが定番で、最近ですと本家のMySQL proxyもあります。しかし、グリーの今のシステムに当てはめるとどちらもいまいちです。
グリーの要望としては

  • 今のアプリケーションの仕組みをまったく変えたくない
  • 複数あるスレーブのロードバランスをしたい。しかも個々のサーバの性能は違うかもしれない
  • マスターがダウンしたら自動的にマスターの切り替えをしてほしい

・・・3つめがとても野心的ではありますが、まあ、こんな感じのプログラムを作ってみました。
名前をg2proxyといいます。

全体構成

  • マスター向け接続とスレーブ向け接続を別のportで待ち受ける

    • 更新クエリと参照クエリをg2proxyが判別することはしませんリクエスト側で判別して投げ分ける必要があります。
  • スレーブは複数台設定し、負荷分散を行う

    • 複数台のスレーブサーバにリクエストを分散します。サーバ毎に重みづけを変えることもできます。
  • コネクションのプーリングを行う

    • 一度MySQLサーバとの間に確立したコネクションは保持し、次のリクエストの際に再利用します
  • マスター切り替えを自動的に実行

    • マスターのダウンを検知したら、スレーブの一台をマスターに昇格させ、サービスを続行します

性能

MySQLとの間に余計なことするものが入って中継をするので、当然ではありますが性能は低下するはずです。どれくらい低下するか計測してみました。

構成とスペック

CPU XeonE5504
Memory 24GB
HDD 200GB 15krpm
  • MySQLサーバ 1台
  • g2proxyサーバ 1台
  • 負荷をかけるクライアント 1台

負荷をかけるクライアント

MySQLサーバに接続

SELECT * FROM table WHERE id=????? という単純なリクエストを投げる

結果を取る

切断

という単純なサイクルを繰り返すテストクライアントを作成(C + MySQL API で書きました)

結果

※以下、単位は実行にかかった秒数となります

1並列×10000回実行 10並列×10000回実行 100並列×10000回実行
mysql直接接続 8.059 23.161 202.396
g2proxy経由 9.592 22.343 184.570
性能比 84% 104% 109%

並列数が上がればg2proxy経由の数値がMySQL直接接続に近づくと予想していましたが、まさか超えるとは思いませんでした。MySQLはクライアントが多い状態での新規コネクション受け入れ時の処理に若干コストがかかってしまうようです。
試しに、g2proxyでコネクションプールをoffにして試してみました。

10並列×10000回実行
MySQL直接接続 23.161
g2proxy経由(コネクションプール on) 22.343
g2proxy経由(コネクションプール off) 29.804

やはり遅くなりました。

おまけ

MySQLの認証が重いんじゃないかないか説がありますので、試しに計測してみました。
mysqldを skip-grant-tablesオプションを追加して起動し、同じテストをしてみます。

1並列×10000回実行 10並列×10000回実行 100並列×10000回実行
MySQL直接接続 8.059 22.161 202.396
skip-grant-tables オプション追加 6.914 20.158 197.285

若干ではありますが向上しています。

さいごに

g2proxyはグリー内でさらなる実績を積んで公開しようと思っています。
その際にはぜひ使ってみてください!