Кластерная технология балансировки нагрузки сети (Network Load Balancing), включенная в операционные системы Microsoft® Windows® 2000 Advanced Server и Datacenter Server, повышает масштабируемость и отказоустойчивость критически важных служб, работающих по протоколам TCP/IP, таких как веб-сервер, службы терминалов, службы виртуальных частных сетей и потокового мультимедийного вещания. Служба балансировки нагрузки, являющаяся компонентом ОС Windows 2000, функционирует на всех узлах кластера и не требует для работы специального оборудования. Для обеспечения масштабируемости производительности служба БНС (Балансировка нагрузки сети, Network Load Balancing) распределяет поток данных, передаваемых по протоколу IP, между несколькими узлами кластера. Помимо этого, служба обеспечивает высокую отказоустойчивость, автоматически обнаруживая сбои узлов и перераспределяя поток данных среди оставшихся. Служба БНС включает функции удаленного управления и позволяет осуществлять чередующиеся обновления для ОС Windows NT® 4.0 и более поздних версий.
Уникальная, полностью распределенная архитектура службы БНС позволяет обеспечивать высочайшую производительность и защиту от сбоев, особенно по сравнению с технологиями распределения нагрузки на основе диспетчеризации. В данном документе подробно описаны основные функции службы балансировки нагрузки, ее внутреннее устройство и параметры производительности.
Архитектура службы балансировки нагрузки сети
Для достижения максимальной пропускной способности и отказоустойчивости служба БНС использует полностью распределенную программную архитектуру. На всех узлах кластера параллельно выполняются одинаковые драйверы службы БНС. Эти драйверы объединяют все узлы в единую сеть для обработки входящего потока данных, поступающих на основной IP-адрес кластера (и на дополнительные IP-адреса многосетевых узлов). Для каждого отдельного узла драйвер выполняет функции фильтра между драйвером сетевого адаптера и стеком протоколов TCP/IP, позволяя распределять поток данных, получаемых узлом. Таким образом, поступающие запросы разделяются и распределяются между узлами кластера.
Рисунок 1 - Узел кластера. Ядро Windows 2000
Служба БНС функционирует как сетевой драйвер, расположенный в сетевой модели ниже высокоуровневых протоколов приложений, таких как HTTP и FTP.
Такая архитектура позволяет добиться максимальной пропускной способности за счет использования широковещательной подсети для доставки поступающих данных на все узлы кластера, которая позволяет обойтись без маршрутизации входящих пакетов. Поскольку фильтрация ненужных пакетов работает быстрее, чем маршрутизация (при которой необходимо получить, проверить, перезаписать и повторно отправить каждый пакет), при использовании службы БНС достигается более высокая пропускная способность сети по сравнению с решениями на основе диспетчеризации. При росте скорости работы сервера и сети пропорционально растет и производительность; таким образом устраняется зависимость от производительности аппаратных решений для распределения нагрузки на основе маршрутизации. Например, в гигабитных сетях служба БНС демонстрирует пропускную способность до 250 Мб/с.
Другим ключевым преимуществом полностью распределенной архитектуры службы БНС являются превосходные показатели отказоустойчивости (N–1) для кластера с N узлами. Напротив, в решениях на основе диспетчеризации обязательно имеется центральный элемент, являющийся «узким местом» системы, для устранения которого необходимо использовать резервный диспетчер, обеспечивая лишь однонаправленное перемещение нагрузки при сбое. Такая защита от сбоя менее эффективна по сравнению с полностью распределенной архитектурой.
В архитектуре службы БНС для одновременной доставки поступающих данных на каждый узел кластера используется концентратор и/или коммутатор подсети. Тем не менее, такой подход ведет к увеличению нагрузки на коммутаторы и требует дополнительных ресурсов пропускной способности портов. (Сведения о показателях производительности при использовании коммутаторов см. в разделе «Производительность балансировки нагрузки сети»). Обычно это не влияет на большинство широко используемых приложений (например, веб-службы и мультимедиа-вещание), поскольку входящие данные составляют очень небольшую долю общего потока данных в сети. Тем не менее, если пропускная способность линии связи к коммутатору со стороны клиента значительно выше пропускной способности канала со стороны сервера, входящие данные могут составлять весьма значительную часть общего потока данных. Та же проблема возникает и при подключении нескольких кластеров к одному коммутатору, когда для отдельных кластеров не настроены виртуальные локальные сети LAN.
Полностью конвейерный механизм службы БНС при поступлении пакетов одновременно передает их в стек протоколов TCP/IP и получает пакеты от драйвера сетевого адаптера. Это снижает общее время обработки потока данных и задержку, поскольку стек TCP/IP может обрабатывать пакет одновременно с получением драйвером NDIS следующего пакета. Кроме того, требуется меньше ресурсов для координации операций стека TCP/IP и драйвера, а также, в большинстве случаев, в памяти не создаются дополнительные копии пакетов данных. При отправке пакетов служба БНС также обеспечивает повышенную пропускную способность, малое время задержки и отсутствие накладных издержек производительности за счет увеличения числа пакетов TCP/IP, которые могут быть отправлены за один вызов NDIS. Для достижения столь высокой производительности служба БНС использует пул буферов и дескрипторов пакетов, используемый для конвейерных операций со стеком TCP/IP и драйвером NDIS.
Распределение потока данных кластера
Для распределения входящего потока данных между всеми узлами кластера служба БНС использует широковещательные или многоадресные пакеты протокола второго уровня. В используемом по умолчанию одноадресном режиме служба БНС переназначает аппаратный (MAC) адрес сетевого адаптера, для которого она включена (называемого адаптером кластера), и всем узлам в кластере назначается один MAC-адрес. Таким образом, поступающие пакеты принимаются всеми узлами кластера и передаются службе БНС для фильтрации. Для обеспечения уникальности MAC-адрес формируется на основании основного IP-адреса кластера, указанного на странице свойств службы БНС. Для основного IP-адреса 1.2.33.44 будет использоваться MAC-адрес одноадресного режима 02-BF-11-2-33-44. Служба БНС автоматически изменяет МАС-адрес адаптера кластера путем внесения изменения в реестр и последующей перезагрузки драйвера адаптера; при этом не требуется перезапуск операционной системы.
Если узлы кластера подключены к коммутатору, а не к концентратору, использование общего MAC-адреса может вызвать конфликт, поскольку коммутаторы второго уровня способны работать только с уникальными MAC-адресами источников на всех портах. Для устранения данной проблемы служба БНС модифицирует MAC-адрес источника в исходящих пакетах; MAC-адрес кластера 02-BF-11-2-33-44 преобразуется в адрес вида 02-h-11-2-33-44, где h — приоритет узла внутри кластера (задается в окне свойств службы БНС). Таким образом, коммутатору не передается фактический MAC-адрес кластера, и в результате поступающие в кластер пакеты данных доставляются на все порты коммутатора. Если узлы кластера подключены вместо коммутатора непосредственно к концентратору, в одноадресном режиме службы БНС маскировку исходного MAC-адреса можно отключить, чтобы заблокировать лавинную маршрутизацию исходящих пакетов в коммутаторе. Отключение маскировки производится путем присвоения в реестре параметру MaskSourceMAC службы БНС значения 0. Использование коммутатора исходящих данных по протоколу третьего уровня позволяет также избежать лавинной маршрутизации.
У одноадресного режима работы службы БНС имеется побочный эффект блокирования непосредственной связи между сетевыми адаптерами узлов кластера. Поскольку исходящие пакеты, отправляемые другому узлу кластера, посылаются на MAC-адрес, совпадающий с адресом отправителя, эти пакеты возвращаются отправителю сетевым стеком и никогда не попадут в сеть. Это ограничение можно обойти, установив в каждый сервер кластера второй сетевой адаптер. В таком случае служба БНС обрабатывает данные только от сетевого адаптера подсети, от которого поступают клиентские запросы, а второй адаптер, как правило, подключается к отдельной подсети, предназначенной для связи с другими узлами и серверами файлов и баз данных. Для ритмических сообщений и удаленного управления используется только сетевой адаптер кластера.
Следует отметить, что ограничения одноадресного режима службы БНС не влияют на подключения узлов кластера к узлам, не включенным в кластер. Поток данных из сети, поступающий на выделенный IP-адрес (на адаптер кластера), получают все узлы кластера, поскольку они используют одинаковый MAC-адрес. Поскольку служба БНС никогда не передает распределенные данные на выделенный IP-адрес кластера, они доставляются непосредственно стеку протоколов TCP/IP узла-адресата. На других узлах служба БНС обрабатывает эти пакеты как уже распределенный поток данных (поскольку IP-адрес получателя не совпадает с выделенными IP-адресами других узлов): они могут быть переданы стеку TCP/IP, который их отклонит. Передача чрезмерного объема данных на выделенные IP-адреса при работе в одноадресном режиме может привести к падению производительности, поскольку стек TCP/IP вынужден отклонять большое количество «чужих» пакетов.
Поэтому в службе БНС имеется второй режим, обеспечивающий распределение входящего потока данных всем узлам кластера. При использовании многоадресного режима вместо изменения МАС-адреса адаптера кластера ему присваивается широковещательный адрес второго уровня. Основному IP-адресу кластера 1.2.33.44 будет при этом соответствовать широковещательный MAC-адрес03-BF-11-2-33-44. Поскольку у каждого узла сохраняется уникальный МАС-адрес, в этом режиме нет необходимости устанавливать второй сетевой адаптер для связи между узлами кластера. В нем также отсутствует падение производительности при использовании выделенных IP-адресов.
Для одновременной доставки входящего потока данных всем узлам кластера в однонаправленном режиме работы службы БНС используется лавинная маршрутизация (доставка пакетов во все порты коммутатора, кроме исходного). При использовании многоадресного режима коммутаторы также во многих случаях отправляют пакеты во все порты для доставки широковещательных данных. Тем не менее, в многоадресном режиме системный администратор имеет возможность ограничить лавинную маршрутизацию, настроив в коммутаторе виртуальную сеть для портов, относящихся к узлам кластера. Это может быть сделано путем ручной настройки коммутатора или с помощью протоколов IGMP (Internet Group Management Protocol, межсетевой протокол управления группами) и GARP. Текущая версия службы БНС не имеет автоматической поддержки протоколов IGMP и GMRP.
Она поддерживает протокол ARP (Address Resolution Protocol, протокол разрешения адресов), необходимый для разрешения основного IP-адреса и других виртуальных IP-адресов в широковещательный MAC-адрес кластера. (Выделенный IP-адреспо-прежнему разрешается в МАС-адрес адаптера кластера.) Опыт показывает, что маршрутизаторы Cisco не принимают сигнал ARP от кластера, разрешающего однонаправленные IP-адреса в широковещательные MAC-адреса. Эту проблему можно обойти, добавив в маршрутизатор статическую запись ARP для каждого виртуального IP-адреса. Широковещательный МАС-адрес можно посмотреть в окне свойств службы БНС или с помощью программы удаленного управления Wlbs.exe. В используемом по умолчанию однонаправленном режиме данная проблема отсутствует, поскольку MAC-адрес кластера совпадает с однонаправленным MAC-адресом.
Служба БНС не управляет никакими входящими пакетами данных, кроме данных по протоколам TCP, UDP и GRE (часть потока данных PPTP) для указанных портов. Она не фильтрует данные по протоколам IGMP, ARP (за исключением указанных выше), ICMP или другим IP-протоколам. Все данные по этим протоколам передаются стеку TCP/IP в неизменном виде на всех узлах кластера. В результате для некоторых TCP/IP-программ «точка-точка» (например, ping) при использовании IP-адреса кластера могут генерироваться дублирующиеся отклики. Благодаря надежности протокола TCP/IP и его способности обрабатывать дублированные датаграммы, другие протоколы продолжают правильно работать в кластере. Чтобы избежать данной проблемы, для таких программ можно использовать выделенный IP-адрес.
Алгоритм балансировки нагрузки
Для распределения подключаемых клиентов между узлами кластера служба БНС использует полностью распределенный алгоритм фильтрации. Этот алгоритм был выбран для предоставления узлам кластера возможности быстро и независимо друг от друга принимать решения о распределении нагрузки для каждого входящего пакета. Алгоритм был оптимизирован для обеспечения статистически равномерного распределения нагрузки по большому количеству клиентских узлов, выполняющих постоянные, относительно небольшие запросы (такой тип нагрузки типичен, например, для веб-серверов). Когда количество клиентов невелико и/или объем запросов клиентов меняется в широких пределах, алгоритм распределения нагрузки службы БНС менее эффективен. Тем не менее, простота и скорость работы этого алгоритма позволяют обеспечивать очень высокую производительность, высокую пропускную способность и низкое время отклика для различных типов приложений клиент/сервер.
Служба БНС распределяет поступающие клиентские запросы, направляя определенный процент новых запросов каждому узлу кластера. Процент распределяемой загрузки задается в окне «Свойства балансировки нагрузки сети» для каждого диапазона номеров портов, нагрузку которых необходимо распределять. Алгоритм не способен адаптироваться к изменениям нагрузки каждого узла кластера (в отличие от нагрузки ЦП и использования памяти). Однако сопоставление меняется при изменении количества узлов кластера, в соответствии с которым меняются проценты распределения нагрузки.
При анализе поступающего пакета все узлы одновременно выполняют статическое сопоставление для быстрого выбора узла, который будет обрабатывать пакет. Для сопоставления используется функция случайного выбора, рассчитывающая приоритет узла на основании IP-адреса клиента, номера порта и других данных о состоянии, поддерживаемых для оптимизации распределения нагрузки. Выбранный узел передает пакет из сетевого стека в стек TCP/IP, а другие узлы отклоняют этот пакет. Схема сопоставления меняется только при изменениях состава узлов кластера; в результате комбинация определенного IP-адреса клиента и номера порта всегда сопоставлена одному узлу кластера. Однако узел кластера, которому сопоставлен IP-адрес и порт клиента, нельзя определить заранее, так как функция случайного выбора учитывает текущее и прошлое членство в кластере для минимизации изменений схемы сопоставления.
В алгоритме распределения нагрузки предполагается, что IP-адреса и номера портов клиентов (когда не используется режим привязки клиентов) статистически не связаны. Такое предположение может перестать соответствовать действительности, если на стороне сервера используется брандмауэр, который преобразует адреса клиентов в один IP-адрес, и одновременно включена привязка клиентов. В таком случае все клиентские запросы будут обрабатываться одним узлом кластера, а служба распределения загрузки функционировать не будет. Тем не менее, если привязка клиентов не используется, разброс номеров портов клиентов даже при использовании брандмауэра обычно способен обеспечить хорошее распределение нагрузки.
Как правило, качество распределения статистически определяется количеством клиентов, выполняющих запросы. Такое поведение напоминает подбрасывание монеты, две стороны которой соответствуют количеству узлов кластера (в данной аналогии в кластере два узла), а число бросков соответствует количеству клиентских запросов. Распределение нагрузки улучшается с увеличением количества запросов, подобно тому, как процент бросков монеты, когда выпадает «орел», стремится к 50 с увеличением числа бросков. На практике при включенном режиме привязки для равномерного распределения нагрузки количество клиентов должно значительно превышать количество узлов.
Вследствие стохастического характера набора клиентов могут наблюдаться незначительные временные изменения равномерности распределения нагрузки. Следует отметить, что достижение абсолютно равномерного распределения нагрузки между всеми узлами кластера потребовало бы значительного увеличения производительности (пропускной способности и времени отклика), которые расходовались бы на измерение и реакцию на колебания нагрузки. Стоимость ресурсов, которые дополнительно потребовались для этого, следует сопоставить с потенциальными преимуществами максимально оптимального использования ресурсов узлов кластера (в основном ресурсов ЦП и оперативной памяти). В любом случае необходимо обеспечить избыточность ресурсов кластера для обеспечения обработки нагрузки в случае сбоя одного из узлов. В службе БНС используется простой, но в тоже время эффективный алгоритм распределения нагрузки, обеспечивающий максимально возможную производительность и отказоустойчивость.
Параметры привязки клиентов службы БНС реализованы за счет изменения входных данных алгоритма статического сопоставления. При выборе привязки клиентов в окне «Свойства балансировки нагрузки сети» номера портов клиентов не используются для сопоставления. Поэтому все запросы от одного клиента всегда направляются на один узел кластера. Необходимо отметить, что для этого ограничения значение времени ожидания не указывается (как это обычно бывает в решениях с диспетчеризацией), и это сопоставление будет действовать вплоть до изменения состава кластера. При выборе режима привязки одного клиента алгоритм сопоставления использует полный IP-адрес клиента. Однако при выборе режима привязки адресов класса C алгоритм использует только часть адреса клиента, относящуюся к классу С (первые 24 разряда). Таким образом, все клиенты из одного адресного пространства класса С сопоставлены одному узлу кластера.
При сопоставлении клиентов узлам служба БНС не может непосредственно отслеживать границы сеансов (таких, как сеансы по протоколу SSL), поскольку решения о распределении нагрузки принимаются при установлении подключений TCP до поступления пакетов, содержащих данные сетевых приложений. Кроме того, служба не способна отслеживать границы потоков по протоколу UDP, поскольку границы логических сеансов определяются приложениями. Вместо этого параметры привязки службы БНС используются для поддержания сеансов клиентов. При сбое или отключении узла от кластера все подключения клиентов к нему разрываются. После определения нового состава кластера с помощью процедуры схождения (см. ниже) клиенты, которые были сопоставленные выбывшему узлу, сопоставляются одному из оставшихся узлов. При этом сбой не влияет на сеансы всех остальных клиентов, которых кластер продолжает бесперебойно обслуживать. Таким образом, алгоритм распределения нагрузки минимизирует перерывы в обслуживании клиентов при сбое.
При включении в кластер нового узла инициируется процедура схождения для учета нового члена кластера. После завершения схождения новому узлу сопоставляется минимум клиентов. Служба БНС отслеживает TCP-подключения к каждому узлу, и после завершения текущих подключений следующие подключения затрагиваемых клиентов будут обрабатываться новым узлом. Обработка UDP-потоков новым узлом начинается немедленно. Это может привести к разрыву некоторых клиентских сеансов, включающих несколько подключений или UDP-потоков. Следовательно, узлы необходимо добавлять в кластер в моменты, когда это приведет к разрыву минимального количества сеансов. Чтобы полностью устранить эту проблему, состояние сеансов должно управляться серверными приложениями, чтобы иметь возможность восстановить или возобновить сеанс с любого узла кластера. Например, состояние сеанса может передаваться серверу внутренней базы данных или сохраняться на стороне клиента в файлах cookie. Состояние SSL-сеансов восстанавливается автоматически путем повторной аутентификации клиента.
GRE-поток внутри протокола PPTP — это особый случай сеанса, на который не влияет добавление нового узла в кластер. Поскольку GRE-поток ограничен в пределах длительности управляющего TCP-сеанса, служба БНС отслеживает этот поток совместно с управляющим сеансом. Таким образом, предотвращается разрыв туннельного подключения PPTP при добавлении нового узла.
Схождение
Узлы кластера, работающего под управлением службы БНС, периодически обмениваются многоадресными или широковещательными ритмическими сообщениями. Это позволяет контролировать состояние кластера. При изменении состояния кластера (сбое, отключении или включении нового узла) служба БНС инициирует процесс, называемый схождением, при котором узлы обмениваются ритмическими сообщениями для определения нового узла, текущего состояния кластера и выбора узла с наиболее высоким приоритетом в качестве нового основного узла. При достижении узлами соглашения о текущем состоянии кластера изменения членства в кластере после схождения заносятся в журнал событий Windows 2000.
В процессе схождения узлы продолжают обрабатывать входящий поток данных в обычном режиме, за исключением запросов к вышедшему из строя узлу, которые временно не обслуживаются. Запросы клиентов к работающим узлам обрабатываются как обычно. Процедура схождения заканчивается, когда все узлы сообщают об одинаковом представлении состава кластера в течение нескольких циклов ритмических сообщений. При попытке включить в кластер узел с несогласованными правилами портов или со значением приоритета, которое уже используется одним из узлов, процедура схождения не будет завершена. Таким образом, предотвращается передача части потока данных кластера неправильно настроенному узлу.
После завершения схождения поток данных клиентов перераспределяется между оставшимися узлами. Если узел был добавлен в кластер, процедура схождения позволяет ему начать обработку своей части распределенной нагрузки сети. Расширение состава кластера не влияет на текущие операции и осуществляется полностью прозрачно как для удаленных клиентов, так и для серверных приложений. Однако оно может повлиять на подключения клиентов, поскольку в процессе расширения между подключениями клиенты могут быть сопоставлены другим узлам кластера (см. выше).
В одноадресном режиме ритмические сообщения рассылаются каждым узлом широковещательно, а в многоадресном режиме — многоадресно. Каждое ритмическое сообщение занимает один кадр Ethernet и помечено основным IP-адресом кластера, чтобы обеспечить возможность работы нескольких кластеров внутри одной подсети. Ритмическим сообщениям назначается либо настраиваемое значение, либо шестнадцатеричное значение 886F. По умолчанию период отправки ритмических сообщений равен одной секунде. Это значение можно изменить с помощью параметра реестра AliveMsgPeriod. При выполнении процедуры схождения для ускорения процесса период отправки сообщения снижается вдвое. Даже в больших кластерах полоса пропускания, занимаемая ритмическими сообщениями, крайне невелика (например, 24 КБ/с в 16-узловом кластере).
При работе службы БНС предполагается, что узел кластера функционирует правильно до тех пор, пока он участвует в обмене ритмическими сообщениями между узлами кластера. Если другие узлы не получают от одного из серверов ритмические сообщения в течение нескольких периодов обмена сообщениями, запускается процедура схождения. Количество пропущенных сообщений, после которого начинается схождение, по умолчанию равно пяти, однако его можно изменить с помощью параметра реестра AliveMsgTolerance.
При получении ритмического сообщения от нового узла или противоречивого сообщения, свидетельствующего о проблемах в распределении загрузки, процедура схождения запускается немедленно. После получения ритмического сообщения от нового узла каждый узел проверяет, не обрабатывают ли другие узлы запросы от тех же клиентов. Такая ситуация может возникать при объединении подсети кластера после разделения. Скорее всего, для нового узла уже было выполнено схождение в отделенном фрагменте и он не получает данных от клиентов. Такая ситуация возможна, если коммутатор вносит заметную задержку в подключение узла к подсети. Если узел кластера определяет эту проблему, а другой узел после последней процедуры схождения получил большее число подключений клиентов, он немедленно прекращает обработку клиентских данных для заданного диапазона портов. Поскольку оба узла обмениваются ритмическими сообщениями, узел, на который приходится большее количество подключений, продолжает обрабатывать запросы, а другой узел ожидает завершения схождения, чтобы начать обработку своей части нагрузки. Такой эвристический алгоритм устраняет возможные конфликты распределения загрузки при объединении разделенного ранее кластера. Данное событие заносится в журнал.
Удаленное управление
Механизм удаленного управления службой БНС использует протокол UDP по порту 2504. Его датаграммы отправляются на основной IP-адрес кластера. Поскольку датаграммы обрабатываются драйверами службы балансировки нагрузки на каждом узле кластера, они должны направляться в подсеть кластера (а не в подсеть, к которой подключен кластер). Команды удаленного управления, отдаваемые в пределах кластера, передаются в локальную подсеть кластера в виде