おめでとうございます、これは初めての生産事故であり、最初の T0 事故です
サーバーの事故レベルを標準化する:
- T0:非常に深刻な事故。ユーザーデータに不可逆的な損失が発生します。
- T1:深刻な事故。ユーザーデータに可逆的な損失が発生し、ops がデータを回復するためにアクセスする必要があります。または、サービスの機能が利用できなくなる状況が発生します。
- T2:一般的な事故。ユーザーデータは損失しませんが、表示異常などの表示に関する問題が存在します。
- T3:UI の異常。UI のレイアウトなどの問題により、使用に問題が発生します。
基本情報#
- 番号:0x0001
- 発生日:2021 年 04 月 17 日
- レベル:T0
プロセス#
4 月 17 日の午後、生産サーバーにログインし、yum upgrade update
コマンドを実行しました。サーバーの Docker 環境のバージョンが古すぎるため、一連の更新が必要でした。コマンドの実行後、サーバーは自動的に再起動し、対応する再起動のプロンプトは表示されませんでした。初期判断では、カーネルの更新に関連している可能性があります。更新後、サービスが復旧しないため、VNC に接続して確認すると、仮想マシンでディスクをロードできないことが判明しました。これにより、事故が発生しました。サーバーの内容はすべて損失しました。
事後、すぐにサービスプロバイダーに連絡し、損傷したディスクイメージを回復しようとしましたが、取得できず、再インストールするしかないというアドバイスを受け取りました。
奇妙なこと#
再インストール後、サービスプロバイダーから同じディスクシステムテンプレートを取得し、yum upgrade update
コマンドを再度実行しましたが、カーネルレベルの更新は発生せず、更新すら行われませんでした。したがって、この事故の根本原因はまだよくわかりません。
影響#
- サーバーには状態を持つ Miser というサービスがあり、ユーザーは私だけです。定期的なデータバックアップを行わなかったため、データは 3 ヶ月前に手動で復元したバージョンまでしか回復できませんでした。
- サービス関連のファイルは backblaze サーバーに保存されており、この事故の影響を受けませんでした。
対策#
この出来事の後、私は「製品を正式に運営する」ということについて長い間考えました。幸運なことに、Miser は始めから終わりまで私だけが使用しており、友人が何度も一緒に使用して製品の開発に参加したいと言っても、私個人のデータはそれほど貴重ではありません。しかし、ユーザーが本当にコンテンツをここに置き、それを失った場合、信頼性と信頼度は非常に低くなります。
モニタリングについて#
これまで、未処理の例外状態、つまり 5XX エラーをリアルタイムで監視するために、サービスには sentry を設置していました。しかし、実際の運営中には、CPU が突然高くなったり、メモリが急に不足したりするなど、さまざまな奇妙な問題に遭遇しました。
伸縮自在なクラウドではなく、従来の仮想マシンを使用しているため、CPU やメモリなどのシステムレベルの監視もスケジュールに組み込む必要があります。つまり、完全なセットの Prometheus + Grafana の基本的な組み合わせを本番環境に展開する必要があります。
可用性とバックアップについて#
奇妙な話ですが、実際には数ヶ月、半年近く生産サーバーに手を触れていませんでした。基本的には GitHub Actions を使用して完全な CI/CD パイプラインを実現していました。今回、サーバーに手動でログインした理由は、バックアップサービスを展開するためでしたが、この操作が事故の発生の原因となりました。生疎になった可能性もあります。
サービスプロバイダーは私に非常に良いアドバイスをくれました。私の操作には明らかに大きな問題がありました。彼は次のように言いました。「彼が来た場合、まずディスクのスナップショットを撮り、操作を実行し、問題がなければすべてがうまくいきます。問題があれば、スナップショットを使用してディスク全体を復元します。」
確かに、私はこの回にドライランを行っていませんでした。毎回、直接 docker ポッドレベルの操作を実行し、問題が発生した場合は直接 rm してしまいました。今回はホストマシンでの操作が不足していました。
したがって、
- ホストマシンへの直接的な操作を減らし、Docker クラスタを構築した後はすべて Docker レベルで操作する必要があります。
- バックアップサービスの優先度を最高にする必要があります。データは最も重要です。
- ドライランの信頼性について、本番環境に対応する dev または uat 環境の必要性を考える必要があります。