システムの障害対応

ツイッターばっかに書き込んでいるので、こっちはすっかりお留守ですが。
この前、とあるシステムの障害対応がありましたので、
その際に気づいたことでも書きたいと思います。


障害が起こった時は、以下の4つを上から順に対応をしていかなければならないと思いました。

  1. どういう現象が起こっているかを収集する
  2. どこの箇所が原因となっているかを特定する
  3. 原因となっている箇所を直す
  4. この障害によって後始末をする


まず、1. は 2. の手がかりとなります。
1. が不十分だと、2. の原因の箇所が見つからなかったり、間違ったりするので、
ログや DB のレコードなど、とにかく情報を収集します。
例えば、以下のようになります。

  • ログに ERROR が多くある
  • 想定しないレコードが DB に入っている
  • ユーザからの問い合わせが多く来る

お医者さんに例えるならば、患者の症状を聞く、といった感じでしょうか。


次に、1. を元に 2. を行います。
明らかにコード上に不具合の部分を発見した場合などは必要ないですが、
そうでない場合は開発環境などで障害を再現さしてみて、
原因となっている箇所が間違いないことを確認します。
お医者さんに例えるならば、病名を言いわたす、といった感じでしょうか。


3. では、不具合の箇所を直します。
ユニットテスト、周りからのレビューするのも忘れずに。
お医者さんに例えるならば、傷をふさぐ、手術をする、といった感じでしょうか。


最後に、4. では、障害によって引き起こされた後始末を行います。
システム側では、例えば、DB内の予期せずに NULL が含まれるレコードを削除する、
のようにデータの不整合を直します。
ユーザ側では、ユーザにお詫びの掲示を行う、
のように障害情報を公開します。
場合によっては不具合の起こったユーザに特別な処理を行ってもらう、
ということもあるかもしれません。
お医者さんに例えるならば、傷から血が出すぎたので輸血をする、といった感じでしょうか。


以上、まとめてみました。
ほんと、障害がないに越したことはないのですが。