Webサービスを実現するに当たっては、サーバーのアプリケーションが必要なことは言うまでもありませんが、サーバーアプリケーションを動作させるためのサーバーの構築が不可欠です。

プログラマの中には、サーバー構築は自分たちの仕事じゃないし詳しく知らなくても良いもの、と考えている人もいます。

確かに、プログラミングをすることとサーバーを構築することは全く別のスキルです。

だからといって、プログラマはサーバーがどのようになっているのか、ということを知らずに設計していてはだめなのです。

それはなぜかと言えば、サーバーの最適化のためにも必要ですし、監視がどのような仕組みで行われ、またログはどこにどのように出力されるのか、DBのバックアップがどのように取られるかなど知っておかないと、正しい設計が行えない場合があります。

Webアプリケーションは、利用者数が多いだけにさまざまな問題が起こりえます。

それらの問題を極力起こさないことが大事ですが、起こったときのリカバリをどれだけ適切に行えるかということはとても重要なことなのです。

そのためには、サーバーの構成がどのようになっていて、どのようにエラー検知をし対処できる仕組みになっているのか、そして運用はどのように監視しているのかといったことを知った上でプログラミングすることが大事なのです。

システム障害時の復旧に知恵が必要

Webサービスを支えるサーバーに障害が発生して動かなくなると、お客様がアクセスしてきて操作した内容が正しくシステムに反映されないことが起こります。

毎日最初に取り込んでいる外部システムのデータが取り込まれず、本来後に取り込まれるべきデータが先に取り込まれたために、データの不整合が発生することもあります。

こういう障害が発生すると、障害により止まった状態、あるいはそれより前の状態までさかのぼってそこから最新の状態になるようにシステムを復旧させる必要があります。

そのときに頼りになるのが、ログです。

何がどこまで正常に動いたのか、どこからおかしくなったのか、正確に切り分ける必要があります。

そのためにどのようにログを出力しておくべきか、これはプログラマに任された大事な仕事です。

設計の最初の頃は、自分が書いたプログラムが動作することを確認する目的で、かなり低レベルな(本来は不要だけどテスト時に必要なものという意味)ログを書くことになります。

ところが、こういったログはシステム障害時には役に立たないことが多いのです。

実際にサーバーの本格運用時には、ログの出力レベルを上げて低レベルなものは出力しないようになります。

この段階で、障害解析に有効なログが出力されているかがとても重要になります。

こういうことを意識してプログラミングすることが必要です。

データのバックアップはいつの分があるか?

サーバーを構築すると、サーバーのイメージやDBを一定の間隔でスナップショットを撮るなどのバックアップをします。

これによりある一定の場所まで戻すことができます。

たとえば、DBがバグや運用作業を間違えてDBの一部が書き換えられてしまった、などが起きたときにどうやって復元するかです。

もちろん、DBをスナップショットが撮られた段階まで戻したところで、それ以降の変更を反映することの方がよほどたいへん、ということもよくあることなので、どう復旧するかはシステムにより違いはあるでしょう。

ただ、システムがどのような構成になっていて、どんなバックアップがあって、ということを知らなければ、データを復旧するアイデアも出てこないというものです。

Webサービスはアクセスが止まることがありません。

たとえ1台のサーバーが止まっても、他のサーバーが動いていればお客様から見て問題は起きていないわけです。

だけど内部的にはDBの不整合などが起きていて、それがどんどん積み重なっていくのです。

このように、障害が発生していてもどんどんアクセスしてきますので、いかに迅速に対応するかが求められます。

障害が発生したらすぐに対策を練らないといけないのです。

あらかじめシステム構成は把握しておくくらいのことが求められるのです。