1 ポイント 投稿者 GN⁺ 2023-07-28 | 1件のコメント | WhatsAppで共有
  • Tarsnap の中央サーバーが Amazon EC2 us-east-1failed system status check により停止し、サービスは 2023-07-02 13:07:58 UTC ごろから約 26時間16分 中断した
  • 障害は 13:10 UTC に検知されたが、予期しない再起動の後は人が直接点検するまでサーバーコードの自動起動を無効にしておく運用方針が適用されていた
  • 復旧は Amazon S3 上のログ構造ファイルシステムから メタデータヘッダー を読み取り、ローカルで処理を順番に再生する方法で進められ、最初の段階は 2023-07-03 01:49:49 UTC に完了した
  • 状態再構築の過程で、2014年に書かれた machine re-owned 処理の未検証ケースと、再開ロジックの初期化漏れが明らかになり、ディスクスループット制限も復旧を遅らせた
  • Tarsnap には明確な SLA はないが、公正と判断される障害にはクレジットを付与する方針に基づき、2023-07-13 にすべてのアカウントへ1か月分のストレージ料金の 50% クレジット が付与された

障害発生と初期対応

  • 2023-07-02 13:07:58 UTC ごろ、Tarsnap の中央サーバーが Amazon EC2 us-east-1 リージョンでオフラインになった
    • EC2 の状態は failed system status check だった
    • 仮想マシンでこの状態は、停電、物理サーバーのハードウェア障害、EC2 ネットワーク障害など複数の原因を示しうる
    • 同時刻に広範な EC2 障害報告は見当たらず、孤立したハードウェア障害の可能性が最も高いと見られた
  • 監視は 2023-07-02 13:10 UTC に障害を検知した
    • 別の EC2 リージョンから5分ごとにアーカイブの書き込み、読み出し、削除を実行する方式で監視していた
    • 13:10 UTC のSMS通知では起きられなかったが、13:15 UTC の電話通知で対応が始まった
    • 初期調査では明確な一時的エラーが見当たらず、システムが停止したと判断して代替 EC2 インスタンスの準備に入った

自動再起動を避けた運用方針

  • 2023-07-02 13:52 UTC ごろ、Amazon が障害サーバーを新しい EC2 インスタンス上で再起動した
    • 障害開始から約45分後だった
    • オペレーティングシステムである FreeBSD は起動したが、Tarsnap サーバーコードは自動では起動しなかった
  • 自動起動を無効にしていた理由は、予期しない再起動の後、トラフィックを受ける前に状態を人手で確認するためだった
    • 運用方針として「何かが壊れたときにデータ損失を防ぐこと」が「サービス可用性を最大化すること」より重要とされている
  • 再起動後のサーバーログには ファイルシステム破損 が記録されていた
    • 障害原因はハードウェアを停止させたか、ファイルシステムを載せた Elastic Block Store とサーバーの接続を切断したものと考えられた
    • 既存サーバーの復旧ではなく、新しいサーバーの設定を続行することにした

S3 ログ構造と復旧手順

  • Tarsnap サービスはデータを Amazon S3 に ログ構造ファイルシステム として保存している
    • 各 S3 オブジェクトは、すべてのログ項目のメタデータを含むヘッダーと、必要に応じてログ項目データを含む
    • start write transaction ログ項目は、マシンとトランザクション nonce を識別するヘッダーだけを持ち、ログデータはない
    • store data block ログ項目は、マシンとブロック名を識別するヘッダーとブロックデータをあわせて持つ
  • 正常時にはログ項目メタデータは EC2 にキャッシュされ、Amazon S3 から再読込はしない
    • Amazon S3 の読み取りは、tarsnap クライアントの要求に応答してブロックデータを読むときにのみ発生する
  • EC2 インスタンスの状態復旧は2段階に分かれる
    • まず S3 からすべての メタデータヘッダー を読む
    • その後、すべての処理をローカルで 再生(replay) する
    • ログ構造ストレージでは、データ削除時に保存領域を確保するためログ項目が再書き込みされるので、2段階を同時に実行することはできない
    • ログ項目には順序番号があり、正しい順序で再生できるが、取得後にまずソートする必要がある

