自動化できないシステム
例えば、銀行の公共料金自動引き落としの処理1とか。絶対に時間内に終えなければならない、クリティカルな処理がある場合、処理を全部自動でやるのは無理でしょうね。システムに 100% の信頼性がなければ。宇宙線でメモリの内容が書き換わる、なんてことも − 極めて低い確率ではありますが − 起きるわけですし。2
我々の仕事は、開発部署が構築したシステムの下で正しく処理が動いているかを日々監視することにある。
監視する中でトラブルがあれば開発部署に問い合わせ、対応を要請する。
我々は次に動く処理を監視しなければならないので、対応はあちらに任せるのが常である。
とはいえ、基本、処理は自動で動いて、処理の成功/失敗を待機要員(オペレータ)に伝える、という形になっているのが普通ではありますかね。
Aという業務があって、それを終えるためにa,b,c,dという作業を順にこなす必要がある。
だが、a->b->d->cとなったり、a->b->cで止まったり、時にはa->c->dとなったりした。
人間がひとつひとつプログラムを起動し、確認しなければならないのは、
- ひとつひとつのプログラムの信頼性が極めて低い
- 基本的なフォールトトレランスが実現されていない
といった理由があるのではないですかね。
1 は、頻繁にプログラムが処理を失敗するので、はじめから人間が関与したほうがよい、という運用になってしまっている状況。 2 は、それに輪をかけて、処理が失敗したときに、データベースの一貫性が破壊されてしまうというもの。単純に失敗したところから処理再開、とできないわけです。「基本的な」とつけているのは、つまり、データベースのロールバック/ロールフォワードが、ろくに考えられていないということですね。
私が見たことがあるケースですと、例えば、互いに関連するテーブル A, B, C がありまして、バッチ処理が以下のように組まれている、というのがあります。
for a in A A を処理 for b in B B を処理 for c in C C を処理 commit/rollback
巨大なひとつのトランザクションになっているわけですね。で、これが 2 時間かかる処理だとして、1時間50分くらいで、処理が失敗して、ロールバックに 2 時間、はじめからやりなおして 2 時間、などという楽しい運用になるわけです。 Oracle データベースですと、ロールバック・セグメント/UNDO表領域を使い切って処理が失敗する、というのが典型。
これは到底運用に耐えられないわけですが、さりとて、プログラムを直すとなると、全面的に制御構造を書き直しとなるわけでして。応急策として、以下のようになったりします。
for a in A A を処理 commit/rollback for b in B B を処理 commit/rollback for c in C C を処理 commit/rollback
当然、この処理が途中で失敗しますと、テーブル A, B, C 間の整合性が崩れるわけです。で、どこで失敗したかによって、色々なリカバリ処理が運用現場でできあがっていくわけですね。
かくして、運用現場のオペレータは、プログラムをひとつひとつ手で起動し、どこで失敗したかを適宜確認し、状況に応じて回復/再開を行なうこととなるわけです。
トランザクション単位で、テーブル間の整合性を維持しつつ、漸次処理を行なっていけば、回復/再開は、 RDBMS のトランザクション機能だけで簡単にできるわけですけどね。
for x in トランザクション単位 A を処理 B を処理 C を処理 commit/rollback
信じがたいほど馬鹿げた − でも現実にあった − 話。
確か、 P.J. Plauger 氏だったかが、浮動小数点のバグで アリアン・ロケットが爆発した話で、「そのプログラムを書いた人間をロケットに乗せて打ち上げろ」などと、のたまっていたと思いますけど。開発志望の人間に運用をやらせるのは、そういった「含み」があったりするのかも、と思ったり。
1. 処理が失敗するとこういうことになるという例。数億円の損害賠償を払ったそうで。
みずほフィナンシャルグループ大規模システム障害 JST失敗知識データベース
2. 半ば以上冗談ですけどね。
アルファ線によるLSIエラーの発見 マイコミジャーナル
| 固定リンク | コメント (0) | トラックバック (0)

最近のコメント