Простой 1С стоил миллионы: отказоустойчивый кластер для бухгалтерской фирмы

Задача клиента: 500 пользователей 1С и простой ценой в миллионы

К нам обратилась крупная бухгалтерская фирма из Ростова-на-Дону, обслуживающая на аутсорсинге бухгалтерию более 50 компаний. В инфраструктуре — 500 пользователей, работающих в 1С:Предприятие, файловый сервер с документацией и SQL Server для базы данных. Всё это работало на одном физическом сервере без какой-либо отказоустойчивости.

За последний год фирма пережила два серьёзных простоя: первый — из-за сбоя блока питания (8 часов), второй — из-за обновления Windows, после которого сервер не загрузился (12 часов). Каждый час простоя обходился компании в сотни тысяч рублей: срывались сроки сдачи отчётности, клиенты теряли доверие, сотрудники простаивали.

После аудита мы предложили развернуть отказоустойчивый кластер Windows Server 2022 на двух узлах с iSCSI-хранилищем, обеспечив автоматическое переключение нагрузки при сбое любого узла. Проект был реализован за 3 недели, включая закупку оборудования, настройку и тестирование.

Аудит и проектирование: архитектура отказоустойчивого кластера

Наши инженеры начали с детального аудита существующей инфраструктуры и проектирования целевой архитектуры. Отказоустойчивый кластер (Failover Cluster) — технология высокой доступности Microsoft, которая объединяет несколько серверов (узлов) в единую систему. При сбое одного узла его рабочие нагрузки автоматически переносятся на другие узлы без прерывания обслуживания пользователей.

Windows Server 2022 поддерживает кластеры до 64 узлов с улучшенной производительностью и новыми возможностями: USB-свидетель кворума, улучшенная поддержка Storage Spaces Direct и интеграция с Azure.

Компоненты кластера, которые мы спроектировали

Архитектура отказоустойчивого кластера, разработанная нами для клиента, включает следующие компоненты:

  • Узлы кластера (Nodes): 2 идентичных физических сервера Dell PowerEdge R740 — основной и резервный
  • Общее хранилище (Shared Storage): iSCSI-хранилище на отдельном сервере с дисковой полкой — доступно обоим узлам одновременно
  • Кластерная сеть (Cluster Network): выделенные 10 Гбит/с сетевые адаптеры для heartbeat-трафика между узлами
  • Кворум (Quorum): механизм голосования с disk witness — определяет, какой узел управляет кластером при разделении сети
  • Кластерные роли (Clustered Roles): файловый сервер, Hyper-V для виртуальных машин с 1С, SQL Server
  • Свидетель (Witness): выделенный диск для дополнительного голоса в кворуме

Спецификация оборудования, которую мы подобрали

Для развёртывания кластера мы подобрали следующее оборудование:

Серверы (2 шт.):

  • Dell PowerEdge R740 с идентичной конфигурацией
  • Windows Server 2022 Datacenter edition
  • Серверы введены в домен Active Directory
  • 4 сетевых адаптера на каждом узле (клиентская сеть, heartbeat, iSCSI, управление)

Хранилище:

  • Отдельный сервер с iSCSI Target и дисковой полкой
  • 3 LUN: данные (500 ГБ SSD), файлы (2 ТБ HDD), свидетель кворума (1 ГБ)

Сеть:

  • Выделенная 10 Гбит/с подсеть для heartbeat
  • Выделенная iSCSI-сеть
  • Статические IP-адреса для всех узлов
КомпонентМинимумНаша конфигурация
Узлы22 (Dell R740)
RAM на узел8 ГБ64 ГБ
Сетевые адаптеры2 на узел4 на узел
Disk Witness512 МБ1 ГБ

Реализация: подготовка сети и хранилища

Перед созданием кластера наши инженеры подготовили сетевую инфраструктуру и общее хранилище. Правильная подготовка — залог стабильной работы кластера.

Как мы настроили сеть для кластера

Каждый узел кластера мы оснастили четырьмя сетевыми интерфейсами. Применённая конфигурация:

# На каждом узле мы выполнили:

# 1. Переименование сетевых адаптеров
Rename-NetAdapter -Name 'Ethernet 1' -NewName 'Production'
Rename-NetAdapter -Name 'Ethernet 2' -NewName 'Heartbeat'

# 2. Настройка IP-адресов
# Узел 1 - Production
New-NetIPAddress -InterfaceAlias 'Production' -IPAddress 10.0.1.11 `
    -PrefixLength 24 -DefaultGateway 10.0.1.1
Set-DnsClientServerAddress -InterfaceAlias 'Production' `
    -ServerAddresses 10.0.1.5, 10.0.1.6

