Как получить уведомление о сбое зеркальной базы данных SQL Server - PullRequest
2 голосов
/ 26 августа 2008

У нас есть несколько зеркальных баз данных SQL Server.

Моя первая проблема - ключевая проблема - это получить уведомление при сбое БД. Мне не нужно знать , потому что, ну, он зеркальный, и поэтому он (почти) все работает автоматически, но было бы полезно получить совет, и в настоящее время я получаю отказы, когда не думаю, Я должен быть таким, чтобы он хотел знать, когда они происходят (не слишком много копая), чтобы посмотреть, смогу ли я определить, почему.

У меня есть запущенные сервисы, которые я мог бы довольно легко использовать для мониторинга этого, поэтому альтернативный вопрос был бы «Как программно определить, кто является главным, а какой является зеркалом» - предпочтительно более разумным способом, чем просто пытаться соединяйте каждый по очереди (что будет работать, но ...).

Спасибо, Мерф

Приложение:

Один из ответов на вопросы, почему мне не нужно знать, когда происходит сбой - ответ заключается в том, что мы разрабатываем с использованием ADO.NET, и в нем есть поддержка автоматического перехода на другой ресурс, все, что вам нужно сделать, это добавить Failover Partner=MIRRORSERVER (где MIRRORSERVER - это имя экземпляра вашего зеркального сервера) к строке подключения, и ваш код прозрачно переключается при сбое - вы можете получить некоторые ошибки в зависимости от того, какие подключения активны, но в нашем случае очень мало.

Ответы [ 3 ]

2 голосов
/ 01 сентября 2008

Право,

Два ответа и небольшая мысль привели меня к чему-то приближающемуся к ответу.

Сначала немного больше уточнений:

Приложение написано на C # (2.0+) и использует ADO.NET для общения с SQL Server 2005. Установка зеркала - это два сервера W2k3, на которых размещаются основной сервер и зеркало, а также третий сервер, на котором в качестве монитора используется экспресс-экземпляр. Хорошая вещь об этом - отказоустойчивость почти прозрачна для приложения, использующего базу данных, это вызовет ошибку для некоторых соединений, но в основном все будет работать хорошо. Да, мы получаем странный ложный положительный результат, но суть в том, чтобы система продолжала работать с наименьшим количеством шума и зеркал действительно доставляет это очень хорошо.

Кроме того, проблема не в серьезном сбое сервера - обычно это немного более очевидно, а в случае сбоя по другим причинам (см. Ложные срабатывания выше), поскольку у нас есть пара вещей, которые по разным причинам не могут , при сбое и в любом случае, чтобы мы могли увидеть, можем ли мы определить обстоятельства, при которых мы получаем ложные срабатывания.

Итак, учитывая вышесказанное, просто проверить состояние ящиков недостаточно, а погоня за журналом событий, вероятно, слишком сложна - ответ, как оказалось, довольно прост: 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!");

        }
    }
}

Я бы не приехал сюда, если бы а) не задал вопрос, а затем б) не получил ответов, которые заставили меня на самом деле подумать

Murph

1 голос
/ 27 августа 2008

Используйте что-то вроде Host Monitor http://www.ks -soft.net / hostmon.eng / для мониторинга журнала событий на наличие сообщений, связанных с событием аварийного переключения, который может отправить вам предупреждение по электронной почте / SMS.

Мне любопытно, как вам не нужно знать, что переход на другой ресурс произошел, потому что вам не нужно обновлять источники данных в ваших приложениях, чтобы они указывали на новый сервер, на котором вы переключились? Зеркальное отображение выполняется на разных хостах (основном и зеркале), в отличие от кластеризации, в которой несколько узлов выглядят как одно устройство извне.

Кроме того, используете ли вы следящий сервер для автоматического переключения с основного на зеркало? Это единственный известный мне способ заставить это произойти автоматически, и, по моему опыту, вы получаете много ложных срабатываний, когда сбои в работе сети могут обмануть зеркало и засвидетельствовать, что первичная сеть не работает, хотя на самом деле это не так.

1 голос
/ 27 августа 2008

Если в вашем приложении есть логика отработки отказа, вы можете написать экран состояния, показывающий, к какому ящику вы подключились, записав в var, если первая попытка подключения не удалась.

Я думаю, что вашей лучшей ставкой будет задание ping daemon / cron, которое периодически проверяет состояние каждого ящика и отправляет электронное письмо, если оно не отвечает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...