Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Серверное ПО _ Несколько Mdaemon-ов

Автор: Jeremiah Вторник, 27 Января 2004, 16:09

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

Спасибо!

Автор: Levon Среда, 04 Февраля 2004, 8:11

Тебе не мешало бы пробежаться в доках по кластеризации серверов в Windoвозе.

Полистай Network Load Balansing
Там возможно настроить так чтобы несколько машин отвечали на 1 IP
У меня тоже это в задачах стоит ...... но наверное начну через месяца 3

Если найдешь что-то путное ....... поделись !!!

Автор: Jeremiah Пятница, 06 Февраля 2004, 12:08

Цитата
Тебе не мешало бы пробежаться в доках по кластеризации серверов в Windoвозе

Уже пробежался. Пока только куча вопросов.

Сейчас нужно немного другое, чтобы на одно имя отвечало несколько компов из разных подсетей. Причем чтобы при выходе одного компа из строя, за него отвечал другой.

Цитата
Если найдешь что-то путное ....... поделись !!!

В DNS есть механизм Round Robin, он перебирает адреса, назначенные имени, по кругу. В комплекте с небольшим TTL (я уменьшил до 30 секунд, вместо 1 часа) переключение на другой адрес происходит нормально (с небольшой задержкой, но происходит).

Из интересных ссылок:
http://info.nic.ru/st/8/out_263.shtml

Сейчас не совсем понятно, как мне обеспечить на обоих серверах актуальную информацию. Чтобы все что в почту на один сервак упало (или забралось из оной) зеркализовалось на другой причем в целости и сохранности. Не знаю Off line folders для этого попрет ли unsure.gif В MDaemon-е чего-то не нашел механизма репликации между серваками.
Точно также не понятно как это будет происходить в случае с NetLoadBalance.
Будем искать smile.gif
Если кто знает, не поленитесь ссылочку кинуть или отписать. Спасибо!

Автор: Levon Пятница, 06 Февраля 2004, 13:35

Цитата
Сейчас не совсем понятно, как мне обеспечить на обоих серверах актуальную информацию. Чтобы все что в почту на один сервак упало (или забралось из оной) зеркализовалось на другой


Ну в NetLoadBalansing этого конечно нету ..........
Но я думал применить здесь Distributed File System , там есть возможность репликации правда я не делал, но моя надежда тока на это ..... а еще есть куча софтов которые обеспечивают репликацию данных.
можешь зазеркалить оба каталога с письмами ....
А еще придется зазеркалить и настройки узверей ...... Словом хороший проект .......
Мне просто до этого еще надо AD развернуть .....

Цитата
Сейчас нужно немного другое, чтобы на одно имя отвечало несколько компов из разных подсетей

На одно имя .... ??
или IP ???

Net load balansing так и делает .....

Автор: Jeremiah Пятница, 06 Февраля 2004, 16:31

Разница есть,
то один виртуальный адрес, в конкретной подсетке(имена в данном случае по барабану),
а то одно имя, а адреса 2 в разных подсетях.
Если связь двух подсетей разрывается, что будет в первом и во втором случае?
Если я правильно понял, то NLB средствами Microsoft не позволяет объединить в кластер компы из разных подсетей. Они рекомендуют ставить 2 кластера в разных подсетях и пользоваться Round Robin.

Автор: Levon Понедельник, 09 Февраля 2004, 8:23

Да но по идее если связь между подсетками разорвется ...... и выйдет из строя мейлсервер одной подсетки .... то клиенты данной подсетки лишатся почты ..........

Автор: Jeremiah Понедельник, 09 Февраля 2004, 10:56

это уже не столь важно, зато остальные 20 подсетей будут нормально работать smile.gif .

Автор: Levon Понедельник, 09 Февраля 2004, 11:22

Цитата
Если связь двух подсетей разрывается, что будет


По моему тут Round Robin уже сдохнет ... так как будет время от времени возвращать адресс которого нет на данный момент,

А что тебе мешает поставить серваки в одной сетке ..... ??

Автор: Jeremiah Понедельник, 09 Февраля 2004, 14:22

