稼働中の忙しい Web サイトを可能な限り丁寧な方法で更新するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/67368

質問

ライブ Web サイトに変更をロールアウトするとき、どのようにして、 ライブ システムは正しく動作していますか?どのツールを使用しますか?誰がやるの?テスト期間中はサイトへのアクセスをブロックしますか?どのくらいのダウンタイムが許容されますか?

役に立ちましたか?

解決

私はすべてのテストを別の環境 (実際の環境ではなく) で行うことが多いです。これにより、コードが正常に動作するはずであることを認識しながら更新をライブ サイトにプッシュできるようになり、ライブ データに対して健全性テストを実行するだけで、どこかにファイルを忘れていないか、何かおかしな問題が発生していないかを確認できます。

したがって、テスト環境またはステージング環境で適切にテストし、その後は単純な健全性チェックを行うだけです。ダウンタイムの必要はありません。

他のヒント

すでにたくさんの良いアドバイスがあります。

人々が言及したように、単一のポイントが関与していない場合は、アプリ サーバーを一度にアップグレードすることで変更を段階的に導入するのが簡単です。しかし、そんなことはめったにないので、それは無視して、難しい部分に集中しましょう。

通常、そこには他のすべてに共通のデータベースがあります。つまり、システム全体のダウンタイムが発生することになります。 それを最小限に抑えるにはどうすればよいですか?

オートメーション. 。導入手順全体のスクリプトを作成します。これには (特に) データベース スキーマの変更が含まれます。これには (特に)、スキーマのバージョン間で必要なデータ移行が含まれます。

品質管理. 。テストがあることを確認してください。自動化された受け入れテスト (ビジネス ロジック/エクスペリエンスの観点からユーザーが何を見て期待しているか)。実稼働システムにテスト アカウントを用意し、読み取り専用アクティビティをテストするためのスクリプトを作成することを検討してください。他の外部システムと対話しない場合は、書き込みアクティビティも実行することを検討してください。システムの特定の部分、特に金銭や会計を扱う場合、テスト アカウントのアクティビティをフィルタリングする必要がある場合があります。豆が一致しない場合、豆カウンターは正当な理由があって腹を立てます。

リハーサルをする. 。本番環境と可能な限り同一のステージング環境にデプロイします。これを実稼働データのボリュームと実稼働データで実行します。テーブルの変更にどれくらい時間がかかるかを感じる必要があります。また、変更テーブルが構造的に機能することと、実際のデータ内のすべての外部キーに対して機能することを確認する必要があります。

大量のデータがある場合、スキーマの変更には時間がかかります。もしかしたら、落ち込んでいる余裕のない時間の方が長いかもしれません。1 つの解決策は、 段階的なデータ移行, そのため、ダウンタイム中にスキーマ変更には「最近」または「現在」(たとえば 1 か月または 3 か月前) のデータが入力され、再びオンラインになった後に残りの 5 年間のデータが少しずつ入ってくる可能性があります。エンド ユーザーにとっては問題がないように見えますが、一部の機能はさらに数時間、数日間アクセスできなくなります。

職場では、テスト環境でコードをフリーズしたまま一定期間過ごします。その後、数週間の通知の後、金曜日の夜深夜にサイトを停止し、徹夜で展開と検証を行い、土曜日の朝遅くにサイトを立ち上げます。トラフィック統計により、これが最適な時間枠であることがわかりました。

負荷分散された一連のサーバーがある場合は、1 台ずつ個別にオフラインにして更新できます。ユーザーにダウンタイムはありません!

可愛くて不安を和らげる画像やバックアップ ページを用意してください。一部のサイトでは、更新を待つ間忙しくするために、単純な JavaScript ゲームを実装しています。

たとえば失敗クジラ。

-アダム

私が最後に働いていた職場では、QA は QA 環境でテストを実行していました。重大な問題はすべて、展開前に修正、テスト、検証されます。

ビルドが QA によって認定された後、実稼働サポート チームはコードをステージング環境にプッシュし、そこでクライアントがサイトを見て、すべてが期待通りであることを確認します。

実際の運用ロールアウトは、営業時間外 (午後 9 時以降) に行われます。緊急の夜間プッシュの場合、または午前 5 時から- 午前8時。通常スケジュールされたロールアウトの場合)。

