前回はCDNの話にフォーカスを当てすぎた感がありましたが、今回は少し肩の力を抜いて、前回少し紹介したvarnishを使って、コンテンツ配布のいろいろな構成を作ってみようと思います。
varnishというプロダクトの設定やチューニングに関しては、いろいろなサイトで記載されていたり、勉強会等の資料など充実しているかと思いますが、複数台をつなげたり、さまざまな構成を考えるときのヒントになれば良いな、と(筆者を含めて)キャッシュ、varnishに詳しくない人でもそれなりにできることを目標に解説したいと思います。
本検証を行う時点でのvarnishのバージョンは2.1.3系のものです。varnish-2.1.3-1.el5.src.rpmをダウンロードし、インストールを実施しました。初めての方でもイメージがつかみやすいように、以下のような構成ができることを目標に考えてみます。
- varnishとApacheを1台のサーバに入れてみる
- varnishとApacheを別々のサーバに入れてみる
- 親子関係varnish-varnish-Apacheの直列構成を構築する
- さらにLVSを利用してvarnishを並列化する
varnishとApacheを1台のサーバに入れてみる
OSのインストール方法(環境)によって異なるかもしれませんが、varnish自体のインストールは非常に簡単です。
筆者の作業ログを掲載しようかと思いましたが、バージョンこそ異なるものの、下記サイトの情報がよくまとまっていますので省略します。xcirさん、掲載許可ありがとうございます。
- xcirさんによるvarnish関連wiki
- URL:http://wiki.xcir.net/
- vetnishインストール手順
- URL:http://wiki.xcir.net/index.php?title=Varnish%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86
さて、実際のインストールですが、IPなどの設定が終わり、Apacheもインストールされている前提で、以下のような構成が完成していることになります。
インストール後、とりあえずvarnishを起動してみます。
稼働しているか確認します。
varnishのステータスを確認します。
varnishを停止します。
起動時のパラメータに関しては/etc/sysconfig/varnishに記載されており、バージョン2.1.3時点では以下のようになっています。
オプションそれぞれの意味
-a | 待ち受けポート |
-T | 管理画面待ち受けポート |
-f | varnishにて行いたいことを定義するファイル |
-u | 実行ユーザ |
-S | セキュリティファイル |
-s | キャッシュの格納先と指定容量 |
これらを必要に応じて書き換えることができます。たとえば、本番サービスなどで利用する場合、特にDMZセグメントで構成しようと考えるのであれば、-Tの管理画面待ち受けポートは変更するなどした方が良いでしょう。
また、サービスの規模に応じて、-sのキャッシュファイルの場所や容量を変更することになるかと思います。デフォルトでは、/var/lib/varnish/varnish_storage.bin に1Gバイトの容量を確保しますが、大規模コンテンツ、高トラフィックでキャッシュサーバ自体もかなりの台数並べるようなサービスであれば、このデバイス自体をメモリ上にやSSD、f-ioなどの高速デバイスにするかを検討します。
varnishとApacheを別々のサーバに入れてみる
さて、1つの筐体にvarnishとApacheを入れ、稼働を確認することができたなら、次は同居していたApacheを別筐体へ移動してみます。
varnishが入っていた筐体のApacheのプロセスを停止し、新しい筐体にApacheまでイントール、初期設定を行います。ただし、このままでは、varnishを通じてApacheへ通信することができないため、varnish側の以下の設定を変更する必要があります。
上記default.vclの内容にApacheの場所を指定するのみですので見てみましょう。backend defaultブロックを見ると以下のようになっていると思います。
backendは活字で想像できるように、varnishの後ろにあるIPとポートを定義します。そのため、127.0.0.1がローカルとして名前解決されれば80ポートへ通信するため、「varnishとApacheを1台のサーバに入れてみる」の際はローカル内で解決していたことになります。
今回はこのアドレスとポートをApacheの移動先にするだけで、別々のサーバに配置し疎通することができます。
親子関係varnish-varnish-Apacheの直列構成を構築する
先ほどはvarnishとApacheを別々のサーバに分けてみましたが、その間にもう1台varnish用のサーバ(192.168.1.20)を準備し、定義してみます。
これでvarnish-varnish-Apacheの直列構成ができました。稼働確認に関しては、varnishはvarnishtatでキャッシュがヒットしているかを確認し、Apacheに関してはaccess_logなどからリクエストが届いているか確認します。
さらに、LVSを利用してvarnishを並列化する
LVS自体の機能や設定などについては本連載では省略させていただき、今回は最小限の手間で確認ができるよう、入口と出口のネットワークセグメントを分けることとしました。
この状態でサーバ配置的には図5のような形となります。
これで172.20.1.xのネットワークは分断されました。取り急ぎ、構成を確認するためのテストとしては、図5の172.20.1.10と172.20.1.20のサーバにvarnishを入れ、172.20.1.100などのサーバにApacheを入れてクライアントからLVS経由にて接続を確認してみましょう。varnishのステータス、Apacheのログ以外に、LVSが正しく172.20.1.10と20に対して処理を与えているかどうかも確認できれば、LVCを入れた目的が果たせたことになります。
稼働確認としては、最初の構成から一貫してhttpリクエストを投げてレスポンスがあることを前提に、構成が変わるごとに確認する場所が異なるといったイメージになります。図6のパターンでは以下のようになります。
- LVSサーバ192.168.1.10では、ipvsadm ?Lnコマンドにより、リクエストの回数が正しく振り分けられていくことを確認します。
- varnish(172.20.1.10、20、100)では、varnishstatを利用して、Hitrate ratioなどの項目がカウントアップされていくことを確認します。
- ApacheHTTPサーバ(192.168.1.100)に関してはあまり説明の必要は無いかと思いますが、varnish側が無応答(varnishstatなどでカウントアップされない)などの場合、/etc/httpd/logs/access_logの内容を確認し、リクエストが届いていることを確認します。
さて今回は、varnishを利用した構成の考え方、検証の行い方などについて書いてみました。実は筆者自信もvarnishを利用した経験が今回初となり、数ヶ月前から手探りで触ったりしています。その際、いろいろなサイトに助けを求めながら調べるのですが、大半のサイトではある程度の前提をもとに説明されていたので、varnishを知らない方でもある程度の構成が組めることができればと思って記載してみました。
ここまでできれば、次は実際の利用用途などを考えながらの構成設計となります。実際にサービスに利用する前提においては、各定義を入れていく必要があるかと思いますが、それらに関しては参考になるサイトがいくつもありますので、そちらを参照頂ければと思います。
また、実際にサービスで利用するページ、コンテンツなどの量によって、ハードウェアのスペックやキャッシュとして利用する容量を決定していく必要もあります。これらは実際にベンチマークなどを取得して傾向を分析する必要などもあり、定義内容以外の細かいtipsやポリシー決め、ベンチマーク方法などに関しては、次回紹介できればと思います。