by shigemk2

当面は技術的なことしか書かない

サーバ/インフラを支える技術2 2 キャッシュサーバの導入

前回
サーバ/インフラを支える技術2 リバースプロキシの導入 - by shigemk2

HTTPはステートレスなプロトコルである。
一度取得したドキュメントを必要以上にリクエストしなくていいように
キャッシュという機能がブラウザには存在する。
HTTPヘッダからサーバと任意のドキュメントの更新日時(If-Modified-Since)
を見る

特にFirefoxにはアドオンLiveHTTPHeadersを利用することで
HTTPヘッダのやりとりを見ることが可能となる。

  • クライアントから送信されたIf-Modified-Sinceの更新日時を取得
  • ローカルのドキュメントの日付を比較
  • クライアントが保存したドキュメントは更新されていないと判断する

で、新しいドキュメントを取得する必要がないと判断されたら
ステータスコード304(Not Modified)を返す。
これにより、ドキュメント本体の取得は行われない。

キャッシュの効果として、

  • クライアントは、ネットワークからの画像データのダウンロードをする
  • サーバは、ドキュメントとクライアントへの転送を省略できる

クライアントとサーバでキャッシュが可能だが、
Squidというオープンソースを使ってサーバ間でのキャッシュも可能となる。
使用方法としては、いわゆるプロキシサーバのような使いかたで、
オフィスや学校などで利用されている。
PCとサイトの中間地点にSquidが配置されており、
あるクライアントがアクセスしたものを別のクライアントはそのクライアント
のキャッシュを利用してダウンロードのプロセスを省略できる

また、Squidをリバースプロキシのように扱うことも出来る
(というかこの使い方が一般的)

  • クライアントからHTTPリクエストがあると、そのドキュメントをバックエンドのサーバに問い合わせる
  • サーバから取得したドキュメントはSquidが自分自身のローカルにキャッシュする
  • 別のクライアントからリクエストがあると、Squidはキャッシュの有効性を確認し、キャッシュが有効なら、クライアントへはキャッシュを返却する
  • 短時間で10000リクエストがあったら、最初のリクエストだけバックエンドのサーバへアクセスし、残りの9999リクエストはキャッシュが返却される

SquidはHTTPプロトコルのキャッシュ機能を前提としたキャッシュサーバであ
るため、静的なドキュメントも動的なドキュメントもキャッシュすることが可
能となる。ただし、動的なドキュメントでも状態をあらわすドキュメント
(例:xxさんがログインしました)はキャッシュすると面倒なことになるので、
細かい粒度のデータのキャッシュを扱うキャッシュサーバ(例:memcached)が必要になる

memcachedはC言語JavaPerlRubyPHPなどに対応しているため扱いやすい。
また、(key, value)の形でスクリプトを保存することが出来る。

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)