7

Windows サーバー マシンでスタンドアロンの Windows サービスを実行しているとします。可用性が高いことを確認する方法は?

1)。提案できる設計レベルのガイドラインをすべて教えてください。

2)。プライマリ/セカンダリのように高可用性を実現する方法 (現在市場で入手可能なクラスタリング ソリューションなど)

3)。フェールオーバー シナリオが発生した場合の横断的な問題への対処方法

他に考えられることがあれば、ここに追加してください..

注: 質問は Windows と Windows サービスにのみ関連しています。この規則に従うようにしてください :)

4

3 に答える 3

5

サービスを少なくとも実行し続けるために、Windowsサービスマネージャーがクラッシュした場合にサービスを自動的に再起動するように調整できます(サービスプロパティの[回復]タブを参照)。これらのプロパティを設定するバッチスクリプトなど、詳細については、こちらをご覧ください-再起動クラッシュした場合のWindowsサービス

高可用性とは、サービスを外部から維持するだけではありません。サービス自体は、高可用性を念頭に置いて構築する必要があります(つまり、全体で優れたプログラミングプラクティスを使用し、適切なデータ構造を使用し、リソースの取得と解放をペアにします)。予想される負荷の下で稼働し続けることを確認するためにテストされました。

べき等コマンドの場合、コマンドを特定の回数再起動することで、断続的な障害(リソースのロックなど)を許容できます。これにより、サービスはクライアントを障害から保護できます(ある程度まで)。クライアントは、障害を予測するようにコーディングする必要もあります。クライアントはいくつかの方法でサービスの失敗を処理できます-ロギング、ユーザーへのプロンプト、X回の再試行、致命的なエラーのロギング、終了はすべて可能なハンドラーです-どちらが適切かは要件によって異なります。サービスに「会話状態」がある場合、サービスがハードに失敗したとき(つまり、プロセスが再開されたとき)、クライアントはこの状況を認識して処理する必要があります。これは通常、現在の会話状態が失われたことを意味します。

単一のマシンはハードウェア障害に対して脆弱になるため、単一のマシンを使用する場合は、冗長コンポーネントがあることを確認してください。HDDは特に障害が発生しやすいため、少なくともミラーリングされたドライブまたはRAIDアレイを用意してください。PSUは次の弱点であるため、UPSと同様に冗長PSUも価値があります。

クラスタリングに関しては、Windowsはサービスクラスタリングをサポートし、個々のコンピューター名ではなくネットワーク名を使用してサービスを管理します。これにより、クライアントは、ハードコードされた名前ではなく、サービスを実行している任意のマシンに接続できます。ただし、追加の対策を講じない限り、これはリソースフェイルオーバーです。つまり、サービスの1つのインスタンスから別のインスタンスにリクエストを送信します。通常、会話状態は失われます。サービスがデータベースに書き込んでいる場合は、それもクラスター化して、信頼性を確保し、ローカルノードだけでなくクラスター全体で変更を利用できるようにする必要があります。

これは実際には氷山の一角にすぎませんが、さらなる研究を始めるためのアイデアが得られることを願っています。

Microsoft Clustering Service(MSCS)

于 2010-05-06T12:59:25.550 に答える
0

サービスがクライアント接続用のインターフェイスを公開しない場合は、次のことができます。

  • 「私は生きています」メッセージをブロードキャストまたは公開するか、データベース/レジストリ/TCP/あなたが生きていることを知らせます

  • これらの「I'm alive」シグナルをチェックする 2 つ目のサービス (モニター) を用意し、ダウンした場合にサービスを再起動しようとします。

ただし、namedpipes/tcp/etc を介してこのサービスに接続しているクライアントがある場合、クライアントは、データベースでサービスが実行されているマシンのアドレスを確認するか、トラフィックをリダイレクトするためのインテリジェント スイッチのような手の込んだものを用意する必要があります。

于 2010-05-06T11:27:00.530 に答える
0

解決しようとしている問題を分解すると、おそらく自分でいくつかの答えを思いつくと思います。ジャスティンがコメントで述べたように、答えは 1 つではありません。それは、サービスの機能とクライアントの使用方法に完全に依存します。また、クライアントとサーバーの対話性に関する詳細も指定しません。HTTP? TCP? UDP? 他の?

ここでは、作業を開始するために考慮すべき事項をいくつか示します。

1) サービスまたはサーバーがダウンした場合はどうしますか?

  • サービスの複数のインスタンスを別々のサーバーで実行するのはどうですか?

2) わかりました。では、クライアントは複数のサービスについてどのように認識していますか?

  • リストを各クライアントにハードコーディングできます (非推奨)
  • DNS ラウンドロビンを使用して、それらすべてにリクエストをバウンスできます。
  • 負荷分散デバイスを使用できます。
  • 他のすべてのサービスを認識し、クライアントを利用可能なサービスに誘導できる別のサービスを用意できます。

3) では、1 つのサービスがダウンした場合はどうなるでしょうか。

  • クライアント アプリケーションは、接続先のサービスがダウンした場合に何をすべきかを認識していますか? そうでない場合は、その状況を処理するために更新する必要があります。

これで、高可用性を開始する方法の基本的な考え方を理解できるはずです。アーキテクチャに関する特定の詳細を提供すると、おそらくより良い応答が得られます。

于 2010-05-05T02:58:06.247 に答える