SMB Transparent Failover одна из ключевых функций протокола SMB 3.0. На файловых серверах на базе Windows Server 2012 можно хранить данные различных приложений (например, файлы виртуальных машин Hyper-V, базы данных сервера SQL). Указанные приложения предполагают, что их данные находятся в хранилище, которое надёжно и всегда доступно. В связи с этим они не обрабатывают ошибки ввода-вывода. В случае, если хранилище становится недоступным, данные могут быть повреждены, а дальнейшая их запись невозможна.
SMB Transparent Failover позволяет настраивать общедоступные папки при использовании отказоустойчивой кластеризации (Failover Clustering) таким образом, что они становятся высокодоступными. Это позволяет администраторам кластера проводить операции по поддержке узлов кластера без прерывания работы приложений, чьи данные хранятся на кластеризованном файловом сервере. В случае сбоя аппаратного обеспечения файловый сервер будет переключён на работающий узел без задержек, что так же позволит работать приложению, которое хранит свои данные на файловом сервере, не прерывать свою работу.
Требования:
- Отказоустойчивый кластер на базе Windows Server 2012, состоящий как минимум из двух узлов. Мастер проверки конфигурации кластера должен отрабатывать на обоих узлах без ошибок.
- Кластеризованный файловый сервер с одной или более общедоступными папками, работающими в режиме непрерывной доступности (continuously available).
- Клиенты на базе Windows 8 или Windows Server 2012.
Чтобы использовать SMB Transparent Failover и клиент и сервер должны поддерживать SMB 3.0. На текущий момент эта поддержка реализована только для Windows 8 и Windows Server 2012. Клиенты использующие предыдущие версии SMB (1.0, 2.0, 2.1) использовать такие папки смогут, но не смогут использовать функцию SMB Transparent Failover.
Как работает?
Когда SMB клиент подключается к папке он определяет для неё значение параметра ContinuouslyAvailable. Если он включен (значение выставлено в True),то папка находится на отказоустойчивом кластере и работает в режиме continuously available. Это автоматически означает, что папка поддерживает SMB Transparent Failover. Когда SMB клиент открывает в папке файл от имени приложения, он запрашивает постоянный дескриптор файла. Когда SMB сервер получает запрос на открытие файла с постоянным дескриптором, он обращается к фильтру Resume Key, чтобы сохранить информацию о дескрипторе файла и уникальный ключ (resume key), предоставленный клиентом.
Если происходит запланированное перемещение приложения на другой узел кластера или сбой узла, к которому подключен SMB клиент, то SMB клиент пытается переподключиться к другому узлу кластера. Как только он переподключится к другому узлу, то будет пробовать завершить начатую на предыдущем узле операцию, используя resume key. Когда SMB сервер получает resume key, он обращается к фильтру Resume Key, чтобы восстановить состояние дескпритора на момент, предшествующий сбою. Resume Key так же защищает состояние дескриптора после переключения кластера, чтобы обеспечить согласованность пространства имён и предоставить клиенту возможность переподключиться к другому узлу кластера. Приложение, запущенное на стороне SMB клиента, продолжает работать без сбоев и ошибок во время операции переключения. С точки зрения приложения всё выглядит так, как будто произошла небольшая остановка в процессе чтения/записи.
Для защиты от потери данных в процессе записи в кеш, находящийся в нестабильном состоянии, постоянный дескриптор файла всегда открыт для записи.
SMB работает поверх протокола TCP. Таймаут для последнего составляет обычно 20 секунд. Клиент, прежде чем определить, что произошёл сбой на узле кластера, к которому он подключен, пропускает несколько TCP-пакетов. При этом, восстановление работоспособности приложения происходит примерно за 10 секунд, а не за 40 или 60 как можно было бы предположить. Такое быстрое восстановление обеспечивается за счёт сервиса-свидетеля.
Сервис-свидетель (Witness service)
Сервис-свидетель создавался с целью ускорить восстановление после непредвиденных сбоев, он позволяет SMB клиенту не ждать таймаута TCP-сессии, а сразу переключаться на рабочий узел. Новый сервис-свидетель ставится автоматически при установке роли отказоустойчивого кластера. Когда SMB клиент подключается к узлу кластера он уведомляет клиент-свидетель (Witness client), который запущен на том же компьютере. Клиент-свидетель получает список узлов кластера от сервиса-свидетеля, который работает на том узле кластера, к которому произошло подключение. Клиент-свидетель выбирает другой узел кластера (из полученного списка) и отсылает запрос на регистрацию сервису-свидетелю на выбранном узле кластера. После этого сервис-свидетель на новом узле кластера начинает отслеживать события, связанные с кластеризованным файловым сервером, к которому подключен SMB клиент.
Если происходит незапланированный сбой на узле кластера файлового сервера (к которому подключен SMB клиент), сервис-свидетель на другом узле кластера получает уведомление об этом от службы отказоустойчивого кластера. Сервис-свидетель уведомляет об этом клиента-свидетеля, который, в свою очередь, уведомляет о случившемся сбое SMB клиента. При получении уведомления от сервиса-свидетеля SMB клиент немедленно начинает процедуру переподключения на другой узел кластера, что значительно ускоряет восстановление после незапланированного сбоя.
Состояние сервиса свидетеля можно посмотреть через командлет Get-SmbWithnessClient:
Get-SmbWitnessClient | select ClientName,FileServerNodeName,WitnessNodeName
Запускается на одном из узлов кластера. Параметр ClientName возвращает имя SMB клиента, FileServerNodeName – узел кластера, к которому подключен клиент, WitnessNodeName – узел на котором зарегистрирован клиент-свидетель.
По умолчанию сетефой трафик между клиентом-свидетелем и сервером-свидетелем требует взаимной проверки подлинности и подписывания. При этом сам трафик не шифруется, так как не содержит пользовательских данных. Шифрование трафика на клиенте-свидетеле можно включить следующим образом:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Lanman\Workstation Parameters" WitnessFlags -Value 1 –Force
Запретить принимать незашифрованный трафик на сервере-свидетеле можно следующим образом:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SMBWitness Parameters" Flags -Value 1 –Force
Исходные документы:
SMB Transparent Failover – making file shares continuously available