4

フェールオーバー クラスター APIを使用してアプリケーション/Web アプリケーションを "クラスター対応" にする方法に関するリソースを Web で参照しました。多くの技術記事を見つけましたが、プログラマーの観点から書かれた記事はありませんでした。プログラマーの観点からアプリケーションをクラスター対応にする方法について、誰かが良いリンクを持っているか、コードサンプルやその他の情報を提供してくれますか? 主要なプログラミング言語として C# を使用しています。

クラスタは、IIS を実行する 2 つのノード (Windows 2003 Server) を含むアクティブ/パッシブ クラスタです。

何も見つからないので、何かが足りないのではないかと疑っています!

Br

オースガー

4

2 に答える 2

1

これについて運が良かったですか?

私は同じ情報を追いかけていますか?

アプリケーションにSQLクラスター上にデータベースが存在するシナリオ。クラスタがフェールオーバーを実行すると、SQL接続プールが無効になり破損します。接続プールは、例外を表示せずにフラッシュして再作成する必要があります。

コードの観点から、最初に行う必要があります。

  1. SQLクエリを接続プールに送信します。
  2. 無効なSQL接続プールの使用から例外をキャプチャします。
  3. 接続プールをフラッシュするか、プールで接続が使用できなくなるまですべての接続を繰り返します。
  4. 新しい接続プールを再作成します。
  5. SQLクエリを再送信します。

私の問題は、私がインフラストラクチャアーキテクトであり、コーディングスキルが最高のときに弱いことです。

于 2010-11-17T02:45:13.950 に答える
0

遊んでいて、同僚の助けを借りて、例として次のことを考え出しました。

static void Main(string[] args)
    {
        Boolean PrevSqlError = false;
        Boolean NewSqlPool = false;
        String ConStr = "Data Source=SQL-CLUSTER1;Initial Catalog=Example;Integrated Security=True;Connection Timeout=60;Min pool size=5";
        Console.WriteLine("Press any key to read from database");
        Console.ReadKey();
        while (true)
        {
            try
            {
                Console.WriteLine("Attempting to connect");

                using (var context1 = new ExampleDataContext())
                {
                    var customers1 = context1.Customers.ToList();
                    var connection1 = new SqlConnection(ConStr);
                    connection1.Open();
                    PrintCustomers(customers1);
                    connection1.Close();
                }
                PrevSqlError = false;
                NewSqlPool = false;
                Console.WriteLine("Sleeping 3s");
                Thread.Sleep(3000);
            }
            catch (SqlException sqlException)
            {
                var SqlError = sqlException.Number;
                Console.WriteLine("Error connecting to SQL : " + SqlError+" : "+sqlException.Message);
                if (NewSqlPool == true)
                {
                    Console.WriteLine("Error in New Connection Pool. Exiting!");
                    Thread.Sleep(10000);
                    return;
                }
                if (PrevSqlError == true)
                {
                    if (SqlError == 10054 || SqlError == 232 || SqlError == 233 || SqlError == 64 || SqlError == 4060)
                    {
                        Console.WriteLine("SQL Cluster Failing Over. Waiting 5s");
                        SqlConnection.ClearAllPools();
                        PrevSqlError = false;
                        NewSqlPool = true;
                        Thread.Sleep(5000);
                    }
                    else
                    {
                        Console.WriteLine("Fatal SQL Exception. Exiting!");
                        Thread.Sleep(10000);
                        return;
                    }
                }
                else
                {
                Console.WriteLine("SQL Error, Retrying in 3s");
                PrevSqlError = true;
                Thread.Sleep(3000);
                }
            }
        }
    }

    private static void PrintCustomers(List<Customer> customers)
    {
        foreach (var item in customers)
        {
            Console.WriteLine(string.Format("{0} - {1}", item.Id, item.Name));
        }
    }
于 2010-11-25T02:38:54.213 に答える