サイトは複数のサーバーでホストされており、F5 ロード バランサーを使用して負荷分散されています。

  • いくつかのサーバーが運用環境から削除され、
  • コードがインストールされており、
  • サーバーをプールに戻す前に、サーバー上で大まかなチェックが実行されます。

これは、すべてのサーバーが最新のコードにアップグレードされ、サイトが常に稼働し続けるまで繰り返されます。

このプロセスは理想的ですが、データベースもアップグレードする必要がある場合があります。この場合、新しいデータベースがサイトを破壊するかどうかに応じて、2 つのオプションがあります。

新しいデータベースが既存のフロントエンドと互換性がない場合は、サイトがダウンする時間を設ける以外に選択肢はありません。

ただし、新しいデータベースが既存のフロントエンドと互換性がある場合は、実際のダウンタイムなしでコードをプッシュできますが、これには 2 台の実稼働データベース サーバーが必要です。

  • すべてのトラフィックは 2 番目の DB にルーティングされ、最初の DB サーバーがプルされます。
  • 最初の DB がアップグレードされ、検証が完了した後、運用環境に戻ります。
  • すべてのトラフィックは最初の DB にルーティングされ、2 番目の DB がプルされます。
  • 2 番目の DB がアップグレードされ、検証が完了した後、運用環境に戻ります。
  • 次のステップでは、上で説明したように部分的なアップグレードを実行します。

要約すると次のようになります。

  • ライブ Web サイトに変更を展開するとき、ライブ システムが正しく動作していることをどのように確認しますか? 最良の場合、これは段階的に行われます。

  • どのツールを使用しますか? 自動化ツールを使用して、コードが正しくインストールされていることを確認する手動チェックと、いくつかの基本的な自動テストを行います。Selenium IDEを使用しました。

  • 誰がやるの? DBA は DB のアップグレードを実行し、テクニカル サポート/システム管理者はサーバーのプッシュ/プルとコードのインストールを行い、QA または運用サポートは手動テストや自動テストを実行します。

  • テスト期間中はサイトへのアクセスをブロックしますか? 可能であれば、これは特に、先ほどジルが述べたように、有料サイトの場合は絶対に避けるべきです。

  • どのくらいのダウンタイムが許容されますか? ダウンタイムは、ユーザーがサイトを使用する可能性が最も低い時間に限定し、3 時間以内に完了する必要があります。
    注記: 3時間はとてもたっぷりです。jplindstrom 氏が述べたように、練習とリハーサルの後、チームはプロセス全体を完了し、場合によっては 1 時間以内に出入りできるようになります。

お役に立てれば!

その一部は、データベースを更新するかどうかにも依存します。以前は、DB が更新されている場合、計画された (および公開された) メンテナンス期間中サイトをダウンしました。通常は、影響が最小限に抑えられる時間外に行われました。更新に DB が関与しない場合は、負荷分散された環境で、混合から 1 つのボックスを取り出し、デプロイしてテストします。それが成功した場合、それはミックスに加えられ、他のボックス (2 つのボックスを想定) が持ち出され、更新/テストされました。

注記:コードをテストしているわけではありません。ただ、展開がスムーズに進んだため、ダウンタイムが最小限に抑えられただけです。前述したように、コードは別の環境でのテストにすでに合格している必要があります。

私の意見では、無料サイトでは長いダウンタイム (時間) は許容されます。ユーザーを十分に教育すれば、それが必要なことであることを理解してくれるでしょう。ウェブサイトが復旧するまで、彼らに何か遊べるものを与えるかもしれません(例:フラッシュ ゲーム、開発チームの作業を映すウェブカメラのライブ フィードなど)。人々がお金を払ってアクセスする Web サイトの場合、定期的にダウンタイムを与えてしまうと、多くの人が苦情を言って時間を無駄にすることになります。ユーザーに料金を請求するサービスを運営している場合は、疫病のようなダウンタイムを避け、非常にゆっくりと慎重にアップデートを展開するでしょう。

現在の設定では、変更をテストするために、ライブ コピーと同じデータベースとキャッシュに接続されたセカンダリ Web サイトがあります。

