4

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

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

因为我还没有找到任何东西,所以我怀疑我错过了一些东西!

奥斯加尔

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 回答