Как и для чего я автоматизировал проверку количества shapshot’ов
4
3285
28 августа 2020 11:43
28/08/2020
Visitors have accessed this post 3285 times.
Автор — Максим Куприенко
Ищем корень зла
Как-то я столкнулся с интересной задачей. А именно — при работе с системой виртуализации VMware vSphere иногда возникала следующая проблема: для некоторых виртуальных машин выполнение штатных операций (старт/стоп/перезапуск) стало занимать гораздо больше времени, а также падала производительность самой виртуальной машины. Так как диски всех виртуальных машин хранились на одной СХД, а проблема возникала только на части ВМ, то было понятно, что проблема не в СХД. Также мы проверили сервисы, работающие на виртуальных машинах, чтобы убедиться в том, что и они не являются причиной проблем.
Тогда стали детально изучать способы взаимодействия разработчиков с виртуальными машинами и установили, что активно используются snapshot’ы. Ага, уже проще — проверили их количество на всех виртуальных машинах и увидели следующую картинку: на проблемных машинах количество snapshot’ов было больше, чем на беспроблемных. Дальше больше — опытным путем мы вычислили оптимальное количество snapshot’ов для виртуальной машины — 3, то есть если на ВМ более трех snapshot’ов, то возникает вышеописанная проблема.
А почему оно так происходит? Snapshot увеличивается в размере по ходу записи данных. Чем больше размер, тем больше нагрузка на диск. Также при выполнении операций перечитывается вся цепочка snapshot’ов. Соответственно, чем она длиннее, тем больше нагрузка на виртуальную машину.
Вроде бы проблему выяснили, но это не помогло разработчикам, так как они не имели возможности самостоятельно отслеживать виртуальные машины с избыточным количеством snapshot’ов и вынуждены были обращаться за помощью к системному администратору. А это приносило неудобства обеим сторонам. Решать надо было как-то по-другому.
Есть решение!
На сопровождении у нас находилось больше 300 виртуальных машин. Вручную проводить проверки на количество snapshot’ов? Нет. Будем автоматизировать этот процесс. При изучении вопроса была найдена утилита PowerCLI (от редакции — это надстройка к PowerShell, которая помогает управлять виртуальной инфраструктурой при помощи сценариев командной строки).
После этого и появилась идея написать PowerShell-сценарий для проверки количества snapshot’ов и отправки уведомлений на почту заинтересованным лицам.
Ниже приведен основной листинг скрипта:
$localpath=$PWD;
# функция для подключения к vShere
function GetConnection ($vsrv, $user, $pwd)
{
Connect-VIServer -Server $vsrv -User $user -Password $pwd;
};
# функция отправки сообщений
function SendMessage ($contact, $credentional, $bodymessage)
{
Send-MailMessage -From $mail_account -To $contact -Subject "Warning! Snapshot Count too much" -SmtpServer $mail_server -Credential $credentional -Body $bodymessage;
};
Add-PSSnapin VMware.VimAutomation.Core;
.\credentionals.ps1;
$secpwd = ConvertTo-SecureString $maccount_password -AsPlainText -Force;
$Credantional = New-Object System.Management.Automation.PSCredential ($mail_account, $secpwd);
GetConnection $ViServer $Username $Password
$head = "Critical snapshot count = 3n";
# получаем список файлов проектов с виртуальными машинами
foreach ($project in Get-ChildItem -Path $localpath\projects\*)
{
$sendflag = $false
$bodymessage = "";
$projectName = $project.BaseName;
# получаем список адресатов
$contacList = Get-Content $localpath\techcontacts\$projectName.txt;
$i=0
do
{
$flag = $true;
# получаем имя очередной виртуальной машины
$vmname = @(Get-Content $project).Get($i);
# получаем количество snapshot’ов для виртуальной машины
$Count = @(Get-Snapshot -VM $vmname).Count;
if ( $Count -gt 3 )
{
$body = "Server $vmname have $Count snapshots. There are:
";
$message = "";
# получаем массив имён snapshot’ов
$snaps = @(Get-Snapshot $vmname);
$k = 0;
do
{
$snapname = $snaps.Get($k).ToString();
$message = $message + $snapname + "n";
$k ++;
}
while ($k -ne $Count)
$body = $body + $message;
$flag = $false;
}
if (!$flag)
{
$sendflag = $true
$bodymessage = $bodymessage + $body + "
"
Write-Output $bodymessage
}
$i ++;
}
while ($i -ne (@(Get-Content $project).Count));
if ($sendflag)
{
$bodymessage = $head + $bodymessage;
foreach ($contact in $contacList)
{
SendMessage $contact $Credantional $bodymessage;
}
}
}
В подключаемом файле credentionals.ps1 хранятся данные для подключения к vcenter и почтовому серверу.
Листинг файла credentionals.ps1:
# указываем адрес vcenter и логин/пароль для подключения
$Global:Username = "";
$Global:Password= "";
$Global:ViServer = "";
# указываем почтовый сервер, логин/пароль пользователя, под которым будем делать рассылку
$Global:mail_server = "";
$Global:mail_account = "";
$Global:maccount_password = "";
Рядом со скриптом должны находиться 2 каталога: projects и techcontacts.
В каталоге projects лежат текстовые файлы, именами которых являются префиксы проектов, внутри — имена виртуальных машин в vSphere.
В каталоге techcontacts лежат текстовые файлы, именами которых являются префиксы проектов, внутри указаны почтовые адреса, на которые будут отправляться письма.
Подводим итог
Нам удалось автоматизировать процесс проверки количества snapshot’ов. В результате, snapshot’ы у нас не копятся, так как ответственным лицам стали приходить почтовые уведомления о необходимости удаления лишних snapshot’ов с указанных виртуальных машин. В нашем случае это привело к уменьшению времени выполнения стандартных операций и повышению производительности виртуальных машин. А еще сократилось время на выяснение причин возникающих проблем и количество обращений к системному администратору.
От редакции
Если вам интересно посещать бесплатные онлайн-мероприятия по DevOps, Kubernetes, Docker, GitlabCI и др. и задавать вопросы в режиме реального времени, подключайтесь к каналу DevOps by REBRAIN.
*Анонсы мероприятий каждую неделю
Практикумы для специалистов по инфраструктуре и разработчиков — https://rebrainme.com.
Наш Youtube-канал — https://www.youtube.com/channel/UC6uIx64IFKMVmj12gKtSgBQ.
Агентство Fevlake, проектируем и поддерживаем IT-инфраструктуры с 2012 года — https://fevlake.com.