復旧中に明らかになった欠陥とボトルネック

  • 最初の段階は問題なく進み、2023-07-03 01:49:49 UTC に完了した
    • 復旧プロセスは Amazon S3 に同時リクエスト 250 件を送る設定になっていた
    • この値は10年前の Amazon S3 が処理できた水準に合わせた設定で、現在なら大幅に増やせた可能性がある
  • 2番目の段階はほぼ直ちに失敗した
    • 再生されたログ項目が存在しないマシンに属するデータを記録しているというエラーが発生した
    • 原因は 2014 年に書かれたマシンのアカウント移動処理コードだった
    • Tarsnap ユーザーがマシンをアカウント間で移動する必要がある場合、新しい machine registration ログ項目を保存し、以前の項目を削除する方式が使われていた
    • テストはあったが、データが保存された状態でマシンが re-owned された後にサーバー状態を再構築するケースは漏れていた
    • 新しいマシン登録ログ項目の順序番号がより大きいため、再生過程では、まだ存在しないマシンにデータが保存されたように見えてしまった
  • 原因を特定した後、その「seatbelt」を無効化して状態再構築を再開した
    • その直後、Amazon S3 でデータを見つけられないというエラーが発生した
    • 再開時の試行で S3 データダウンロード段階をスキップした際、maximum log entry sequence number の値が初期化されず 0 のまま残っていたためだった
    • この問題を修正した後、状態再構築は正常に続行された
  • 状態再構築は必要以上に遅く進んだ
    • ディスクスループットがボトルネックだとわかっていれば、関連する EBS ボリュームのスループットをより高く設定できたはずだった
    • 睡眠不足のためプロセスを綿密に監視できず、そうでなければ gstat(8) と Amazon CloudWatch でボトルネックを確認し、EBS ボリュームを再設定できたはずだった

サービス再開とクレジット付与

  • 2023-07-03 15:10 UTC ごろ、状態再構築プロセスが完了した
    • 正確な完了時刻は記録されていない
    • サーバーを読み取り専用モードにして簡単なテストを実施した
    • 既存サーバー状態と比較し、障害時点で既存サーバーのファイルシステムが失った最後の数秒分のデータを除いて一致することを確認した
  • 障害後最初の実サービストラフィックは 2023-07-03 15:25:58 UTC に発生した
    • 障害開始から約 26時間16分 が経過した時点だった
  • Tarsnap には明確な SLA はないが、公正と思われる障害にはクレジットを提供する方針を適用している
    • 2023-07-13 にすべての Tarsnap アカウントへ1か月分のストレージ料金の 50% をクレジットとして付与した
    • 障害対応と休息の後にクレジット処理が行われた

