第7話 金曜日の約束と、鳴り止まないアラート(前編)
金曜日の朝、目覚ましが鳴る前に目が覚めた。
いつもなら、あと五分だけと布団にしがみつくところだ。けれど今朝は、昨夜のベランダでの会話を思い出したら、自然と身体が起き上がった。
「今日こそ、意地でも早く帰る」
誰に聞かせるでもなく口にして、洗面台の鏡を見る。寝不足の顔はいつもと変わらない。それでも、胃のあたりに重くのしかかっていたものが、少しだけ軽い。
昨夜、結菜ちゃんと交わした約束がある。
明日は一緒に何かを作る。材料費は俺持ち。何を作るかはまだ決めていないけれど、こういうのは決めている時間も楽しい。
朝食をかき込みながら、冷蔵庫の中を思い浮かべた。食材を買い足すなら、帰りに寄ればいい。結菜ちゃんは、何が食べたいだろう。餃子は一緒に包むのが楽しそうだし、ハンバーグならソースを何種類か作って食べ比べるのもありだ。
いや、彼女に聞くのが一番か。
スマホに手を伸ばしかけて、やめた。金曜の朝から、浮かれた連絡を送るのも気恥ずかしい。会ったときに話せばいい。
出勤の道も、いつもより足取りが軽かった。駅までの信号に引っかかっても、電車が少し混んでいても、今朝は大したことじゃないと思えた。
シンク・コア・システムズのオフィスに着いたのは、いつもより十五分早い時間だった。
「おはようございます」
「お、槙野。早いな」
同じチームの佐藤が、紙カップのコーヒーを片手に振り返った。
「まあ、今日はちょっと予定があるんで」
「珍しい。デート?」
「そういうんじゃないですよ」
曖昧に笑って、自席に着く。佐藤は何か言いたそうだったが、すぐ別のメンバーから声をかけられて、そちらへ行った。
端末を立ち上げ、今日やるべきことを一覧にする。定常作業の確認、先方への報告資料の修正、残っているレビューが二件。急ぎの割り込みさえなければ、定時前には片づけられる量だ。
俺は予定表に目を通し、余計な会議がないことを確かめた。
よし。いける。
午前中、驚くほど集中できた。
問い合わせへの回答を片づけ、資料の数値を照合し、レビューで指摘された箇所を直す。普段ならチャットの通知に目を取られたり、次の作業に移る前に一息ついたりするところを、今日は手を止めなかった。
昼休みに入るころには、朝に並べたタスクの半分以上が消えていた。
弁当を食べながらスマホを開く。結菜ちゃんからの新着はない。別に、返事を待っていたわけじゃない。そう自分に言い訳しながら、週末の買い物先を検索しかけてやめた。
まずは今日を乗り切る。
午後も、残りの作業は順調に進んだ。十六時半には資料を先方へ送り、最後のレビューも返した。返信待ちの細かな確認事項はあるが、急ぎではない。
時計を見る。
十七時を少し過ぎていた。
定時は十七時半。あと三十分。
俺は作業画面を閉じる前に、明日必要な食材をスマホのメモに書き込んだ。ひき肉、キャベツ、餃子の皮。結菜ちゃんが餃子を作りたいと言うとは限らないから、買うのは帰りに確認してからでいい。
あとは、引き継ぎのチャットを一本投げておくか。
そのときだった。
ピロロロン、ピロロロン――と、フロア中の社用携帯が一斉に甲高い緊急通知音を奏で始めた。
同時に、PCの社内監視チャットツールが激しく点滅し、信じられない勢いで警告の自動投稿がログを押し流していく。
視線を上げた先の壁掛けダッシュボードでは、数秒前まで穏やかだったエラー率のグラフが、ほぼ垂直に跳ね上がって危険域の赤色で埋め尽くされていた。
「おい……本番DB、落ちてないか!?」
「APからのコネクション全滅です! 応答返ってきません!」
椅子を蹴立てて立ち上がる音が、フロアのあちこちで重なった。空気が一瞬で氷点下まで凍りつく。
俺は震える手でターミナルを叩いた。表示されているのは、シンク・コア・システムズが運用を預かる大手クライアントの基幹データベース。業務の中枢にある、受注と在庫と出荷を管理するシステムだ。
ヘルスチェック失敗。レプリケーションの遅延が許容値を超過。トランザクションの滞留が指数関数的に増大。
致命的なログが、秒単位で積み上がっていく。
「佐藤さん、これ……!」
背後に駆け寄ってきた佐藤が、息を呑んで画面を覗き込む。
「データ不整合が出ています。待ってください、プライマリ側もプロセスが……死んだ!? フェイルオーバー失敗してます!」
俺の指が、キーボードの上で硬直した。
「うそだろ……」
データベースが落ちた。
しかも、ただのプロセス停止じゃない。複数テーブル間で整合性が崩れたまま停止している。復旧手順をひとつ間違えれば、残っている実データまで完全に破壊しかねない最悪のパターンだ。
フロアの入口の扉が勢いよく開き、部長の黒田が駆け込んできた。ついさっきまで上着を腕にかけ、帰る準備をしていたはずの男だ。顔から血の気が完全に引いている。
「全員、手を止めろ! 重大障害(Sev-1)だ! 対象システムの担当者は直ちに第一会議室へ集合! 運用チームは専用インシデントブリッジを開け! 全員帰宅は保留だ!」
「部長、保留って……復旧までですか?」
誰かが掠れた声で尋ねた。
「当たり前だ! 全社総力戦でいく! すでに帰宅したチームのキーマンを至急呼び戻せ! 社内に残っている管理職は全員会議室だ! 先方にはもう一報が入っているぞ!」
終業の安堵に包まれかけていたフロアの空気が、完全に消し飛んだ。
コートを着かけていた同僚が無言で袖を抜き、カバンを肩にかけたまま固まっていた人間はそれを床に放り出す。さっきまでの雑談は霧散し、狂ったように鳴り続ける内線と、飛び交う怒号、キーボードを激しく叩く音だけが支配した。
俺もノートPCを掴んで立ち上がった。
「槙野、お前も来い! 今のDB構成とレプリカの同期設計を一番把握しているのはお前だ!」
「……わかりました!」
黒田部長の切迫した声に、断る選択肢などどこにも存在しなかった。
第一会議室には、すでに十人以上が雪崩れ込んでいた。大型モニターには障害状況のダッシュボード、緊急連絡先、流れ続けるエラーログが並ぶ。机の上には誰かが置き忘れた紙コップがあり、コーヒーは冷めきっていた。
俺はすぐにシステム構成図を開いた。
「まず、現状の切り分けはどこまでできていますか」
「アプリケーション側は全面遮断した。受注処理も在庫更新も止めている。だが先方の現場からは、出荷指示が完全に詰まってラインが止まったと怒鳴り込みが入っている!」
「DBの状態は!?」
「プライマリのノードがダウン。スタンバイへ自動昇格を試みたが、同期不整合のフラグが立ってフェイルオーバーが途中でアボートした。手動昇格もロックがかかっていて通らない」
そこまでは正しいフェイルセーフの挙動だ。だが、事態は極めて重篤だった。
俺はログを遡り、異常発生直前の処理を洗った。ひとつの夜間バッチが処理遅延を起こし、その裏で更新系の要求が想定の数倍に膨れ上がっている。だが、単なる負荷増大だけでここまで不整合が拡大するはずがない。
「この直前、本番環境へのパッチ適用やパラメータ変更はありましたか」
「変更申請は一切出ていない。先方ベンダーも触っていないと言っている」
「OS側の自動アップデートは?」
「いまログを追わせている!」
答えが返るたび、チャットのメンション通知がマシンガンのように画面を覆う。別室ではすでに役員向けの状況説明が始まったらしい。復旧見込みは何時だ、顧客への正式説明はどうする、損害賠償の話が出始めているぞ――まだ原因の糸口すら見えていないのに、期限だけが容赦なく切り詰められていく。
時計の針は、あっという間に十八時を回った。
先方のシステム部長との通話が、会議室のスピーカーフォンから鳴り響く。怒気を含んだ声が、壁に反響した。
『こちらの現場は完全に麻痺しています! トラックが何台も立ち往生して出荷ができないんですよ!? いつ直るんですか!』
「現在、データの保全を最優先に原因特定とリカバリ手順を策定しております。現時点では、確実な復旧時刻をお伝えすることは……」
『そんな回答を聞くために電話してるんじゃない! いつになったら目処が出るのか、その時間を答えなさい!』
「確認が取れ次第、直ちにご報告を――」
『その言葉をあと何回繰り返すつもりだ! こちらも経営陣に報告しなければならないんだ。責任を持って、今すぐ復旧時刻を切りなさい!』
黒田部長が険しい顔でマイクをミュートにした。
「……槙野。大体の感覚でいい、最短で何時間だ」
「出せません。原因も、トランザクションの欠落範囲も特定できていないんです。今ここで適当な時間を伝えたら、その数字が一人歩きして現場がさらに破綻します」
「それでも数字を言わなきゃ向こうが納得しないんだよ!」
「復旧を焦って不整合なデータをそのまま昇格させたら、取り返しのつかないデータ破壊になります! ……二十分ください。ログのタイムスタンプとバックアップのスナップショットを突き合わせます。そこまで見れば、取りうる手順とリスクの説明はできます」
部長はギリと奥歯を噛み締め、深く息を吐き出してミュートを解除した。
そこからは、時間の感覚が完全に麻痺した。
異常終了直前のWALログを切り出し、別チームが吸い上げたバッチの実行履歴と照合する。直近のフルバックアップ取得時刻を調べ、差分トランザクションがどこまで追随できるかを検証する。
「この時間帯、在庫更新APIへのリトライがスパイクしてます」
「クライアント側でタイムアウトして、二重送信を繰り返したのか?」
「可能性は高いです。同一の伝票番号で連続してリクエストが叩かれている痕跡があります」
「だが、重複排除のロジックが入っているはずだろ!」
「そこを今、DB側のクエリ実行ログと突き合わせてるんです!」
飛び交う怒号。その間にも、警告音は形を変えて鳴り続ける。一次切り分けで静観設定にしたはずのアラートが、別経路の死活監視から再び叫び声を上げる。
十九時半を過ぎても、掴めるのは断片的な情報ばかりだった。
二十時には、役員向けの障害報を作成させられた。未確定事項を「調査中」と書けば「いつ分かるのか」と詰められ、少しでも希望的観測を滲ませれば「その時間で確約だな」と曲解される。
その度に解析作業が中断され、集中力が削り取られていく。
「槙野、先方から再度のエスカレだ!」
「田辺さん、ログ解析のシェル回しておいてください! すぐ戻ります!」
誰が悪いわけでもない。誰もが限界の中で必死に動いている。だからこそ、逃げ場のない苛立ちと焦燥が、冷房の効きすぎた会議室の中に澱のように溜まっていった。
日付が変わり、深夜を大きく回ったころ。ようやく、障害を引き起こしたクリティカルな原因が輪郭を見せた。
想定外のリトライ集中によるデッドロックの連鎖と、非同期レプリケーションの遅延が最悪のタイミングで噛み合い、コミット順序の逆転が発生したことによるデータ不整合。
「……原因は、これだな」
充血した目をこすりながら、部長が呻いた。
「はい。筋としてはこれが最も確実です。ですが、整合性を担保して復旧させるには、壊れたトランザクションを手動でロールフォワードして差分を検証するしかありません。バックアップからのリストアとデータ突き合わせが必要です」
「最短で……どれくらいかかる」
「……まだ、言えません。気の遠くなるような手作業になります」
答えた自分の声が、信じられないほど掠れていた。
ふと壁の時計を見上げると、午前一時五十分を指していた。
顔を洗うためにようやく会議室の外へ出た瞬間、張り詰めていた糸が緩んだのか、足の裏から強烈な痺れが這い上がってきた。食事といえば、誰かが差し入れたパサついた菓子パンを半分かじったきりだ。
重い足取りで廊下のベンチに腰を下ろし、作業用ズボンのポケットから私用スマホを取り出した。
画面には、いくつかの通知が並んでいる。社内連絡の合間に、私信のアイコンがあった。
結菜ちゃんからのメッセージは、まだない。
俺は、点滅する画面を見つめたまま動けなくなった。
定時で上がって、早く帰る。明日は一緒に何かを作る。材料費は俺持ちで――。
あんなに楽しみにしていた金曜日の約束が、今や遠い過去の出来事のように思える。
こんなの大規模障害だ。俺がサボったわけでもないし、責められる筋合いなんてない。連絡を入れれば、きっと彼女は「大変ですね」と理解してくれるだろう。
けれど、何も言わずにすっぽかして朝を迎えることだけは、どうしてもできなかった。
強張った指先で、画面を叩く。
『ごめん、大規模障害が起きて今夜帰れなくなった。週末の約束、延期させてほしい』
送信ボタンを押す。
夜中の二時だ。返信なんて期待していなかった。彼女だって、とっくに自分の部屋のベッドで眠っているはずだ。
大きく息を吐き出し、スマホをポケットに戻して会議室へ戻ろうとした。
そのとき、手のひらの中で短くバイブレーションが震えた。
画面を見る。
『了解。大変そうだけど、無理しないでね』
結菜ちゃんからの、あっさりとした、けれど温かい返信だった。
胸の奥をぎゅっと掴まれたような感覚と、ほんの少しの救いが同時に押し寄せる。
情けないやら、ありがたいやらで、目頭が熱くなった。
『本当にごめん。ありがとう、落ちついたら』
そう打ち込もうとした、その瞬間だった。
会議室の中から、再び耳をつんざくような甲高い警告音が鳴り響いた。
「槙野! 戻れ! リストア用のバックアップデータにCRCエラーが出たぞ!」
背中を殴られたような衝撃に、俺は息を呑んだ。
画面から指を離し、電源ボタンを押してスマホをポケットに押し込む。
返信は、あとで打てばいい。
その「あとで」が、いつ訪れるのかもわからないまま、俺は地獄の待つ会議室へと駆け戻った。
土曜日の朝になっても、障害は収束しなかった。
会議室の隅にパイプ椅子を三つ並べ、泥のように意識を失ったのは二時間足らず。冷たいスチールの骨組みが背中に食い込み、身体の節々がきしむように痛んだ。
顔を洗い、ぬるくなった自販機のお茶を流し込んで、再びモニターの前へ戻る。
結菜ちゃんへの返信は、まだ送れていなかった。
スマホの画面を開くたび、打ちかけの文面は社内チャットの緊急通知にかき消され、仕事の連絡の濁流の下へと埋もれていく。
土曜の昼が過ぎ、夜になっても作業は終わらなかった。
日曜の朝を迎えても、出口の光は見えなかった。
誰かが買ってきた冷たいおにぎりを胃に流し込み、泥水のようなインスタントコーヒーをあおり、ひたすらログを突き合わせ、先方からの怒号を受け止める。
金曜日と土曜日の境界も、土曜日と日曜日の境界も、朦朧とした意識の中で輪郭を失い、どす黒く溶け合っていった。
今夜も帰れなかった、冷え切った自室のドアノブのことが、ふと脳裏をよぎる。
もしかしたら結菜ちゃんは、約束を信じて何かを作って、タッパーに入れて掛けてくれたのだろうか。
それとも、音信不通になった俺に愛想を尽かして、通り過ぎていっただろうか。
冷たい夜風に晒したまま、俺はそのドアを開けることすら叶わない。
疲労で霞む視界を無理やりモニターへと引き戻しながら、俺はただ、終わりの見えないコマンドを打ち込み続けた。




