DB負荷分散の一歩目はセッション管理から

技術情報・ノウハウ

セッション管理にMySQLなどのRDBを使用している場合、KVS(NoSQL)に変更することでデータベース負荷を大きく下げる事ができます。

あらゆるWEBアプリケーションと切っても切れない関係にあるのがセッション。今回このセッション管理を変更することでDBの負荷を劇的に下げてみたので、その経緯を個人ブログに綴ってみました。

ちなみにセッションの管理方法はいくつかありますが、主な方法のPros/Consは以下の通り。

Cookie

Railsのデフォルトのように、クライアントのクッキーに全てのデータを保存してしまう方法。

  • [P] サーバにデータをため込まないので、サーバサイドの負荷を気にしないで良い
  • [P] アプリケーションサーバを分散させても一貫性を持たせられる
  • [C] ユーザ側にデータがあるため、改ざんリスクが高まる(Railsは暗号化によって対策してますが)
  • [C] Cookieの仕様上、4KBの容量制限がある
  • [C] Cookieを乗っ取られた場合等でもサーバサイドからセッションを破棄する手段がない

ファイル

LaravelやCakePHPのデフォルトで、CookieにセッションIDだけ持たせて、サーバサイドに実データをファイルとして置く方法。

  • [P] サーバサイドにデータがあるので改ざんを回避できる
  • [P] データ容量制限がない
  • [P] サーバサイドでセッションの破棄ができる
  • [C] アプリケーションサーバを分散させた場合、一貫性が確保できない
  • [C] 1セッションにつき1ファイル生成されるので、大量にセッションファイルが出来てファイルシステムに負担が掛かる

RDB

CookieにセッションIDだけ持たせて、MySQLなど、サーバサイドのRDBに実データを置く方法。

  • [P] サーバサイドにデータがあるので改ざんを回避できる
  • [P] データ容量制限がない
  • [P] サーバサイドでセッションの破棄ができる
  • [P] アプリケーションサーバを分散させても一貫性を持たせられる
  • [C] RDBは大量の同時I/Oに弱いので、アクセスが増えるとデータベースが一気にパンクする。しかもスケールしづらい。

KVS(NoSQL)

CookieにセッションIDだけ持たせて、Memcached、RedisなどサーバサイドのKVSに実データを置く方法。

  • [P] サーバサイドにデータがあるので改ざんを回避できる
  • [P] データ容量制限がない
  • [P] サーバサイドでセッションの破棄ができる
  • [P] アプリケーションサーバを分散させても一貫性を持たせられる
  • [P] 大量の同時I/Oに強く、アクセスが増大しても大丈夫!
  • [C] セッション専用にひとつデータベースが追加されるのでコストが増

セッションをRDBで管理しているケースは多いかと思いますが、トラフィックの多いサイトの場合セッションの管理は非常にマシンパワーを食います。お手軽に大きな効果が期待出来るので、是非参考にしてみてください。

記事はこちらから。

Redisでセッション管理(ElastiCache in VPC)

小野塚 知純

小野塚 知純

1980年生まれ。早稲田大学教育学部英語英文学科修了。ERP導入コンサルタントとして、大手製造業向けSCMシステムの導入に携わる。その後、インフォアスリートを設立。 主にECシステムを中心としたシステム開発、コンサルティング、セールス・マーケティング等を行い、スタートアップ企業から年商百億円程の企業まで、幅広い企業をWEB・ITのスペシャリストとしてバックアップ。最近は非IT企業の、ITを活用した非常識な未来の経営を模索中。趣味は歌とお酒。