目次
1章 サーバ/インフラ構築入門 ……冗長化/負荷分散の基本
1.1 冗長化の基本
- 冗長化とは
- 冗長化の本質
- (1)障害を想定する
- (2)予備の機材を準備する
- (3)運用体制の整備 ……障害発生の際,予備機材に切り替える
- ルータが故障した場合の対応
- コールドスタンバイ
- Webサーバが故障した場合の対応
- ホットスタンバイ
- フェイルオーバ
- VIP
- IPアドレスの引き継ぎ
- 障害を検出する ……ヘルスチェック
- Webサーバのヘルスチェック
- ルータのヘルスチェック
- Active/Backup構成を作ってみる
- IPアドレスを引き継ぐしくみ
- サーバを有効活用したい ……負荷分散へ
1.2 Webサーバを冗長化する ……DNSラウンドロビン
- DNSラウンドロビン
- DNSラウンドロビンの冗長構成例
- もっと楽にシステムを拡張したい ……ロードバランサへ
1.3 Webサーバを冗長化する ……IPVSでロードバランサ
- DNSラウンドロビンとロードバランサの違い
- IPVS ……Linuxでロードバランサ
- ロードバランサの種類とIPVSの機能
- スケジューリングアルゴリズム
- IPVSを使う
- ipvsadm
- keepalived
- ロードバランサを構築する
- Webサーバの設定
- keepalivedを起動する
- 負荷分散を確認する
- 冗長構成を確認する
- L4スイッチとL7スイッチ
- ◎Column L7スイッチと柔軟な設定
- L4スイッチのNAT構成とDSR構成
- 同じサブネットのサーバを負荷分散する場合の注意
- ◎Column LinuxベースのL7スイッチ
1.4 ルータやロードバランサの冗長化
- ロードバランサの冗長化
- 冗長化プロトコルVRRP
- VRRPのしくみ
- VRRPパケット
- 仮想ルータID
- プライオリティ
- プリエンプティブモード
- 仮想MACアドレス
- keepalivedの実装上の問題
- gratuitous ARP(GARP)の遅延送出
- keepalivedを冗長化する
- VIPの確認
- VRRPの動作確認
- VRRPインスタンスを分離する
- VRRPインスタンスを同期する
- keepalivedの応用
2章 ワンランク上のサーバ/インフラの構築 ……冗長化,負荷分散,高性能の追求
2.1 リバースプロキシの導入 ……Apacheモジュール
- リバースプロキシ入門
- HTTPリクエストの内容に応じたシステムの動作の制御
- IPアドレスを用いた制御
- User-Agentによる制御
- URLの書き換え
- システム全体のメモリ使用効率の向上
- 例:動的ページにおけるリクエストの詳細
- Webサーバが応答するデータのバッファリングの役割
- HTTPのKeep-Alive
- 例:メモリ消費とKeep-Aliveのオン/オフ
- Apacheモジュールを利用した処理の制御
- リバースプロキシの導入の判断
- リバースプロキシの導入
- Apache 2.2を使う
- workerでhttpdを起動
- httpd.confの設定
- 最大プロセス/スレッド数の設定
- Keep-Aliveの設定
- 必要なモジュールのロード
- RewriteRuleを設定
- 一歩進んだRewriteRuleの設定例
- 特定ホストからのリクエストを禁止
- ロボットからのリクエストに対してはキャッシュサーバを経由させる
- mod_proxy_balancerで複数ホストへの分散
- mod_proxy_balancerの利用例
2.2 キャッシュサーバの導入 ……Squid,memcached
- キャッシュサーバの導入
- HTTPとキャッシュ
- Live HTTP Headersで知るキャッシュの効果
- Squidキャッシュサーバ
- Squidでリバースプロキシ
- Squidは何をキャッシュするのか
- Squidの設定例
- memcachedによるキャッシュ
2.3 MySQLのレプリケーション ……障害から短時間で復旧する
- DBサーバが止まったら?
- DBサーバが停止するケース
- 短時間で復旧する方法
- MySQLのレプリケーション機能の特徴と注意点
- シングルマスタ,マルチスレーブ
- 非同期のデータコピー
- レプリケーションされるデータの内容
- レプリケーションのしくみ
- スレーブのI/OスレッドとSQLスレッド
- バイナリログとリレーログ
- ポジション情報
- レプリケーション構成を作るまで
- レプリケーションの条件
- my.cnf
- レプリケーション用ユーザの作成
- レプリケーション開始時に必要なデータ
- レプリケーションの開始
- マスタ,スレーブのmy.cnfの比較
- スレーブの動作開始&確認
- レプリケーションの状況確認
- マスタの状況確認
- スレーブの状況確認
2.4 MySQLのスレーブ+内部ロードバランサの活用例
- MySQLのスレーブの活用方法
- スレーブ参照
- 複数のスレーブに分散する方法
- スレーブ参照をロードバランサ経由で行う方法
- 概略図
- 内部ロードバランサの設定
- MySQLスレーブの設定
- スレーブ参照のロードバランスを体験
- 内部ロードバランサの注意点 ……分散方法はDSRにする
2.5 高速で軽量なストレージサーバの選択
- ストレージサーバの必要性
- ストレージサーバは単一故障点になりやすい
- ストレージサーバはボトルネックになりやすい
- 理想的なストレージサーバ
- 負荷を軽くする工夫
- HTTPをストレージプロトコルとして利用する
- 軽量なWebサーバの選択
- HTTPを利用するメリット
- 残る課題
- ◎Column 小さくて軽いWebサーバの選択
3章 止まらないインフラを目指すさらなる工夫 ……DNSサーバ,ストレージサーバ,ネットワーク
3.1 DNSサーバの冗長化
- DNSサーバの冗長化の重要性
- レゾルバライブラリを利用した冗長化と,問題
- レゾルバライブラリの問題点
- 性能低下の危険性 ……メールサーバの例
- DNS障害の影響は大きい
- サーバファームにおけるDNSの冗長化
- VRRPを利用した構成
- DNSサーバの負荷分散
- まとめ
3.2 ストレージサーバの冗長化 ……DRBDでミラーリング
- ストレージサーバの故障対策
- ストレージサーバの同期は困難
- DRBD
- DRBDの構成
- DRBDの設定と起動
- DRBDのマスタサーバを起動する
- DRBDのバックアップサーバを起動する
- DRBDのフェイルオーバ
- 手動で切り替える
- keepalivedの設定
- keepalivedをdaemontoolsで制御する
- NFSサーバをフェイルオーバする際の注意点
- バックアップの必要性
3.3 ネットワークの冗長化 ……Bondingドライバ,RSTP
- L1/L2構成要素の冗長化
- 故障するポイント
- リンクの冗長化とBondingドライバ
- Bondingドライバ
- スイッチの冗長化
- リンク故障時の動作
- スイッチ故障時の動作
- スイッチ間接続の故障時の動作
- スイッチの増設
- さらなる冗長化を目指して
- RSTP
- ブリッジの優先順位とルートブリッジ
- RSTPにおけるポートの役割
- RSTPの動作
- おわりに
3.4 VLANの導入 ……ネットワークを柔軟にする
- サーバファームにおける柔軟性の高いネットワーク
- VLANの導入がもたらすメリットを考える
- スイッチの有効利用
- 故障したサーバの復旧体制 ……1台の代替機を活用したい
- 1台の代替機による復旧と,VLANの使いどころ
- VLANの基本
- VLANの種類
- ポートVLAN
- タグVLAN
- サーバファームでの利用
- VLANを使わない場合の構成
- ポートVLANを利用した構成
- タグVLANを利用した構成
- 複雑なVLAN構成でも物理構成はシンプルさが鍵
4章 性能向上,チューニング ……Linux単一ホスト,Apache,MySQL
4.1 Linux単一ホストの負荷を見極める
- 単一ホストの性能を引き出すために
- 性能とは何か,負荷とは何かを知る
- 推測するな,計測せよ
- ボトルネック見極め作業の基本的な流れ
- ロードアベレージを見る
- CPU,I/Oのいずれがボトルネックかを探る
- CPU負荷が高い場合
- I/O負荷が高い場合
- 負荷とは何か
- 二種類の負荷
- マルチタスクOSと負荷
- 負荷の正体を知る=カーネルの動作を知る
- プロセススケジューリングとプロセスの状態
- プロセスの状態遷移の具体例
- プロセスの状態遷移のまとめ
- ロードアベレージに換算される待ち状態
- ロードアベレージが報告する負荷の正体
- ◎Column プロセスの状態をツールで見る ……ps
- ロードアベレージ計算のカーネルのコードを見る
- ロードアベレージの次はCPU使用率とI/O待ち率
- sarでCPU使用率,I/O待ち率を見る
- CPUのユーザモードとシステムモード
- I/Oバウンドな場合のsar
- マルチCPUとCPU使用率
- CPU使用率の計算はどのように行われているか
- プロセスアカウンティングのカーネルコードを見る
- スレッドとプロセス
- カーネル内部におけるプロセスとスレッド
- psとスレッド
- LinuxThreadsとNPTL
- ps,sar,vmstatの使い方
- ps ……プロセスが持つ情報を出力する
- VSZとRSS ……仮想メモリと物理メモリの指標
- TIMEはCPU使用時間
- ブロッキングとビジーループの違いをpsで見る
- sar ……OSが報告する各種指標を参照する
- sar -u ……CPU使用率を見る
- sar -q ……ロードアベレージを見る
- sar -r ……メモリの利用状況を見る
- I/O負荷軽減とページキャッシュ
- ページキャッシュによるI/O負荷の軽減効果
- ページキャッシュは一度readしてから
- sar -W ……スワップ発生状況を見る
- vmstat ……仮想メモリ関連情報を参照する
- OSのチューニングとは負荷の原因を知り,それを取り除くこと
4.2 Apacheのチューニング
- Webサーバのチューニング
- Webサーバがボトルネック?
- Apacheの並行処理とMPM
- preforkとworker,プロセスとスレッド
- プログラミングモデルから見たマルチプロセス/マルチスレッドの違い
- パフォーマンスの観点で見たマルチプロセス/マルチスレッドの違い
- 1クライアントに対して1プロセス/スレッド
- httpd.confの設定
- Apacheの安全弁MaxClients
- preforkの場合
- 親子でメモリを共有するコピーオンライト
- コピーオンライトで共有しているメモリサイズを調べる
- MaxRequestsPerChild
- workerの場合
- 過負荷でMaxClientsを変更する,その前に
- Keep-Alive
- Apache以外の選択肢の検討
- lighttpd
4.3 MySQLのチューニングのツボ
- MySQLチューニングのツボ
- チューニングの切り口での分類
- (1)サーバサイド
- (2)サーバサイド以外
- (3)周辺システム
- 本節でこれから扱う内容
- メモリ関係のパラメータチューニング
- バッファの種類 ……チューニングの際の注意点(1)
- 割り当て過ぎない ……チューニングの際の注意点(2)
- メモリ関連のパラメータ
- メモリ関連のチェックツール ……mymemcheck
5章 省力運用 ……安定したサービスへ向けて
5.1 サービスの稼働監視 ……Nagios
- 安定したサービス運営と,サービスの稼働監視
- 稼働監視の種類
- (1)死活状態の監視
- (2)負荷状態の監視
- (3)稼働率の計測
- Nagiosの概要
- Nagiosのインストール
- Nagiosの設定
- 設定ファイル
- host ……ホストの設定
- service ……サービスの定義
- command ……コマンド定義
- contactとcontactgroup ……通知先と通知先グループ
- 設定のテスト
- Web管理画面
- Nagiosの基本的な使い方
- ホストとサービスの定義
- 通知
- 応用的な使い方
- 稼働率の測定
- 独自プラグイン
- おわりに
5.2 サーバリソースのモニタリング ……Ganglia
- サーバリソースのモニタリング
- モニタリングの目的
- モニタリングのツールの検討
- Ganglia - 大量ノード向けのグラフ化ツール
- Apacheプロセスの状態をグラフ化
- Gangliaにグラフを追加する方法
- 実際に複合グラフを追加してみる
- そのほかのカスタムグラフ
5.3 サーバ管理の効率化 ……Puppet
- 効率的なサーバ管理を実現するツールPuppet
- Puppetの概要
- Puppetの設定
- ノードの定義
- クラスの定義
- 設定の反映
- 設定ファイルの書き方
- リソースの定義
- リソース
- サーバごとの設定の微調整
- リソース間の依存関係
- テンプレートによるマニフェストの定義
- 動作ログの通知
- 運用
- 自動設定管理ツールの功罪
5.4 デーモンの稼働管理 ……daemontools
- デーモンが異常終了してしまったら
- daemontools
- daemontoolsを使う理由
- デーモンになるための条件 ……フォアグラウンドで動作する
- デーモンの管理方法
- デーモンの新規作成
- デーモンの開始
- デーモンの停止,再開,再起動
- デーモンの削除
- シグナル送信
- keepalived ……runファイルの例(1)
- 自作の監視スクリプト ……runファイルの例(2)
- daemontoolsのTips
- 依存するサービスの起動順序の制御
- 便利シェル関数
5.5 ネットワークブートの活用 ……PXE,initramfs
- ネットワークブート
- ネットワークブートの特徴と利点
- ネットワークブートの動作 ……PXE
- ネットワークブートの活用例
- ロードバランサ
- DBサーバ/ファイルサーバ
- メンテナンス用ブートイメージ
- ネットワークブートを構成するために
- initramfsの共通化と役割の識別
- ディスクレス構成にする際に考慮すべき点
5.6 リモートメンテナンス ……メンテナンス回線,シリアルコンソール,IPMI
- 楽々リモートログイン
- ネットワークトラブルに備えて
- メンテナンス回線
- スイッチのトラブルに対する備え
- シリアルコンソール
- シリアルコンソールの実現
- IPMI
- IPMIでできること
- IPMIを使うには
- おわりに
5.7 Webサーバのログの扱い ……syslog,syslog-ng,cron,rotatelogs
- Webサーバのログの集約・収集
- 集約と収集
- ログの集約 ……syslogとsyslog-ng
- syslogを使ったログの集約
- syslog-ng
- ログの収集
- Apacheログのローテート ……cronとrotatelogs
- ログサーバの役割と構成
- おわりに
6章 あのサービスの舞台裏 ……自律的なインフラへ,ダイナミックなシステムへ
6.1 はてなのなかみ
- はてなのインフラ
- スケーラビリティと安定性
- リバースプロキシ
- DB
- ファイルサーバ
- 運用効率の向上
- キックスタートによるインストール
- パッケージ管理とPuppet
- サーバの管理と監視
- Capistranoによるデプロイ
- 電源効率・リソース利用率の向上
- 1Aあたりのパフォーマンスを重視する
- 1台あたりのサーバ能力をできるだけ使い切る
- 不要なパーツは載せない
- 自律的なインフラに向けて
6.2 DSASのなかみ
- DSASとは
- DSASの特徴
- 一つのシステムに複数のサイトを収容
- OSSで構築
- どこが切れても止まらないネットワーク
- サーバ増設が簡単
- 故障時の復旧が簡単
- システム構成の詳細
- Bondingドライバを利用する理由
- DRBDをフェイルオーバする際の注意点
- SSLアクセラレータ
- ヘルスチェック機能の拡張
- 簡単で安全に運用できるロードバランサ
- セッションデータの取り扱い
- memcached
- repcached
- DSASの今後
Appendix
- mymemcheck(4.3節)
- apache-status(5.2節)
- ganglia.patch(5.2節)