Смысла нету. Корпоративная сеть, куча филиалов по Москве. Дохнет центральный офис - дохнет инет, почта и т.п. во всех филиалах. Мне нужен дублер именно в другой подсети, чтобы не было строгой завязки на центральный офис.
Цитата
По моему тут Round Robin уже сдохнет

Возможно. Буду пробовать, расскажу результат.

Автор: Levon Понедельник, 09 Февраля 2004, 14:53

Ну с Outgoing SMTP сервером у тебя проблем быть не должно .....
Где хочешь ставь ....... письма будут выходить ......

Ну а с входящими ..... может поставишь у себя в сетках DNS серверы и прошишешь зону присвоишь имена
к примеру mail.corporation.ru ... у всех в настройках будет стоять это ..... при переносе компа в другой филиал .... все равно mail.corporation.ru будет работать .........
А тепер на счет синхронизации писем ........ что бы во всех ящиках была актуальная информация я думаю может тебе использовать пакеты синхронизации ......... то биш репликации ... ??

К примеру
http://www.peersoftware.com/peersync.html не плохая штука .... я тоже раздумываю над этим купить или не купить ...... позволяет реплицировать каталоги как по расписанию ..... так и в режиме реального времени .......... как в одном направлении .. так и в обоих напралениях (bi-directional) ... если в одном мейлсервере входит письмо то оно автоматически или по расписанию будет реплицировано на остальных мейлсерверах ......

Если пользователь скачал свои письма то данные письма удалятся на всех мейлсерверах .......

А если в головном офисе нет инета .... то в DNS сервере (где прописана ваша зона в интернете) допиши несколько MX записей для вашей зоны с IP адрессами других филиалов ......... тогда письма будут идти на другие серваки вашей фирмы ... и соответственно реплицироваться на други серверы .......

Звучит грандиозно но в тоже время хрупко ... но как это на практике ... боюсь даже представить .... ;-)

Автор: Jeremiah Понедельник, 16 Февраля 2004, 15:16

Ну пробный вариант вроде функциклир.
С MX не подходит вариант, мы получаем почту с сервера провайдера, доступ к нашему серваку из инета закрыт.

Сделал в общем-то так как и говорил, Round Robin + синхронизация каталогов с почтовыми сообщениями (юзеров пока не синхронизирую, это в процессе разборок).
В тестовом режиме все вполне приемлемо работает.
Опрос серверов происходит по очереди (один забор почты, первый сервер, другой опрос почты - второй). В случае отказа одного из серверов почта будет забираться через раз, что нас вполне устраивает.
Поставлю в промышленное использование посмотрим какие "ослиные уши" вылезут. Пока вижу явную проблему с 9х клиентами, которые не знают что такое DNS.

PS. отдельное thnx за ссылочку. Прога действительно дельная, минус её только в том что в bi-directional режиме файлы удаленные в target директории не отреплицируются. Поэтому я на каждом сервере поставил однонаправленную репликацию на другой сервер.

Автор: Levon Вторник, 17 Февраля 2004, 8:50

Цитата
Пока вижу явную проблему с 9х клиентами, которые не знают что такое DNS.


Как не знают ..... ??
В 98 -ом Когда открываешь настройки сети ..... на пункте TCP/IP .... открываешь ... а там есть DNS ......
Это не то .... ??

Автор: Jeremiah Вторник, 24 Февраля 2004, 11:06

Если я не ошибаюсь unsure.gif , то 9х не используют DNS для разрешения имен. В этом собсна и вижу проблему.

Неделю не мог попасть в тему smile.gif . Проблема http://forum.wincity.ru/index.php?act=ST&f=9&t=10286&st=0&#entry54374 в действии.

Автор: Барэль Вторник, 24 Февраля 2004, 12:27

Jeremiah, не ошибаешься smile.gif Для 9x подобных систем используется WINS

Автор: Levon Вторник, 24 Февраля 2004, 13:06

А для чего тогда вкладка DNS в 98 ???

И что бывает если я делаю ping yandex.ru .... ???

Автор: Jeremiah Пятница, 12 Марта 2004, 11:53

Фуф! Вроде завершил ковыряния с дублером почтового сервера.

В общем решено было сделать так:
1. В работе всегда только один сервер.
2. Если он отказывает, запускается его дублер с пустой базой писем.
3. После восстановления связи дублер отключается, письма перемещаются на основной сервер.

После долгих поисков и мытарств, понял что проще самому скрипт накатать.
Собственно скрипт пингует сервер и проверяет статус сервиса MDaemon.
Если сервис не доступен или остановлен, изменяется соответствующая запись в DNS и стартует локальный сервис MDaemon. Дальше буду смотреть достаточно ли этих 2-х проверок.

Скрипт могу выложить, если кому интересно.

Автор: Levon Пятница, 12 Марта 2004, 13:29

Цитата
Скрипт могу выложить, если кому интересно.


Если не трудно ..... :-)

Автор: Jeremiah Понедельник, 15 Марта 2004, 12:08

vDate = Time
strRComputer = "АдресОсновногоMDaemon"
Rezult = 0
LastRezult = 0

set oShell = CreateObject ("wscript.shell")

Do
if vDate < "22:00:00" or vDate > "09:45:00" then
' Проверка ping-ом Компьютера с MDaemon
Call IsOnline(Rezult,strRComputer)
'Перепроверяю связь в еще 5 раз, если с первого раза соединение не прошло
' ----------------------------------------------------------------------------------------------------------------------
if Rezult = 1 then
iRecheck = 1
Do until iRecheck >= 5
WScript.Sleep 10000
Call IsOnline(Rezult, strRComputer)
if Rezult = 0 then
exit do
end if
iRecheck = IRecheck + 1
loop
if LastRezult = 0 and Rezult = 1 then
oShell.LogEvent 2, "Ping не прошел."
end if
end if
' ----------------------------------------------------------------------------------------------------------------------
' Если Ping прошел успешно, то проверяем работу сервиса.
' ----------------------------------------------------------------------------------------------------------------------
if Rezult = 0 then
' вызов подпрограммы проверки сервиса
Call CheckMdaemon(Rezult, strRComputer)
If Rezult = 1 and LastRezult = 0 then
oShell.LogEvent 2, "MDaemon остановлен или отсутствует"
end if
End if
' ----------------------------------------------------------------------------------------------------------------------
' Подведение итогов запись логов, изменение адреса в DNS, запуск копии MDaemon
' ----------------------------------------------------------------------------------------------------------------------
If Rezult = 1 then
' если почтовый сервис не доступен,а последний раз он был доступен
if LastRezult = 0 then
oShell.LogEvent 1, "Основной почтовый сервис не доступен"
Call ChangeCMailRecord(Rezult)
end if
' если почтовый сервис доступен, а последний раз он был не доступен
else
if LastRezult = 1 then
oShell.LogEvent 4, "Восстановлен доступ к основному почтовому сервису."
Call ChangeCMailRecord(Rezult)
end if
end if

LastRezult= Rezult
End if
WScript.Sleep 30000
Loop




' ==================================================================
' Процедура Ping
' ==================================================================
Sub IsOnline(Answer, strRComputer)

dim wshShell, fso, tfolder, tname, TempFile, results, retString, ts
Const ForReading = 1, TemporaryFolder = 2
reachable = false
set wshShell=wscript.createobject("wscript.shell")
set fso = CreateObject("Scripting.FileSystemObject")
Set tfolder = fso.GetSpecialFolder(TemporaryFolder)
tname = fso.GetTempName
TempFile = tfolder & tname
wshShell.run "cmd /c ping -n 3 " & strRComputer & ">" & TempFile,0,true
set results = fso.GetFile(TempFile)
set ts = results.OpenAsTextStream(ForReading)
do while ts.AtEndOfStream <> True
retString = ts.ReadLine
if instr(retString, "Reply")>0 then
answer = 0
exit do
else
answer = 1
end if
loop
ts.Close
results.delete

end Sub


' ==================================================================
' Процедура проверки сервиса MDaemon
' ==================================================================
Sub CheckMdaemon(Answer, strRComputer)

on error resume next

MDaemonState = "UnKnown"

Set objRWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=Impersonate}!\\" & strRComputer & "\root\cimv2")
Select Case Err.Number
Case 0
Set colStoppedServices = objRWMIService.ExecQuery _
("SELECT DisplayName,State FROM Win32_Service WHERE DisplayName = 'MDaemon'")

For Each objService in colStoppedServices
MDaemonState = objService.State
Next
If MDaemonState <> "Running" then
Answer = 1
else
Answer = 0
end if
Case Else
Answer = 1
End Select

end Sub

' ==================================================================
' Процедура смены DNS записи CMail.domain.ru
' Требуется WMI DNS Provider. Можно взять на
' ftp://ftp.microsoft.com/reskit/win2000/dnsprov.zip
' ==================================================================

Sub ChangeCMailRecord(Answer)

set oShell = CreateObject ("wscript.shell")

' Проверяем доступность основного DNS
Call IsOnline(DNSRezult, "АдресПервогоDNS")


If Answer = 1 then ' если сигнал отказа сервиса
' Меняем на резервном DNS запись CMail
strDNSComputer = "ИмяРезервногоDNS"
Set objWMIService = GetObject("winmgmts:\\" & strDNSComputer & "\root\MicrosoftDNS")
Set colItems = objWMIService.ExecQuery("Select * from MicrosoftDNS_AType where OwnerName = 'CMail.domain.ru'")
For Each objItem in colItems
ErrRezult = objItem.Modify(,"АдресРезервногоMDaemon",RR)
Next
oShell.LogEvent 4, "Запись CMail на резервном DNS изменена"
if DNSRezilt = 0 then ' Если основной DNS доступен
' Меняем на основном DNS запись CMail
strDNSComputer = "ИмяОсновногоDNS"
Set objWMIService = GetObject("winmgmts:\\" & strDNSComputer & "\root\MicrosoftDNS")
Set colItems = objWMIService.ExecQuery("Select * from MicrosoftDNS_AType where OwnerName = 'CMail.domain.ru'")
For Each objItem in colItems
ErrRezult = objItem.Modify(,"АдресРезервногоMDaemon",RR)
Next
oShell.LogEvent 4, "Запись CMail на основном DNS изменена"
end if
Call MDaemonStartStop(Answer)
else ' если сигнал, доступности основного сервера
' Меняем на резервном DNS запись CMail
strDNSComputer = "ИмяРезервногоDNS"
Set objWMIService = GetObject("winmgmts:\\" & strDNSComputer & "\root\MicrosoftDNS")
Set colItems = objWMIService.ExecQuery("Select * from MicrosoftDNS_AType where OwnerName = 'CMail.domain.ru'")
For Each objItem in colItems
ErrRezult = objItem.Modify(,"АдресОсновногоMDaemon",RR)
Next
oShell.LogEvent 4, "Запись CMail на резервном DNS изменена"
if DNSRezilt = 0 then ' Если основной DNS доступен
' Меняем на основном DNS запись CMail
strDNSComputer = "ИмяОсновногоDNS"
Set objWMIService = GetObject("winmgmts:\\" & strDNSComputer & "\root\MicrosoftDNS")
Set colItems = objWMIService.ExecQuery("Select * from MicrosoftDNS_AType where OwnerName = 'CMail.domain.ru'")
For Each objItem in colItems
ErrRezult = objItem.Modify(,"АдресОсновногоMDaemon",RR)
Next
oShell.LogEvent 4, "Запись CMail на основном DNS изменена"
end if
Call MDaemonStartStop(Answer)
end if

end sub

' ================================================================================
=====
' Запуск/остановка сервиса MDaemon
' ================================================================================
=====

Sub MDaemonStartStop(Answer)

strMDaemonComp = "АдресРезервногоMDaemon"

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strMDaemonComp & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='MDaemon'")

if Answer = 1 then
For each objService in colServiceList
errReturn = objService.StartService()
Next
else
For each objService in colServiceList
errReturn = objService.StopService()
Next
end if

end sub

Автор: Jeremiah Понедельник, 15 Марта 2004, 12:12

Скрипт конечно нечёсанный и кое-чего так до конца и не понял (многое честно содрал с Microsoft-овского скрипт-центра), так что непрогневайтесь гуру программирования smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)