关于如何使应用程序“群集感知”的建议/代码示例

时间:2010-02-23 10:04:51

标签: c# cluster-computing failover

我在网上浏览了有关如何使用Cluster Aware制作应用程序/网络应用程序“Failover Cluster API”的资源。我找到了很多技术文章,但没有从程序员的角度编写。是否有人有任何良好的链接或可以提供代码示例或一些其他输入如何从程序员的角度制作应用程序群集感知?我们使用C#作为我们的主要编程语言。

群集是主动/被动群集,包含两个运行IIS的节点(Windows 2003 Server)。

因为我还没发现任何我怀疑我遗失的东西!

Ausgar

2 个答案:

答案 0 :(得分:1)

你有运气吗?

我正在追逐相同的信息?

在应用程序具有驻留在SQL群集上的数据库的情况下。当群集执行故障转移时,SQL连接池将变为无效并损坏。需要刷新和重新创建连接池,而不会出现异常。

从代码的角度来看,你需要先。

  1. 将SQL查询提交到连接池。
  2. 使用无效的SQL连接池捕获异常。
  3. 刷新连接池或遍历所有连接,直到池没有连接可用。
  4. 重新创建新的连接池。
  5. 重新提交SQL查询。
  6. 我的问题是我是一名基础架构师,而且我的编码技能在最好的时候都很弱。

答案 1 :(得分: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));
        }
    }