システム全体を階層で理解して「あるべき状態」を知る
「システムのあるべき状態」を知る
ここまで、システムについて、ユーザーから見えるアプリケーションから順に、階層別に説明してきた。例えば、運用しているシステムにトラブルが発生し、その原因を探る場合には、このように最上位の階層から現象を理解し、その原因追及の観点を徐々に階層をおろして考えていく。1つ下の階層の動きを意識しながら、問題となる現象を理解することで、問題の所在が明らかになるからだ。
今度は逆に、1番下の階層からシステムを見ていくことにしよう。
先ほど、「『そのシステムが正常に稼働し続ける』こととはどういう状態を指すのかを、正確に理解することが重要である」と述べたが、「正常に稼働し続ける状態」とは、すなわち「システムのあるべき状態」である。この「あるべき状態」のシステムを理解するには、1番下の階層から、その構成や要素を積み上げていくことが必要だ。
すなわち、システムの構成要素とその状態を収集し、その変化を監視することこそが、システムをトラブルから未然に防ぐための「運用監視」のキモと言える。
それでは、具体的に見ていこう。
ハードウェア
まず、ハードウェアだが、個々のサーバー機器の構成を正しく把握しておくことが重要だ。必要となる構成情報は、次のようなものとなる。
- ハードウェアベンダーおよび機種名
- CPUの数
- メモリー搭載量
- HDDの数と搭載量
- RAID(Redundant Arrays of Inexpensive Disks)コントローラ の有無
- ネットワークインタフェースの数
HDDなどは、RAIDを構築することが多く、たいていは複数搭載されている。その場合、OSなどから見えるデバイスIDが、実際のどのHDDに対応するのかを確認しておくことが必要だ。特に最近では、ハードウェアはデータセンターのラックに格納され、普段はリモートで操作することが多い。機種の型番についても、設置場所から離れてしまうと、つまりリモートからはなかなか把握しづらい情報の1つである。あらかじめきちんと確認しておくべきである。
OS(オペレーティングシステム)
次に、そのハードウェア上で動いているOSだ。
OSの種類はもちろん、バージョンにも気を配るべきである。また、RAIDの構成を含めたHDDのパーティション構成、各パーティションのマウントポイント(各パーティションにアクセスするためのディレクトリ)も、システム構成を把握するためには重要な情報となる。この階層では、システムがログを吐き続けるので、ディスク領域の空き容量などについても注意する必要があるだろう。
ネットワーク
ハードウェア、OSの階層までが把握できたら、今度は視点を広げて、ネットワークとしてシステム全体を概観しよう。
昨今のシステムでは、複数のノードに役割を分担させ、全体として1つの大きなシステムを構成する。複数のWebサーバーを並列に配置し、ロードバランサーなどの負荷分散を行うことも多々あるし、Webサーバーの後ろに、複数のアプリケーションサーバーが負荷分散される場合や、あるいはさらにその後ろでデータベースサーバーを複数配置し、負荷分散することもある。DB間でレプリケーション(複製)を設定し、不測の事態に備えるような構成にすることも少なくない。
このようにハードウェア(ノード)やOSの階層で把握できるシステム構成からさらに抽象化し、各ノードを一構成要素として、システム全体を把握することで、システムのアーキテクチャをより正確に理解できるようになる。
この階層では、ネットワークのIPアドレスや、ルーティング経路、ネットワークのトポロジー構成も必要になる。ノード間に流れるネットワークプロトコルの種類やその経路、ならびに、各プロトコルがどこで終端されるのか、といった情報や、ファイアウォールによるパケットフィルタリングの設定情報なども、ネットワークを起因とするトラブルを解決するうえで重要な情報となるので、正確に押さえておく必要がある。
ミドルウェア
次は、上記のネットワーク構成とは内容的に重複する部分もあるが、ミドルウェアの構成、配置状況である。
ミドルウェアの階層は、ネットワーク構成と密接に関係するので、ネットワークをまたいだミドルウェアの動きに注目すべだ。DBやアプリケーションサーバーで冗長構成を組む場合、仮想IPアドレスを振ることで、その冗長構成を抽象化することがある。システムを正確に把握するためには、この抽象化された1つ上の階層から見た構成と、階層を1つ降りた具象化された構成を常に行き来して、その両者の関係性を把握することが必要である。また、ミドルウェアとノード間を流れるネットワークプロトコルには密接な関係がある。各プロトコルにはプロトコルごとに使用されるポート番号があり、ミドルウェアのプロセスは、それぞれが対応する番号のポートをバインドしている。どのミドルウェアがどのポート番号を使って、どこのノードのどのプロセスと通信を行っているのかを正確に把握する。
アプリケーション
さて、最後にアプリケーションだ。
アプリケーション内部の詳細な動きや、アルゴリズムについては、開発者でないとわからないことが多く、システム運用の現場では、あまり重視されない。しかし、大雑把でも、「どういう目的で使われるアプリケーションなのか」「具体的にどういう処理を行うのか」「アプリケーションが処理の対象とするデータはどこからインプットされ、どこへアウトプットされるのか」といったあたりは、押さえておくべきである。
アプリケーションをブラックボックスとして捉え、外部から見た正しい振る舞いを押さえておこう。