また、正規表現を使用して、Web サイトが主要なページを適切にレンダリングしていることをチェックする cron ジョブで実行されているいくつかの「ページ ウォッチャー」スクリプトもあります。

答えは「状況による」です。まず第一に、リリースする環境の種類についてです。それはどこかの共有ホスト上の「hello, world」タイプの Web サイトですか、それとも 500 万台のサーバーを備えた google.com ですか?通常、ユーザーは 1 日に 1 人ですか、それとも数百万人くらいですか?HTML/CSS/JPG を公開していますか? それとも、SQL サーバー、中間層サーバー、分散キャッシュなどを備えた巨大なバックエンドがありますか?

一般に、開発、QA、ステージング、実稼働用に個別の環境を用意する余裕がある場合は、それらの環境を用意します。リソースがある場合は、エコシステムを作成して、1 回のクリックで完全なインストール可能なパッケージを構築できるようにします。そしてそれを確認してください 同じ バイナリ インストールは、もう一度クリックするだけで DEV/QA/STAGE/PROD に正常にインストールできます...このテーマに関してはたくさんのことが書かれており、適切な答えを得るには質問をより具体的にする必要があります

メインサーバーを 80 以外のポートで実行します。軽量サーバーを固定します (例:nginx) をポート 80 の前に置きます。サイトを更新するときは、新しいポートで別のインスタンスを起動します。テスト。正しくデプロイされたことに満足したら、プロキシ構成ファイルを編集し、再起動します。nginx の場合、これによりダウンタイムやリクエストの失敗がゼロになり、より一般的な Apache のみのホスティング オプションと比べてパフォーマンスも向上します。

もちろん、これは適切なステージング サーバーの代わりになるものではなく、限られたリソースでハンドオーバーを実行するための「丁寧な」方法にすぎません。

ライブになる前に別の開発サイトで可能な限りすべてをテストするために、セレン(Webページテスター)を使用してサイトのすべての航行可能な部分を実行し、ダミー値をフォームに記入し、それらの値が右に表示されることを確認します結果としての場所など。

多くのJavaScriptやダイナミックなものをチェックするのに十分なほど強力です。

次に、ライブサイトをアップグレードした後に再びセレンとのクイックランスルーが、アップデートが機能したことを確認し、リンクやデータベースエラーが欠落していることを確認します。

手動でフリックするだけで見逃していたであろう微妙なエラーをキャッチすることで、数回節約されました。

また、ライブサイトをある種の「リバースプロキシ」またはロードバランサー(大きい場合)の後ろに配置すると、問題がある場合は以前のバージョンに簡単に切り替えることができます。

ユーザーに対して透過的にする唯一の方法は、負荷分散されたプロキシの背後に配置することです。別のサーバーを更新している間に、1 つのサーバーを停止します。次に、更新が完了したら、更新したものをオンラインに置き、もう一方を削除します。それが私たちのやり方です。

何らかの「ベータ」ビルドがある場合は、それをライブサーバー上で展開しないでください。「活発で忙しいサイト」がある場合、人々がそこを激しく攻撃して何かを壊す可能性があります。

これは一般的な高可用性セットアップであり、高可用性を維持するには、少なくとも 3 台のサーバーが必要です。2 つのライブサーバーと 1 つのテストサーバー。さらに、専用の DB などを使用したい場合は、その他の追加サーバーも必要です。

ホスト クラスを作成し、そのホスト クラスにライブ サイトをデプロイします。ホスト クラスとは、ロード バランシングが設定されており、クラスへのホストの追加や削除が簡単にできるホストのセットを意味します。

ベータ テストが完了し、実稼働の準備ができたら、サイトをダウンする必要はありません。実稼働ホスト クラスから一部のホストを削除し、新しいホスト クラスに追加して、そこに最新のコードをデプロイして適切にテストするだけです。すべてが正常に動作していることを確認したら、すべてのホストを徐々に新しいホストに移動し、新しいホスト クラスを運用ホスト クラスとして指定します。または、最初に使用していたものを使用することもできます。このアクティビティの背後にある全体的な考え方は、デプロイの問題は恐ろしくデバッグが難しいため、デプロイメント後にサイトが実行される運用環境でデプロイメントをテストしていることを確認することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top