# Узел 1 - Heartbeat (без шлюза и DNS!)
New-NetIPAddress -InterfaceAlias 'Heartbeat' -IPAddress 192.168.100.11 `
    -PrefixLength 24

# 3. Отключение регистрации DNS для heartbeat-сети
Set-DnsClient -InterfaceAlias 'Heartbeat' -RegisterThisConnectionsAddress $false

# 4. Настройка приоритета адаптеров
Set-NetIPInterface -InterfaceAlias 'Production' -InterfaceMetric 10
Set-NetIPInterface -InterfaceAlias 'Heartbeat' -InterfaceMetric 20

Схема сети, которую мы реализовали:

  [500 пользователей 1С]     [DNS/AD]
      |                         |
  ----+---Production Network (10.0.1.0/24)---+---
      |                                       |
  [Node1: 10.0.1.11]                  [Node2: 10.0.1.12]
      |                                       |
  ----+---Heartbeat Network (192.168.100.0/24)+---
      |                                       |
  ----+--------iSCSI Network (172.16.0.0/24)--+---
                        |
                  [iSCSI Storage]
                  [SSD + HDD JBOD]

Как мы настроили iSCSI-хранилище

Мы выбрали iSCSI как наиболее доступный и надёжный вариант общего хранилища. Настройка:

На сервере хранения (iSCSI Target):

# Установка роли iSCSI Target Server
Install-WindowsFeature FS-iSCSITarget-Server -IncludeManagementTools

# Создание iSCSI Target
New-IscsiServerTarget -TargetName 'ClusterTarget' `
    -InitiatorIds @(
        'IQN:iqn.1991-05.com.microsoft:node1.company.ru',
        'IQN:iqn.1991-05.com.microsoft:node2.company.ru'
    )

# Создание виртуальных дисков
New-IscsiVirtualDisk -Path 'D:\iSCSI\ClusterData.vhdx' -SizeBytes 500GB
New-IscsiVirtualDisk -Path 'D:\iSCSI\ClusterWitness.vhdx' -SizeBytes 1GB

# Подключение дисков к Target
Add-IscsiVirtualDiskTargetMapping -TargetName 'ClusterTarget' `
    -Path 'D:\iSCSI\ClusterData.vhdx' -Lun 0
Add-IscsiVirtualDiskTargetMapping -TargetName 'ClusterTarget' `
    -Path 'D:\iSCSI\ClusterWitness.vhdx' -Lun 1

На каждом узле кластера (iSCSI Initiator):

# Запуск службы iSCSI Initiator
Start-Service MSiSCSI
Set-Service MSiSCSI -StartupType Automatic

# Подключение к iSCSI Target
New-IscsiTargetPortal -TargetPortalAddress 172.16.0.100
Connect-IscsiTarget -NodeAddress 'iqn.1991-05.com.microsoft:clustertarget' `
    -IsPersistent $true

# Проверка подключения
Get-IscsiSession | Format-Table -AutoSize
Get-Disk | Where-Object BusType -eq iSCSI | Format-Table

Инициализация дисков (только на первом узле!):

# Определяем iSCSI-диски
$disks = Get-Disk | Where-Object { $_.BusType -eq 'iSCSI' -and $_.PartitionStyle -eq 'RAW' }

# Инициализация и форматирование диска данных
$dataDisk = $disks | Sort-Object Size -Descending | Select-Object -First 1
Initialize-Disk -Number $dataDisk.Number -PartitionStyle GPT
New-Partition -DiskNumber $dataDisk.Number -UseMaximumSize -AssignDriveLetter |
    Format-Volume -FileSystem NTFS -NewFileSystemLabel 'ClusterData' -Confirm:$false

# Инициализация диска свидетеля
$witnessDisk = $disks | Sort-Object Size | Select-Object -First 1
Initialize-Disk -Number $witnessDisk.Number -PartitionStyle GPT
New-Partition -DiskNumber $witnessDisk.Number -UseMaximumSize -AssignDriveLetter |
    Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Witness' -Confirm:$false

Создание отказоустойчивого кластера

После подготовки инфраструктуры мы приступили к созданию кластера — установке компонента, валидации конфигурации и собственно формированию кластера.

Установка и валидация — ключевой этап

На обоих узлах мы установили компонент Failover Clustering:

# Установка на обоих узлах через Invoke-Command
$nodes = @('NODE1', 'NODE2')
Invoke-Command -ComputerName $nodes -ScriptBlock {
    Install-WindowsFeature Failover-Clustering -IncludeManagementTools
}

# Перезагрузка узлов
$nodes | ForEach-Object { Restart-Computer -ComputerName $_ -Force }

Перед созданием кластера мы выполнили полную валидацию — это ключевой шаг, который Microsoft требует для поддержки:

# Полная валидация конфигурации
Test-Cluster -Node NODE1, NODE2 -Include 'Storage','Network','Inventory','System Configuration'

# Отчёт сохраняется в C:\Windows\Cluster\Reports
# Все тесты прошли со статусом "Passed"!

Важно: Microsoft не поддерживает кластеры, не прошедшие полную валидацию. При обращении в техподдержку первым делом попросят результаты Test-Cluster. Мы убедились, что все тесты пройдены успешно.

Как мы создали кластер

Создание кластера выполнили через PowerShell:

# Создание кластера
New-Cluster -Name 'CLUSTER01' `
    -Node NODE1, NODE2 `
    -StaticAddress 10.0.1.20 `
    -NoStorage

# Проверка создания
Get-Cluster | Format-List *
Get-ClusterNode | Format-Table Name, State, NodeWeight

# Добавление дисков в кластер
Get-ClusterAvailableDisk | Format-Table Name, Size
Get-ClusterAvailableDisk | Add-ClusterDisk

# Проверка кластерных дисков
Get-ClusterResource | Where-Object ResourceType -eq 'Physical Disk' |
    Format-Table Name, State, OwnerNode

Настройка кворума

Для двухузлового кластера мы выбрали режим Node and Disk Majority — каждый узел имеет голос, плюс диск-свидетель добавляет третий голос:

# Настройка кворума с диск-свидетелем
Set-ClusterQuorum -DiskWitness 'Cluster Disk 2'

# Проверка настроек кворума
Get-ClusterQuorum | Format-List *

Windows Server 2022 поддерживает следующие режимы кворума:

  • Node Majority: только голоса узлов — для нечётного числа узлов
  • Node and Disk Majority: голоса узлов + диск-свидетель — наш выбор для 2 узлов
  • Node and File Share Majority: голоса узлов + файловый ресурс
  • Node and Cloud Majority (Azure): голоса узлов + облачный свидетель

Развёртывание кластерных ролей для 1С и SQL Server

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

Кластерный файловый сервер для документации

Для хранения бухгалтерской документации (сканы, отчёты, шаблоны) мы настроили кластерный файловый сервер:

# Создание роли файлового сервера
Add-ClusterFileServerRole -Name 'FS-CLUSTER' `
    -Storage 'Cluster Disk 1' `
    -StaticAddress 10.0.1.21

# Создание общей папки на кластерном диске
$clusterDisk = Get-ClusterResource 'Cluster Disk 1' |
    Get-ClusterParameter DiskPath | Select-Object -ExpandProperty Value

New-Item -Path "$clusterDisk\Shared" -ItemType Directory
New-SmbShare -Name 'Shared' -Path "$clusterDisk\Shared" `
    -FullAccess 'COMPANY\Domain Admins' `
    -ChangeAccess 'COMPANY\Domain Users' `
    -CachingMode None `
    -ScopeName 'FS-CLUSTER'

# Проверка доступности
Get-SmbShare -ScopeName 'FS-CLUSTER'

Для виртуальных машин 1С мы дополнительно создали Scale-Out File Server:

# Создание Scale-Out File Server
Add-ClusterScaleOutFileServerRole -Name 'SOFS-CLUSTER'

# Создание Cluster Shared Volume
Add-ClusterSharedVolume -Name 'Cluster Disk 1'

# Диск доступен на всех узлах: C:\ClusterStorage\Volume1

New-SmbShare -Name 'VMDATA' `
    -Path 'C:\ClusterStorage\Volume1\VMDATA' `
    -FullAccess 'COMPANY\Domain Admins' `
    -ScopeName 'SOFS-CLUSTER'

Кластер Hyper-V для виртуальных машин с 1С

Сервер 1С:Предприятие мы развернули как виртуальную машину Hyper-V с высокой доступностью и возможностью Live Migration:

# Установка Hyper-V на обоих узлах
Invoke-Command -ComputerName NODE1, NODE2 -ScriptBlock {
    Install-WindowsFeature Hyper-V -IncludeManagementTools -Restart
}

# Настройка Hyper-V после перезагрузки
Invoke-Command -ComputerName NODE1, NODE2 -ScriptBlock {
    New-VMSwitch -Name 'Production' -NetAdapterName 'Production' `
        -AllowManagementOS $true

    Set-VMHost -VirtualMachinePath 'C:\ClusterStorage\Volume1\VMs' `
              -VirtualHardDiskPath 'C:\ClusterStorage\Volume1\VHDs'
}

# Создание ВМ для сервера 1С
$vmName = '1C-SERVER-01'
New-VM -Name $vmName -ComputerName NODE1 `
    -MemoryStartupBytes 16GB `
    -NewVHDPath "C:\ClusterStorage\Volume1\VHDs\$vmName.vhdx" `
    -NewVHDSizeBytes 200GB `
    -SwitchName 'Production' `
    -Generation 2

Set-VM -Name $vmName -ComputerName NODE1 `
    -ProcessorCount 8 `
    -DynamicMemory -MemoryMinimumBytes 8GB -MemoryMaximumBytes 32GB

# Добавление ВМ в кластер — включение HA
Add-ClusterVirtualMachineRole -VMName $vmName

# Проверка кластеризованных ВМ
Get-ClusterGroup | Where-Object GroupType -eq VirtualMachine |
    Format-Table Name, State, OwnerNode

# Live Migration — перемещение без простоя
Move-ClusterVirtualMachineRole -Name $vmName -Node NODE2 -MigrationType Live

Подготовка к кластеризации SQL Server

Для базы данных 1С мы подготовили SQL Server Failover Cluster Instance (FCI):

Подготовка, которую мы провели:

  • Установили .NET Framework 4.8 на всех узлах
  • Создали сервисные учётные записи AD: COMPANY\svc-sql и COMPANY\svc-sqlagent
  • Настроили отдельные кластерные диски для Data, Log и TempDB
# Проверка дисков для SQL Server
Get-ClusterResource | Where-Object ResourceType -eq 'Physical Disk' |
    Get-ClusterParameter DiskPath |
    Format-Table ClusterObject, Value

Процесс установки SQL Server FCI:

  • Шаг 1. Запуск setup.exe на NODE1 — New SQL Server failover cluster installation
  • Шаг 2. Имя экземпляра: SQL-CLUSTER, IP: 10.0.1.22
  • Шаг 3. Назначение кластерных дисков для Data, Log и TempDB
  • Шаг 4. Завершение установки на первом узле
  • Шаг 5. На NODE2 — Add node to SQL Server failover cluster

Тестирование отказоустойчивости

Перед вводом кластера в эксплуатацию мы провели серию тестов, имитирующих различные сценарии отказа. Это обязательная практика — мы никогда не сдаём кластер клиенту без прохождения полного цикла тестирования.

Сценарии, которые мы протестировали

Мы провели тестирование всех критичных сценариев отказа:

# 1. Плановое перемещение роли между узлами
Move-ClusterGroup -Name 'FS-CLUSTER' -Node NODE2

# 2. Имитация отказа узла
Stop-ClusterNode -Name NODE1

# Проверяем, что роли переехали на NODE2
Get-ClusterGroup | Format-Table Name, State, OwnerNode

# Возвращаем NODE1
Start-ClusterNode -Name NODE1

# 3. Тестирование Live Migration для ВМ с 1С
$vms = Get-ClusterGroup | Where-Object GroupType -eq VirtualMachine
foreach ($vm in $vms) {
    $targetNode = if ($vm.OwnerNode -eq 'NODE1') {'NODE2'} else {'NODE1'}
    Write-Host "Мигрируем $($vm.Name) на $targetNode..."
    Move-ClusterVirtualMachineRole -Name $vm.Name -Node $targetNode -MigrationType Live
    Start-Sleep -Seconds 5
}

# 4. Проверка журналов кластера
Get-ClusterLog -Destination C:\Temp\ClusterLogs -TimeSpan 60

Результаты тестирования: переключение файлового сервера — 12 секунд, Live Migration ВМ с 1С — пользователи не заметили переключения, SQL Server FCI — 45 секунд (пересоединение клиентов 1С).

Наша практика: мы рекомендуем клиентам проводить тестирование failover ежеквартально в окно обслуживания и фиксировать время переключения.

Мониторинг кластера, который мы внедрили

Мы настроили скрипт постоянного мониторинга состояния кластера:

# Скрипт мониторинга кластера — разработан АйТи Фреш
$clusterName = 'CLUSTER01'

Write-Host '--- Узлы кластера ---' -ForegroundColor Cyan
Get-ClusterNode -Cluster $clusterName |
    Format-Table Name, State, NodeWeight, DynamicWeight

Write-Host '--- Кластерные роли ---' -ForegroundColor Cyan
Get-ClusterGroup -Cluster $clusterName |
    Format-Table Name, State, OwnerNode, Priority

Write-Host '--- Ресурсы с проблемами ---' -ForegroundColor Cyan
Get-ClusterResource -Cluster $clusterName |
    Where-Object State -ne 'Online' |
    Format-Table Name, State, ResourceType, OwnerNode

Write-Host '--- Кластерные сети ---' -ForegroundColor Cyan
Get-ClusterNetwork -Cluster $clusterName |
    Format-Table Name, State, Role, Address

Write-Host '--- Кворум ---' -ForegroundColor Cyan
Get-ClusterQuorum -Cluster $clusterName | Format-List

Write-Host '--- Последние события ---' -ForegroundColor Cyan
Get-WinEvent -LogName 'Microsoft-Windows-FailoverClustering/Operational' `
    -MaxEvents 20 | Where-Object Level -le 3 |
    Format-Table TimeCreated, LevelDisplayName, Message -Wrap

Типичные проблемы, о которых мы предупредили клиента:

  • Узел в состоянии «Down»: проверить сетевую связность, службу ClusSvc, журналы
  • Ресурс «Failed»: проверить зависимости, попробовать перезапуск
  • Split-brain: возникает при потере heartbeat — именно поэтому мы настроили выделенную heartbeat-сеть и disk witness
  • Медленный failover: проверить таймауты ресурсов

Результаты внедрения

Проект по построению отказоустойчивого кластера для бухгалтерской фирмы был завершён за 3 недели. Вот что мы достигли:

  • Нулевой простой за 8 месяцев после внедрения — против 20 часов простоя за предыдущий год
  • Автоматическое переключение нагрузки при сбое любого узла за 12-45 секунд
  • Live Migration виртуальных машин 1С — обслуживание узлов без прерывания работы 500 пользователей
  • iSCSI-хранилище с резервированием — данные защищены от сбоя отдельных серверов
  • Мониторинг и алерты — проактивное обнаружение проблем до их влияния на бизнес
  • Документация и обучение — IT-отдел клиента может самостоятельно проводить плановое обслуживание

Бизнес-результат: фирма перестала терять клиентов из-за срывов сроков отчётности. Бухгалтеры работают непрерывно даже во время обслуживания серверов. По оценке руководства, инвестиции в кластер окупились за 4 месяца — с учётом стоимости простоев в прошлом году. А главное — исчез страх перед «падением сервера в самый неподходящий момент».

Часто задаваемые вопросы

Минимум — 2 узла для базовой отказоустойчивости. Специалисты АйТи Фреш рекомендуют 3-4 узла для production: при 3 узлах кластер сохраняет работоспособность при отказе одного узла без дополнительного свидетеля. Максимум — 64 узла в Windows Server 2022. Для малого и среднего бизнеса достаточно 2 узлов с disk witness — именно такую конфигурацию мы чаще всего внедряем.

Да, Windows Server 2022 Datacenter поддерживает Storage Spaces Direct (S2D) — технологию программно-определяемого хранилища, которая использует локальные диски узлов вместо SAN. S2D создаёт распределённый пул хранения с репликацией данных между узлами. Для S2D нужно минимум 2 узла и минимум 2 диска на узел. Также возможен кластер без общего хранилища для Hyper-V с репликацией виртуальных машин.

Мы используем процедуру Cluster-Aware Updating (CAU): компонент автоматически переносит нагрузки с обновляемого узла, устанавливает обновления, перезагружает узел и возвращает нагрузки. Настройка: Add-CauClusterRole -ClusterName CLUSTER01 -Force -CauPluginName Microsoft.WindowsUpdatePlugin -MaxRetriesPerNode 3 -RequireAllNodesOnline.

CSV — файловая система кластера, которая позволяет нескольким узлам одновременно читать и писать на один том. Обычный кластерный диск доступен только одному узлу. CSV необходим для Hyper-V (несколько ВМ на разных узлах), Scale-Out File Server и SQL Server FCI. Мы всегда используем CSV в наших кластерных проектах. Включить: Add-ClusterSharedVolume -Name 'Cluster Disk 1'.

Наши инженеры рекомендуют два подхода. Rolling Upgrade: обновляйте узлы по одному — выведите узел, переустановите ОС на 2022, верните в кластер. После обновления всех узлов выполните Update-ClusterFunctionalLevel. Миграция: создайте новый кластер на 2022, перенесите роли. Rolling Upgrade проще, но миграция безопаснее для критичных систем.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#Failover Cluster Windows Server 2022#отказоустойчивый кластер настройка#Windows кластер Hyper-V#iSCSI кластер Windows#кворум кластера настройка#кластер файлового сервера#Windows Server High Availability#кластер SQL Server