2008-08-26 10 views
2

ミラーリングされたSQL Serverデータベースが2つあります。ミラーリングされたSQL Serverデータベースがフェイルオーバーしたときに通知を受け取る方法

私の最初の問題は、キーの問題です.dbのフェイルオーバー時に通知を受けることです。私はが必要です、それは鏡のように、それは(ほとんど)すべてが自動的に作業を運ぶが、それはアドバイスをすると便利だろうと私は現在、フェイルオーバーを取得していると思うときに私はそうする必要があります私はそれがいつ起こるのかを知りたいのです。

私はこれを監視するためにかなり簡単に使用できるサービスを提供しています。代替の質問は、「プリンシパルとミラーのどちらをプログラムで決定するのですか?順番にそれぞれを接続します(ほとんどは動作しますが...)。

おかげで、Murph

補遺: - 答えは、私たちはADO.NETを使用して開発しているということであり、それは持っている回答の

一つは、なぜ私はそれがフェイルオーバーしたときに知っている必要はありません問い合わせます自動フェイルオーバーのサポートは、接続文字列にFailover Partner=MIRRORSERVER(ミラーサーバーインスタンスの名前である)を追加するだけで、コードは透過的にフェイルオーバーされます。非常に少数のケース。

答えて

2

右、

2つの答えと少し考えが答えに近づいて何かに私を得ました。

まずもう少し明確化:

アプリが(2.0+)C#で書かれており、SQL Server 2005の ミラーのセットアップは、プリンシパルとミラーをホストする2台のW2K3サーバであると話をするためにADO.NETを使用している

エクスプレス・インスタンスをモニターとしてホスティングする第3のサーバーがあります。これについての良い点は、データベースを使用してアプリケーションにフェイルオーバーがすべて透過的であることですが、一部の接続ではエラーが発生しますが、根本的にすべてがうまくいくということです。はい、私たちは奇妙な偽陽性を得ていますが、全体的なポイントは、システムが騒ぎと鏡の最小量で作業を続けさせることですこれを非常にうまく提供します。

さらに、問題はサーバーの重大な障害ではありません。通常、これはもう少し明白ですが、他の理由でフェイルオーバーすると(上記の誤検出を参照)、さまざまなどのような場合でもフェイルオーバーを起こす状況を特定できるかどうかを確認することができます。

ので、上記の、単に箱の状態は非常に十分ではありません確認し、イベントログを追いかけ、おそらく過度に複雑である - それは結局のところ答えは、ある、かなりシンプル:

sp_helpserverをsp_helpserverによって返される最初の列はサーバー名です。一定の間隔で要求を実行する場合は、以前のサーバー名をに保存し、毎回比較を行い、変更がいつ発生したのかを特定し、適切な処置を取ることができます。

以下は、プリンシパルを示すコンソールアプリケーションですが、これはいくつかの作業が必要です(接続がプールされていなくても、毎回新しいものでなければなりません)が、今は十分です(したがって、 「答え」)。パラメータは、ミラー校長あり、データベース

using System; 
using System.Data.SqlClient; 

namespace FailoverMonitorConcept 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string server = args[0]; 
      string failover = args[1]; 
      string database = args[2]; 

      string connStr = string.Format("Integrated Security=SSPI;Persist Security Info=True;Data Source={0};Failover Partner={1};Packet Size=4096;Initial Catalog={2}", server, failover, database); 
      string sql = "EXEC sp_helpserver"; 

      SqlConnection dc = new SqlConnection(connStr); 
      SqlCommand cmd = new SqlCommand(sql, dc); 
      Console.WriteLine("Connection string: " + connStr); 
      Console.WriteLine("Press any key to test, press q to quit"); 

      string priorServerName = ""; 
      char key = ' '; 

      while(key.ToString().ToLower() != "q") 
      { 
       dc.Open(); 
       try 
       { 
        string serverName = cmd.ExecuteScalar() as string; 
        Console.WriteLine(DateTime.Now.ToLongTimeString() + " - Server name: " + serverName); 
        if (priorServerName == "") 
        { 
         priorServerName = serverName; 
        } 
        else if (priorServerName != serverName) 
        { 
         Console.WriteLine("***** SERVER CHANGED *****"); 
         Console.WriteLine("New server: " + serverName); 
         priorServerName = serverName; 
        } 
       } 
       catch (System.Data.SqlClient.SqlException ex) 
       { 
        Console.WriteLine("Error: " + ex.ToString()); 
       } 
       finally 
       { 
        dc.Close(); 
       } 
       key = Console.ReadKey(true).KeyChar; 

      } 

      Console.WriteLine("Finis!"); 

     } 
    } 
} 

I a)は私に実際に

を考えさせられた応答を取得)、その後、質問aとbを求めることなく、ここに到着していないだろう

Murph

1

アプリケーションにフェイルオーバーロジックがある場合は、最初の接続が失敗したときにvarに書き込むことで、接続しているボックスを示すステータス画面を作成できます。

私はあなたの最善の策は、各ボックスのステータスを定期的にチェックし、応答しない場合は電子メールを送信するpingデーモン/ cronジョブだと思います。

1

Host Monitor http://www.ks-soft.net/hostmon.eng/のようなものを使用して、電子メール/ SMS経由でアラートを送信できるフェイルオーバーイベントに関連するメッセージのイベントログを監視します。

フェイルオーバーが発生したことを知る必要はありませんが、アプリケーションのデータソースを更新して、フェイルオーバーした新しいサーバーを指すようにする必要はないので、私は不思議です。ミラーリングは、外部から単一のデバイスであるように見える複数のノードを持つクラスタリングとは異なり、異なるホスト(プライマリとミラー)で行われます。

また、プライマリからミラーに自動的にフェールオーバーするためにミラーリング監視サーバーを使用していますか?これが自動的に起こるように私が知っている唯一の方法であり、私の経験上、ネットワークのしゃっくりがミラーを欺くことができ、実際にはプライマリがダウンしていると考えることを目の当たりにする偽陽性がたくさんあります。

関連する問題