2月 サーバ/インフラを支える技術

2月分! 今が4月であることは気にしない。 2月は『サーバ/インフラを支える技術』を読みました。 理由は、圧倒的なインフラ知識不足を思い知ることが日々多かったからです…くう 知識不足すぎて迷惑をかけているので基本から勉強ということでこの本を読みました。

概要

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

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

一度スタートしたサービスは止めたくない、というのはWebに携わる開発者や担当者に共通する意識ではないでしょうか。しかし、サービスの成長にともない、サーバの増強、ハードウェア/ネットワークの障害対応、複数サーバの同期と管理などが不可欠となり、24時間365日止まらないサービス、稼動し続けるサーバ/ネットワークインフラを設計・構築・運用するには、数々のテクニックが必要です。 本書では、Webシステムのスケールアウトを念頭に、負荷分散システムの構築&高可用の実現、パフォーマンスチューニング、そして手間を極力抑えた運用術という三つのテーマをまとめて解説します。(Amazonの内容紹介から)

2008年出版なので、ほぼ10年経っていますがそれでも学ぶことはすごい多かったです。 わかりやすい言葉で書かれていて、インフラ初心者の私はすごく助かりました。

学んだことメモ

  • ロードバランサ
    • ロードバランサは1つのIPアドレスに対するリクエストを複数サーバへ分散する
    • VRRPはロードバランサの冗長化プロトコル
    • ロードバランサにはL4スイッチとL7スイッチがある
      • L4スイッチ: トランスポート層までの情報を解析しIPアドレスやポート番号によって分散先のサーバを指定できる
      • L7スイッチ: クライアントからリクエストされたURLによって分散先のサーバを指定することができる
    • 一般的にロードバランサとはL4スイッチのこと
      • 内部ロードバランサの分散方法はNATではなくDSR
  • リバースプロキシ

    • クライアントからの要求がwebサーバに届く途中の処理に割って入って前後処理をする
    • 普通のプロキシサーバはLANからWANの間に挟むが、リバースプロキシはWANからLANの間に挟む
    • リバースプロキシはURLでパターンマッチングを行い、マッチするとそのURLに任意の処理ができる
  • MySQLレプリケーション

    • スレーブではI/OスレッドとSQLスレッドの2つが働いている
    • マスターにはバイナリログ、スレーブにはリレーログと呼ばれるファイルが作成される。
      • バイナリログ: データを更新する処理のみの記録。データ参照のログは記録されない
      • リレーログ: スレーブのI/Oスレッドがマスターからバイナリログを受け取りスレーブ側で保存されたもの。内容はバイナリログと同じ
    • スレーブの分散には、アプリケーションで分散と内部ロードバランサの分散がある。内部ロードバランサで分散する方がアプリケーションでスレーブの状態を気にすることがなく、またスレーブを追加するときもロードバランサ以下の作業で完結できる
  • チューニング
    • 負荷を知るのに必要な情報はほぼ全てOSすなわちLinuxカーネルが持っている
    • topコマンドはある瞬間のOSのスナップショットを表示する。CPU使用率やメモリの利用状況が確認出来る
    • ボトルネックを見極めるための作業
    • マルチタスクOSと負荷
      • 負荷は複数のタスクによるサーバリソースの奪い合いの結果生じる待ち時間
      • 負荷を知るためにはLinuxカーネルの動作を理解する必要がある
      • タスク待ちを制御するのはLinuxカーネルのプロセススケジューラー
      • プロセススケジューラーはマルチタスクの制御において実行タスクの優先度を決めてタスクを待たせたり、再開させたりする。
      • スケジューラーはプロセスを状態分けして管理している
    • ロードアベレージ
      • ロードアベレージには実行したいが待たなければいけない処理が数値なって表れている
      • ロードアベレージが報告する負荷は、以下の2種
        • CPU実行権限が与えられるのを待っているプロセス
        • ディスクI/Oが完了するのを待っているプロセス
    • sarコマンド
      • ユーザーモード(%user)での使用率とシステムモード(%system)での使用率を表示する
      • sarコマンドの結果
        • I/O待ち率を表す%iowaitgが高い: I/Oバウンド
    • スレッドはプロセスより細かい実行単位
    • マルチプロセスとマルチスレッドの大きな違いは、プロセスは個別のメモリ空間を保持するが、マルチスレッドはメモリ空間を共有するので、メモリ使用効率が高い
    • MySQLサーバーのチューニング
      • MySQLのメモリ領域(バッファ)は2タイプある
        • グローバルバッファ
        • スレッドバッファ
      • グローバルバッファはmysqldで内部的に1つだけ確保されるバッファ
      • スレッドバッファはスレッド(コネクション)ごとに確保さあれるバッファ
      • スレッドバッファに多くのメモリを割り当てるとコネクションが増えた途端にあっという間にメモリ不足になる

感想

これからインフラを学び始めぞ!っという人にとってすごい良い本だと思いました。 よく使う用語解説のページがあり、文中に出てきてなんだっけ…と思うたびに読み返していました。 とにかくインフラ初心者にもわかりやすい説明・用語解説がすごくよかった…! 乱雑しているいろんなweb説明記事とかより、この本1冊の方が絶対役に立つと思う。