DHCP Failover на коленке

image

Одним из наиболее существенных нововведений в Windows Server 2012 лично для меня является новая фича – DHCP Failover. Этот механизм предоставляет возможность балансировки нагрузки и создания избыточности для DHCP сервиса без применения каких-либо кластерных технологий. Но что если, по каким-либо причинам, у вас нет возможности использовать Windows Server 2012 в вашей среде, как и все возможные кластерные технологии? В этом случае к нам на помощь приходит PowerShell. Описанное ниже решение просто, эффективно и основано на следующих компонентах: PowerShell 2.0, встроенная в Windows утилита netsh и стандартный системный планировщик.

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

Первый шаг: пишем на Powershell бэкап скрипт и запускаем его на основном DHCP сервере с помощью планировщика, ежедневно в 00-00:

Script 1

#  # DHCP db backup script. # Requires Powershell 2.0. # Prepared by Alexander Lipovetskiy 19.01.2014. #  cls  # Basic variables  $Log = "C:\DHCP_Failover\DHCP_Backup.log" $DL = "Alexander.Lipovetskiy@firma.at", "admins@firma.at"  # Functions  function Date { Get-Date -Format G }  function Sendmail      {     Send-MailMessage `     -to $DL `     -From "MainDHCPServer@firma.at" `     -Subject "DHCP service failure!" `     -priority High `     -Body "$(Date) $Message" `     -SmtpServer "mail.firma.at"     }  function Alert     {     Write-Host "$(Date) $Message" -ForegroundColor Red     Write-Output "$(Date) $Message"  | Out-File -FilePath $Log -Append     }  function Notification     {     Write-Host "$(Date) $Message"     Write-Output "$(Date) $Message"  | Out-File -FilePath $Log -Append     }  # DHCP db backup procedure.  $Message = "Starting DHCP db backup procedure..." Notification  # Let's keep one old copy of db. Move-Item -Path "\\BackupDHCPServer\DHCP_Failover\DHCP_Backup.db" -Destination "\\BackupDHCPServer \DHCP_Failover\DHCP_Backup.db.previous" -Force  # Run the backup netsh dhcp server export "\\BackupDHCPServer \DHCP_Failover\DHCP_Backup.db" all  $Message = "DHCP db backup is completed." Notification  # Check if dhcp service is running after backup.  Start-Sleep -Seconds 30 $DHCPservice = Get-Service -Name "DHCPServer" if ($DHCPservice.Status -ne 'Running')     {     $Message = "DHCP service is down after backing up! Trying to start it..."     Alert     Sendmail     $DHCPservice | Start-Service -Confirm:$false     # one more check     Start-Sleep -Seconds 30     $DHCPservice = Get-Service -Name "DHCPServer"     if ($DHCPservice.Status -ne 'Running')         {         $Message = "DHCP service is still down and can't be started!"         Alert         Sendmail         }     else         {         $Message = "DHCP service has been started from second attempt and running now."         Notification         Sendmail         }     }  else     {     $Message = "DHCP service is up and running after the backup procedure."     Notification     } 

Этот скрипт запускает netsh для выгрузки DHCP базы в сетевую папку резервного сервера, оставляя там одну предыдущую копию базы. После выгрузки скрипт проверяет запустился ли DHCP сервис и если этого не произошло, то пытается запустить его еще раз (во процессе выгрузки netsh останавливает DHCP сервис, выгружает базу, затем снова его запускает). Скрипт ведет лог всех ошибок и в случае проблем оповещает нужных лиц по почте. Для этого естественно необходимо наличие в вашей сети почтового сервера, разрешающего пересылку внутренней почты без авторизации. При запуске скрипта из консоли можно увидеть больше информации о его работе т.к. в лог идут только ошибки.

Второй шаг: это наш основной failover механизм, который находится на резервном сервере. Там мы вешаем скрипт, который запускается каждую минуту, начиная с 00-05 в течение 23 часов 50 минут (оставим окно в 10 минут на время бэкапа).

Script 2

#  # DHCP failover script. # Requires Powershell 2.0. # Prepared by Alexander Lipovetskiy 19.01.2014. #  cls  # Basic variables  $Log = "C:\DHCP_Failover\DHCP_Failover.log" $DHCPMain = "MainDHCPServer" $DL = "Alexander.Lipovetskiy@firma.at", "admins@firma.at"  # Functions  function Date { Get-Date -Format G }  function Sendmail      {     Send-MailMessage `     -to $DL `     -From "BackupDHCPServer@firma.at" `     -Subject "DHCP service failure!" `     -priority High `     -Body "$(Date) $Message" `     -SmtpServer "mail.firma.at"     }  function Alert     {     Write-Host "$(Date) $Message" -ForegroundColor Red     Write-Output "$(Date) $Message" | Out-File -FilePath $Log -Append     }  function Notification     {     Write-Host "$(Date) $Message"      Write-Output "$(Date) $Message"  | Out-File -FilePath $Log -Append     }  function StartBackupDHCPservice     {     #Start backup dhcp service     try         {         $DHCPsrvBackup | Start-Service -Confirm:$false         #import dhcp db from last backup         try              {             netsh dhcp server import "C:\DHCP_Failover\DHCP_Backup.db" all             $Message = "DHCP db import from last backup is completed."             Notification             }         catch             {             $Message = "DHCP db import can't be done! Have to use old data."             Alert             Sendmail             }         $Message = "Backup DHCP service has been started."         Notification         SendMail         }     catch         {         $Message = "Backup DHCP service can't be started!"         Alert         Sendmail         }     }  # Check if main DHCP server is online. if (Test-Connection -ComputerName $DHCPMain -Quiet)      {     $Message = "Main DHCP server is online."     Write-Host "$(Date) $Message"     # Check if main dhcp service is running.     $DHCPsrvMain = Get-Service -Name "DHCPServer" -ComputerName $DHCPMain     if ($DHCPsrvMain.Status -eq 'Running')         {         $Message = "DHCP service is running on main server."         Write-Host "$(Date) $Message"         # Stop backup dhcp service if it's running after main dhcp is back.         $DHCPsrvBackup = Get-Service -Name "DHCPServer"         if ($DHCPsrvBackup.Status -ne 'Stopped')             {             $DHCPsrvBackup | Stop-Service -Confirm:$false -Force             $Message = "Backup DHCP service has been stopped as main DHCP is back."             Notification             SendMail             }         else             {             $Message = "Backup DHCP service is not running."             Write-Host "$(Date) $Message"             }          break         }     else          # Start backup dhcp service if it's not running yet         {         $DHCPsrvBackup = Get-Service -Name "DHCPServer"         if ($DHCPsrvBackup.Status -eq 'Running')             {             $Message = "Backup DHCP service is running while main DHCP service is down."             Write-Host "$(Date) $Message"             break             }         else             {             # To prevent unnecessary failovers: wait 30 sec, check again and only then start             Start-Sleep -Seconds 30             $DHCPsrvMain = Get-Service -Name "DHCPServer" -ComputerName $DHCPMain             if ($DHCPsrvMain.Status -ne 'Running')                 {                 $Message = "DHCP service on main server is down! Starting backup DHCP service..."                 Alert                 Sendmail                 StartBackupDHCPservice                 }             else                 {                 $Message = "Main DHCP service is back after a short outage. Do nothing."                 Notification                 break                 }             }         }     } else      {     # Start backup dhcp service if it's not running yet     $DHCPsrvBackup = Get-Service -Name "DHCPServer"     if ($DHCPsrvBackup.Status -eq 'Running')         {         $Message = "Backup DHCP service is running while main DHCP server is offline."         Write-Host "$(Date) $Message"         break         }     else         {         $Message = "Main DHCP server is offline! Starting backup DHCP service..."         Alert         Sendmail         StartBackupDHCPservice         }     } 

Вкратце, этот скрипт мониторит основной DHCP сервер и запускает свой резервный DHCP сервис в случае, если основной сервер недоступен или в случае, если основной сервер доступен, но DHCP сервис там не работает по каким-либо причинам. Происходит запуск резервного DHCP и подгрузка последней базы. Когда основной сервер снова в строю — происходит отключение резервного сервиса. Ну и также ведется лог и происходят все те же почтовые оповещения с информацией, соответствующей тому, что произошло.

Оба скрипта правильнее будет запускать от имении специально выделенного для этого аккаунта, дав ему при этом права админа на обоих серверах.

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

ссылка на оригинал статьи http://habrahabr.ru/post/209636/

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *