web-dev-qa-db-ja.com

本番環境で問題が発生した場合の問題の理解

シナリオ:

  • 本番にプッシュ
  • プッシュは複数のものを壊しました
  • 同じビルドでqaやdevが壊れなかった
  • 開発者は、製品にアクセスできません。
  • aboveから、物事をアジャイルに動作させるためのプレッシャーがたくさんあります。

仕様:

  • ZendでAPI駆動型のPHP/MVCアプリケーション。
  • いくつかのサーバーに展開されます。

私の質問:

調査中に、何かがおかしいと直感したとしましょう。でも、よくわかりません。そしてもちろん、実稼働環境でテストすることはできません。その直感に基づいて提案された修正がある場合、問題が何であるかを理解する前に、それを適用して動作するかどうかを確認するのが賢明でしょうか?

24
bitcycle

問題に関するできるだけ多くの情報(ログファイルなど)を取得し、運用サーバーを稼働状態にロールバックします。もちろん、これは開発者の観点から見ると苦痛ですが、おそらく当然のことです。

次に、開発環境で問題を再現できるかどうかを確認します。可能であれば、修正して、もう一度リリースしてみてください。

問題を再現できない場合は、診断を追加して1つのサーバーに短時間リリースして、問題に関する詳細情報を取得できるかどうかを確認してください。

それが不可能な場合は、本番環境とdev/qa環境の違いをさらに詳しく調べ、開発環境を本番環境に近づけてみてください。

33
Chris Card

どのようにwell問題を理解していますか?あなたの直感が物事を悪化させるリスクは何ですか?戻ってDEV/QAリージョンで問題を再現することは可能ですか? DEV/QAリージョンを同期してPRODに近づけるために何ができますか?環境設定やデータベース設定を変更したり、PRODデータをDEVにインポートしたり、デバッグ設定を変更したりする必要があるかもしれません。

一般に、私はnotが別のリージョンで本当に正しいことを確認できない限り、ソリューションの直感をPRODにプッシュすることをお勧めします。 PRODでバグが発生し、他の場所では再現できない場合に発生する問題について理解しています。そのときに、DEV/QAとPRODの間でelseが何が異なるかを確認し、それらに焦点を当てます。私の経験では、特にPRODの場合、通常は環境設定またはいくつかの構成が異なります。そして私はおそらくこれを修正するために上から多くのプレッシャーがあることを知っているので、以前のworking状態にロールバックしてから、DEVで問題を再現してみることは可能です。 DEVで修正し、then PRODで再試行しますか?それが私が提案することです。

修正の種類によって異なります。多くの場合、開発に現れない本番環境の問題は、データベースの競合に関連しています。したがって、正確に何が「そこにあるか」を確認せずにデータベースの内容を変更するバグを適用することは、大災害の最初のステップになる可能性があります。変更を簡単に元に戻すことができる場合は、試してみることができます。ただし、一般に、直接アクセスできない場合は、少なくともデータベースまたはサーバー全体のコピーをテスト用に用意する必要があります。適切な特権を持つ人々は新しいコードを実行する必要がありますが、少なくともデータ損失のリスクはありません。 (ただし、データベースのサイズやインフラストラクチャの複雑さにより、このような設定ができない場合があります)

さまざまな設定、ライブラリ、ソフトウェアのバージョンなど、多くの可能性があるため、これは本当に困難です。

たぶん、バグのソースの推測が正しかった場合に、デバッグ出力で評価するコードを最初に記述して、実際のバグ修正を適用することができます。

2

通常、コードまたはDBがProd、QA、およびdev間で同一であると想定すると、構成またはデータの問題です。

私は最初に以下を見ます:

  • コードに含まれるロギングデータ。
  • 未処理の例外がないかイベントビューアを確認してください。
  • アプリケーションの進行状況を表すデータを確認してください。DBやファイルなどにある可能性があります。意味があるかどうかはわかりません。あなたが期待しているのですか?

何が起こっているのかを理解したら、プロダクションを稼働状態にロールバックし、問題が修正されてプロダクションに再デプロイされるまで、より低い環境で問題の修正に取り組む必要があります。

あなたの環境はPHPですが、Javaについてそれをどのように考えるかについてプレゼンテーションを行いました: http://www.infoq.com/presentations/maintaining-production-Java-apps

主要な問題は同じです-状況をトラブルシューティングするために考えられるチョークポイントを理解するため:ネットワーク、ファイルシステムアクセス、ログファイル、デッドロックなど。また、適切な質問をする方法を知るために:「システムダウン」-「具体的に何をしますか意味:ウェブページが遅い、特定のエラーメッセージが表示される、タイムアウトが発生するなど」.

さらに、トラブルシューティングを容易にするいくつかのツールがあります。ネットワークのトラブルシューティングにはWiresharkが最適であり、学ぶ価値があります。その他は、使用するO/Sによって異なります。 Windowsの場合、SysInternal(現在はMicrosoftの一部)のすべてが素晴らしいです。 Unix/Linuxの場合は、truss/straceを参照してください。

本番環境へのアクセス時に、運用グループはこれらのツール/技法の使用方法を知っているか、またはそれらの使用方法を学習するために(一緒に)それらのビジネスケースを持っている必要があります。その後、問題が発生したときに実行する特定のトラブルシューティングプロトコルのセットが必要になるため、オフラインで分析を行うことができます。

短い答え:選択の余地はありません。

長い答え:問題を理解していない場合、そのようなパッチにはいくつかのリスクがあります。

  1. あなたは何か他のものを壊すかもしれず、それは再現性さえも低下するかもしれません。
  2. あなたは単にmask問題を見つけることができ、気づき、再現することを難しくします(これはさらに悪いことです)
  3. あなたは潜在的な国内の経験を捨てています-あなたをより良いプログラマーにすると同時に、あなたの会社にとってより価値のある経験(すなわち、潜在的な将来の昇給)。

一方、私はあなたの仮説修正が機能するかどうかを最初にチェックしても害はありません、そしてそれが機能するかどうか-thenより深く掘り下げて、問題を解決する実際の理由または他のおそらくより良い方法を見つけます。

0
Yam Marcovic