サービスの構成要素の資料を眺めていて、ロードバランサとリバースプロキシがあんま分かってないなと思ったので、[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)を見ながら軽く勉強したのでメモ。4月の導入研修直後にもこの本に目を通した記憶があるけど、半年以上仕事でやってから読むと前より大分分かる感じになっていた。しかし、まだまだ理解は足りていない。
ロードバランサとかリバースプロキシとかの効果を自分で遊びながら実感したい欲求出てきたけど、個人でお手軽に遊ぶのはどうやると手っ取り早いんだろうか
— Yasuhisa Yoshida (@syou6162) 2016年12月1日
というのをつぶやいたところISUCONをオススメされたので、過去問を解きながらロードバランサとリバースプロキシの効果を実感したい。
Webサーバーの冗長化
- 複数台のサーバーに処理を分散させてサイトのスケーラビティを上昇させる方法 => 負荷分散(load balance)
DNSラウンドロビン
- DNSを使って1つのサービス複数台のサーバーを分散させる
- 同じ名前に複数のレコードを登録すると問い合わせの度に異なる結果が変わる => 比較的簡単に負荷分散できる
- 均等に分散されるとは限らないなどのデメリットも大きい
IPVSでロードバランサ
- L4スイッチとL7スイッチの2種類が大きく分けてある
- L4スイッチ(TCPヘッダなどのプロトコルヘッダの内容を見る)はIPアドレスやポート番号で分散させられる。普通はこちらを指すことが多い
- L7スイッチ(アプリケーション層の中身まで解析する)はリクエストされたURLによって分散先のサーバーを指定できる。AWSのELBとかはこれ
- IPVS: IP Virtual Server
- L4スイッチ相当。L7スイッチとしては利用できない
- ipvsadmやkeepalivedなどが代表的なソフトウェア
- どういう風に分散させるかのアルゴリズムを持ってる
- ヘルスチェックとかもしてくれる
- ロードバランサ自体も冗長化したい
リバースプロキシ
- ロードバランサを入れるとWebサーバーの負荷分散はできるようになったが、Webサーバはクライアントに直接応答する
- ロードバランサとWebサーバーの間にリバースプロキシを入れるとより柔軟な負荷分散が可能になる
- ipアドレスによる制御、user agentによる制御などもできる。urlの書き換えてcooooooolなURLにしたりできる
- 静的コンテンツ(画像とか)と動的コンテンツの見る先を振り分けることで、メモリ使用量の効率化(Keep-Aliveとか)もできる
- user agentからbotを判断してキャッシュサーバーを見に行かせるなど
- nginxやApache(+ mod_proxyなど)など
キャッシュサーバー
- HTTPはステートレスなプロトコルのため、プロトコルのレベルでキャッシュの機能がある
- Varnish、Squidキャッシュサーバー
- クライアントとサーバーの間でHTTPのキャッシュができるときに使える
- htmlファイルやcss、javascript、画像などの静的なコンテンツに大して非常に効率よくキャッシュできる
- 状態を持っているやつは苦手(例: アカウント名が入ってるとか)
- memcachedによるキャッシュ
- VarnishやSquidが苦手なやつをどうにかできる
- アプリケーションが内部で利用する粒度でキャッシュできる
- htmlの断片とか配列とかそういうのをキャッシュさせるのによい
参考
- Reverse Proxy がなぜ必要か - naoyaのはてなダイアリー
- はてなで大規模サービスのインフラを学んだ - ゆううきブログ
- フロントエンジニアに知ってもらいたいリバースプロキシの重要性 | RickyNews
[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)
- 作者: 安井真伸,横川和哉,ひろせまさあき,伊藤直也,田中慎司,勝見祐己
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/07
- メディア: 単行本(ソフトカバー)
- 購入: 133人 クリック: 2,270回
- この商品を含むブログ (289件) を見る