Сведения о вопросе

Oleksandrop

06:23, 10th August, 2020

Теги

sql-server    

Как я могу получить уведомление, когда зеркальная база данных сервера SQL вышла из строя

Просмотров: 414   Ответов: 3

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

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

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

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

Дополнение:

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



  Сведения об ответе

PHPH

03:08, 27th August, 2020

Правильно,

Эти два ответа и небольшая мысль привели меня к чему-то, что приближалось к ответу.

Сначала немного больше разъяснений:

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

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

Таким образом, учитывая вышесказанное, просто проверить состояние ящиков недостаточно, а прогон через журнал событий, вероятно, слишком сложен - ответ, как выясняется, довольно прост: sp_helpserver

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

Ниже приведено консольное приложение, которое демонстрирует Принципал-хотя он и нуждается в некоторой работе (например, соединение должно быть не объединенным в пул и новым каждый раз), но его достаточно на данный момент (поэтому я бы тогда принял это как "the" ответ"). Параметры: основной, зеркальный, база данных

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!");

        }
    }
}

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

Мерф


  Сведения об ответе

pumpa

22:59, 14th August, 2020

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

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


  Сведения об ответе

PHPH

21:38, 26th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться