Значимость отказоустойчивости почты в последнее время выросла в нашей организации и мы задались вопросом, как организовать бесперебойную работу пользователей и исключить потерю данных.
На данный момент мы используем Exchange 2007 без кластера.
Схема восстановления Dial Tone, клиенты Outlook 2003.
Пробовал SCR (Standby Continuous Replication) и понял что это очень опасная и по сути бесполезная вещь, т.к. она работает по принципу, если тебе очень повезет, то ты возможно восстановишь сервер на резервной реплике. Многократно пробовали настроить SCR, она встает все тесты говорят все ОК, но когда реально переключаешься, говорит что битая база. Периодически оно просто слетает и начинает гнать, но ты об этом узнаешь только когда поймешь, что переключаться не на что. SCR работает только на мелких тестовых базах, на реальных данных работает крайне не надежно. Также есть потеря данных т.к. передача логов асинхронная.
Стали думать про кластер.
Делать кластер с единым хранилищем дорого и опять же ненадежно, т.к. есть единственная точка сбоя (собственно единое хранилище).
CCR — вроде подходит, но поскольку уже есть новая версия Exchange 2010 DAG, которая по сути есть улучшенный CCR, то решили тестировать его.
Создал я тестовую среду из 7 виртуальных машин, поставил Exchange 2010 в организацию Exchange 2007, настроил DAG и провел тест на потерю данных.
Схема тестовой среды:
DC1 — контроллер домена Win2003SP2
EX1 — Почтовик Exchange 2007 (все роли)
E14-S1 — Exch2010 CA,HT,UM (SP1+RU1)
E14-S2 — Exch2010 CA,HT,UM (SP1+RU1)
E14-MB1 — Exch2010 MB (SP1+RU1)
E14-MB1 — Exch2010 MB (SP1+RU1)
WinXP — Outlook 2003
DAG (E14-MB1, E14-MB2), активная база на E14-MB1
Тест:1. Перевел Outlook в автономный режим и отправил 8 нумерованных сообщений с вложением 4Мб на ящик в той же почтовой базе.
2. Вывел Outlook из автономного режима, после того как ушло 1-ое сообщение и начало передаваться второе, выключил сеть на E14-MB1, вернулся на XP и вижу, что 2-е сообщение ушло и передается 3-е, ждал 15 минут, убедился что на серверах уже произошло переключение на пассивную реплику (на это ему потребовалось 3—5 минут), но Outlook завис на передаче 3-го сообщения.
3. Перезапустил Outlook, сообщения ушли.
4. Захожу в ящик получателя и вижу что получены сообщения в следующем порядке
3, 4, 5, 6, 7, 8, 1
второго сообщения нет
5. Ни отправитель ни получатель не получили никаких уведомлений о недоставке сообщения N 2. В логах HT отсутствует даже упоминание про это сообщение.
Анализ теста:В теории на Exchange 2010 передача сообщения в рамках одного сайта происходит следующим образом:
Outlook (MAPI)- > CA — > HT — > MB
(корректировка от 29.12.2010 Outlook — > CA — > MB — > HT — >MB)
DAG является кластером без единого хранилища, данные реплицируются с активной копии на пассивные асинхронно. Чтобы исключить потерю данных при переключении, используется механизм задержки сообщений на HT пока не придет ОК со всех пассивных реплик. В случае переключения, сообщения не получившие статус (реплицировано для новой пассивной копии) передаются на новую активную базу.
В теории все вроде идеально, но попробуем разобраться, что произошло в моем тесте сопоставив факты:
Факт 1: Сообщение N 2 было передано на CA это зафиксировал Outlook.
Факт 2: В логах HT, нет упоминания о получении сообщения N 2
Факт1 + Факт2 — > Сообщение не было передано с CA на HT, несмотря на то что они находятся на одном сервере.
Факт3: 3-е сообщение не передалось на CA и Outlook подвис. Следовательно CA перестает принимать сообщения, как только видит, что текущая активная база недоступна.
Факт4: Сообщение 1 дошло до HT, попало в активную базу, но не успело реплицироваться на пассивную и было успешно восстановлено с HT. Отсюда и порядок доставки сообщений.
На основе приведенных выше фактов, наиболее логичное предположение такое:
Если CA понимает что активная база недоступна уже после того как принял сообщение от клиента, он его тупо удаляет.
Точно утверждать не могу, потому что не знаю алгоритма процесса передачи CA- >HT.
Но если мое предположение правда, то это какой-то уж очень глупый конструктивный баг со стороны MS.
По факту, кластер DAG на данный момент, не может исключить потерю данных при переключении.
Пока приняли решение переходить на DAG, т.к. из описания работы CCR можно сделать вывод, что там проблем с потерей при переключении гораздо больше.
Пока остается только надеяться, что MS исправит свой баг в будущих SP или RU.