Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как я могу получить уведомление, когда зеркальная база данных сервера SQL вышла из строя
У нас есть несколько зеркальных баз данных сервера SQL.
Моя первая проблема-ключевая проблема - это получить уведомление, когда db выходит из строя. Мне не нужно знать, потому что, ЭМ, его зеркальное отражение, и поэтому он (почти) все продолжает работать автоматически, но было бы полезно получить совет, и в настоящее время я получаю отказы, когда я не думаю, что должен быть, поэтому он хочет знать, когда они происходят (без слишком большого рытья), чтобы увидеть, могу ли я определить, почему.
У меня есть запущенные службы, которые я мог бы довольно легко использовать для мониторинга этого-поэтому альтернативный вопрос будет "как программно определить, какой из них является основным, а какой - зеркалом" - предпочтительно более разумным способом, чем просто попытка подключения каждого по очереди (что в основном будет работать, но...).
Спасибо, Мерф
Дополнение:
Один из ответов спрашивает, Почему мне не нужно знать, когда он выходит из строя - ответ заключается в том, что мы разрабатываем с использованием ADO.NET и что имеет автоматическую поддержку failover, все, что вам нужно сделать, это добавить Failover Partner=MIRRORSERVER (где MIRRORSERVER - это имя вашего экземпляра зеркального сервера) в строку подключения, и ваш код будет работать прозрачно-вы можете получить некоторые ошибки в зависимости от того, какие соединения активны, но в нашем случае очень мало.
Правильно,
Эти два ответа и небольшая мысль привели меня к чему-то, что приближалось к ответу.
Сначала немного больше разъяснений:
Приложение написано на 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!");
}
}
}
Я бы не приехал сюда, если бы а) не задал вопрос, а затем б) не получил ответы, которые заставили меня действительно задуматься
Мерф
Если логика failover присутствует в вашем приложении, вы можете написать экран состояния, который показывает, какое окно вы подключили, записав в var, когда первая попытка подключения завершается неудачей.
Я думаю, что лучше всего было бы использовать работу ping daemon/cron, которая периодически проверяет состояние каждого ящика и отправляет email, если тот не отвечает.
Используйте что-то вроде Host Monitor http://www.ks-soft.net/hostmon.eng/ , чтобы отслеживать журнал событий для сообщений, связанных с событием failover, которое может отправить вам предупреждение через email/SMS.
Мне любопытно, однако, как вам не нужно было бы знать, что failover произошло, потому что вам не нужно было бы затем обновить источники данных в ваших приложениях, чтобы указать на новый сервер, на который вы перешли? Зеркальное отображение происходит на разных хостах (первичном и зеркальном), в отличие от кластеризации, которая имеет несколько узлов, которые кажутся одним устройством извне.
Кроме того, вы используете сервер-свидетель для автоматического переключения с основного сервера на зеркальный? Это единственный известный мне способ сделать так, чтобы это произошло автоматически, и по моему опыту, вы получаете много ложных срабатываний, когда сетевая икота может обмануть зеркало и свидетеля, заставив их думать, что первичная отключена, когда на самом деле это не так.