1件のコメント

 
GN⁺ 2023-07-28
Hacker News の意見
  • この記事が HN のトップに上がるとは本当に思っていなかった。質問に答えたいが、今は夜10時で、子どもが午後5時に寝てしまったので、運がよければ子どもが起きるまでに4時間ほど眠れそう
    朝にまた確認して質問に答える

    • restic の代わりにこのサービスを使うべき理由が何なのか気になる。Colin には感謝しているが、この記事を見ると、このサービスのインフラ責任者は実質的に一人だけのように見える
      SLA がないと明確に述べているのはよいが、自分のバックアップと自分との間に大きなリスクが挟まっているように感じる
    • 今後また事後分析を書くことがあれば、もちろんほとんどないか、まったくないことを願うが、どの項目がなぜ二度と繰り返されないのかが分かるように、学んだことを明確に書いてほしい
    • 本当によく書かれた、思慮深い事後分析だが、二度とこういう記事を見ないで済むことを願う :)
    • そろそろ子どもに24時間サポートを任せる時期だ ;)
      https://www.amazon.com/No-Cry-Sleep-Solution-Toddlers-Presch...を読んで、ある程度効果が出ている。図書館、つまり本のための Blockbuster みたいな場所ならどこでも手に入る
    • トランザクションログは、再書き込みされるまでどれくらいの期間保持されるのか気になる
      ここ数週間で、私もいくつかの EC2 インスタンスが EBS から切断されたような症状で落ちており、私の場合は eu-west だった
  • 「Tarsnap には SLA はないが、公正に見える場合は障害に対してクレジットを付与する」という曖昧なポリシーに基づき、2023-07-13 に全員の Tarsnap アカウントへ1か月分のストレージ費用の50%を付与した、という部分は Percival がどんな人物かをよく示している
    このクレジットは顧客を十分に補償する方向にかなり寛大に見えるし、大手クラウドプロバイダーと違って各顧客に個別に来て懇願させることもなかった。加えて、明確で技術的かつ詳細な事後分析まであった。どこでもこうあるべきだと思う

    • 「暗闇の中の灯台でいてくれてありがとう」という表現がぴったりだ
      Tarsnap が存在し、picodollars 単位で価格設定されている世界に住んでいるのは、かなりうれしい
  • 災害復旧手順をきちんと設定し、テストしていれば、ダウンタイムははるかに短縮できたはず
    完全に別のステージングシステムを作り、停止してから再作成できるようにし、さまざまな障害モードを定期的にテストし、システム復旧の詳細な手順をすべて文書化する必要がある
    長期的には、売上を伸ばして、似たようなことが起きたときに大いに役立つパートタイム人材を雇えるかどうかも検討する価値がある
    私たちも小規模なクラウドソリューションプロバイダーで、ML API に注力しているが、クラウドハードウェアを使う場合、専用であれ仮想であれ障害は定期的に起きるということが、年を追うごとに明らかになっている。RAM、HDD、その他のハードウェア部品はいつでも故障し得るので、長期的に高可用性のオンラインサービスを運用するなら100%考慮すべきだ

  • 正直な事後分析と、難しい状況をうまく処理したことに敬意を表する。ただし睡眠不足については、問題を直せる人が一人しかいないなら、多少の追加障害時間を受け入れてでも頭をすっきりさせることを恥じる必要はない
    アラートが鳴っている中で少し寝に行くのは奇妙に感じるが、アドレナリンと睡眠不足が重なると、問題をさらに悪化させるのはあまりに簡単だ

    • 心配しなくていい。途中で何度か昼寝した。「これはうまく動いているようだが、あと数時間はかかるので、アラームを2時間後に設定して少し寝よう」と思ったことが、第2段階が不要に入出力ボトルネックにはまっていることに気づけなかった理由の一つだった
  • 説明だけを見ると、この復旧プロセスは定期的にテストするのが比較的簡単そうで、残っているバグを見つけたり復旧時間を評価したりできそうだ
    よく言われるように、テストされたバックアップだけが本物のバックアップだ

    • テストしてみて初めて自分の災害復旧プロセスが動かないことに気づいた立場として、100%同意する。実際に動く可能性がある計画は、再現可能でテスト済みの計画だけだ
    • その通り。しばらくやろうとはしていたが、いつももっと優先順位の高いことがあった。今回の障害が起きるまで、ほぼ10年間テストしていなかったことに気づいていなかった
      今後は毎年リハーサルすることを、確実に高い優先順位に置くつもりだ
  • このようなプロフェッショナルで礼儀正しく、正直な事後分析を見るのはいつでもよいものだ

  • 古いTarsnap社の情報に基づいて言っているのかもしれないが、私がTarsnapを本気で使うのをためらわせた唯一の要素は、予期せぬColin Percival障害、つまりキーパーソンリスクだった
    そう感じているのは自分だけではないと思う

    • 平均故障間隔を考える計算に似ている。可動部品が少なく、よく設計された1人会社のよく設計されたソリューションを信じるのか、それともはるかに大きな会社だが可動部品がずっと多く、おそらく設計もそれほど良くないソリューションを信じるのか、という問題だ
      個人的には、より単純な解を選ぶ。私の経験では、単純なシステムが持つ信頼性レベルに到達するには途方もない追加の複雑さが必要で、その複雑さの大半は状況を悪化させる
      サーバークラスタリングではこの点が明らかだ。安定した電源とネットワークを備えた単一サーバーは、コストと複雑さがおおむね5倍ほど増える水準に達するまでは、そのサービスを冗長化しようとするどんな試みよりも信頼できる。そこまで行ってようやく単一サーバーと同程度の平均故障間隔になり、その後になって初めて実際の改善が可能になる
      真の信頼性への最善の道は、可能な限りの単純さと良いバックアップだと強く信じている。24時間365日の可用性が必要な場合、選べる技術はかなり限られる
    • これがリスクだということは理解しているが、大企業より必ず危険だとは確信していない
      これはColinの仕事であり、Colinの名前が懸かっており、Colinにとって非常に重要なものだ
      BigBackupCorpでは同じ種類のサービスを受けるのは難しい。従業員も取り替え可能で、経営陣も取り替え可能で、率直に言えば顧客である私も、会社が方針を変えてBigFlowerArrangementShippingCorpになると決めれば取り替え可能な存在だ
      小さな事業の良いところは、完全に自分自身の利益で動いていることだ。株価いじりやVC式の小細工のようなものがない。収益性のある事業なら、誰かがやって来て買収し、自分の名前を懸けて自分の仕事にできる。オープンなインターネットはこうしたものから大きな恩恵を受けていると思う
    • Tarsnapより先に消えた競合の一覧を作ってみると、計算は少し変わるかもしれない。評価すべきリスクは「運営者に何かあったら?」ではなく、「彼に何かが起き、サービスも落ち、しかも自分がバックアップのバックアップもしていなかったら?」であるべきだ
      このリスクは慎重に計画すれば、望むだけ小さくできる
    • HNを見ているなら、Colinに問題が起きたことはおそらく24時間以内に知ることになるだろう。現実的には、新しいバックアップ提供者へ移るまでのおよそ24時間の窓の中で、主ストレージ、Tarsnap、Colinがすべて同時に失敗して初めて本当の問題になる
    • バックアップ提供者をそれ以上に信頼するつもりはない。依存した瞬間、いちばんつらい時に失敗するからだ
      Tarsnapのようなサービスは複数レイヤーの1つとして置き、多層バックアップを作って定期的に検証するほうがよい
  • 再生されたログ項目が存在しないマシンのデータを記録している、というようなエラーは、TLA+モデルを書けば捕まえられそうだ

  • restic+backblazeのような組み合わせを使えばコストが数桁下がるのに、Tarsnapを使う利点が何なのか気になる。どんな具体的な必要があればTB年あたり3000ドルを払う動機になるのか分からない

    • 私たちの中にはお金がかなり余っていて、cpercivaがひどい職場で働かず、自分の技術と才能をもっと大きく良いことに使えるよう、お金を払う口実が好きな人もいる
      バスファクターが低いのではと尋ねる人には、バックアップを1つのサービスや1つの場所だけに置くつもりではないでしょう? TarsnapとRestic+Backblaze、Rsync.net、S3などを併用するのでしょう? と言いたい。「バックアップは復旧という贅沢を享受するために払う税金」だ
    • 重複排除が非常にうまく効くので、私がTarsnapにバックアップしている非常に重要な中核データ群のコストは無視できる程度だ。データがもっと頻繁に変わるなら計算は変わると思う
      たとえば動画や写真ライブラリには別のサービスを使っているが、会計データベースや重要文書などはTarsnapにバックアップしている
      Tarsnapを10年使っているが、可用性の問題もほとんどなく、覚えている限りどんな種類の問題もほとんどなかった
  • 26時間のダウンタイムの大半はバックアップ復元に費やされたように聞こえる。奇しくも、これが私が本番環境でTarsnapを使えないまさにその理由だ
    ユーザーの立場では、バックアップ復元が苦痛なほど遅い。自分のシステムがオフラインのときに、バックアップサービスのせいで何時間も待つ忍耐はない。今は改善されているかもしれないが、最後に使った数年前には、数GBのバックアップを復元するのにおおよそ1時間単位でかかっていた