Агрегирование как способ повышения производительности и надежности.

Oбъединение физических каналов (Link Aggregation) между двумя коммуникационными устройствами в один логический канал позволяет активно задействовать избыточные альтернативные связи в локальных сетях. В данном контексте термин «локальные сети» служит для обозначения технологий канального уровня, наподобие Ethernet, и необходимых для их работы устройств — коммутаторов, сетевых адаптеров и маршрутизаторов (в последнем случае имеется в виду соответствующий слой аппаратного и программного обеспечения).

Именно на канальном уровне протоколов локальных сетей проявляются особенности использования избыточных связей, такие, как дублирование и зацикливание кадров в петлевидных маршрутах. И хотя эти проблемы могут быть решены на более высоком сетевом уровне маршрутизаторами IP/IPX и программными средствами операционных систем, поддержка избыточных связей столь экономичными и широко распространенными устройствами локальных сетей, как коммутаторы второго уровня, обладает рядом преимуществ. Прежде всего, это снижение стоимости сети, так как многие ее участки строятся без привлечения относительно дорогих маршрутизаторов (коммутаторов третьего уровня). Кроме того, скорость реакции на обрыв связи часто повышается.

Агрегирование каналов применяется достаточно широко наряду с другим, принципиально отличающимся, способом использования избыточных связей — алгоритмом построения покрывающего дерева (Spanning Tree Algorithm, STA). Он переводит избыточные связи в «горячий» резерв, оставляя в рабочем состоянии только минимальный набор каналов, необходимый для обеспечения связности сегментов сети (см. «Резервирование соединений в локальных сетях», «Журнал сетевых решений/LAN», январь 2002 г.). В этом случае повышается надежность сети, поскольку при отказе какого-либо соединения в строй автоматически вводятся резервные связи, и через небольшой промежуток времени работоспособность сети восстанавливается.

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

Рисунок 1. Агрегирование физических каналов.
ЛОГИЧЕСКИЙ КАНАЛ

Агрегирование каналов может применяться для связи как между двумя коммутаторами локальной сети или между портами маршрутизатора, так и между компьютером и коммутатором (чаще всего последний вариант используется для высокоскоростных и ответственных серверов). В двух последних случаях все сетевые адаптеры или порты маршрутизатора, которые входят в транк, имеют один и тот же сетевой адрес (или одни и те же адреса, так как транк, подобно обычному порту/адаптеру, может иметь их несколько). Поэтому для протокола IP или другого протокола сетевого уровня порты транка неразличимы, что соответствует концепции единого логического канала, лежащей в основе агрегирования.

Очевидно, что агрегирование каналов приводит к повышению и производительности (вместо одного канала одновременно используется несколько), и надежности. Но все современные методы агрегирования обладают существенным ограничением — они принимают во внимание только связи между двумя соседними коммутаторами, полностью игнорируя все, что происходит вне этого участка сети. Например, работа транка 1 никак не координируется с работой транка 2 и не учитывает наличие обычной связи между коммутаторами 2 и 3, которая вместе с транками 1 и 2 создает петлю. Поэтому агрегирование каналов нужно применять одновременно с алгоритмом покрывающего дерева — если администратору сети необходимы все топологические возможности объединения узлов сети. Для алгоритма STA транк должен выглядеть как одна связь, тогда все его вычисления останутся в силе.

Механизм агрегирования каналов имеет большое количество нестандартных реализаций. Наиболее популярные принадлежат, естественно, лидерам в секторе оборудования для локальных сетей. Это Fast EtherChannel и Gigabit EtherChannel компании Cisco, MultiLink Trunking компании Nortel, Adaptive Load Balancing компании Intel и ряд других. Стандарт IEEE 802.ad Link Aggregation обобщает эти подходы.

ПРОБЛЕМЫ, ПРОБЛЕМЫ...

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

Рисунок 2. «Размножение» пакетов с неизученным адресом при использовании параллельных каналов между коммутаторами.

Рисунок 2 иллюстрирует поведение коммутатора 1 по отношению к параллельным соединениям. В том случае, когда они не рассматриваются данным коммутатором как агрегированный канал, проблемы возникают с кадрами двух типов: когда они имеют, во-первых, неизученные коммутатором уникальные адреса, и, во-вторых, широковещательный или групповой адрес.

B соответствии с алгоритмом прозрачного моста коммутатора должен передать кадр с неизученным (отсутствующим в таблице продвижения) адресом на все порты, за исключением того, с которого кадр был принят. При наличии параллельных каналов такой кадр будет «размножен» в количестве, равном числу каналов. В приведенном примере коммутатор 2 примет четыре копии оригинального кадра.

Если коммутатор 2 уже изучил адрес назначения МАС9, то он передаст каждую копию кадра узлу назначения через один порт, а если нет — то через все, в том числе и через порты параллельных каналов (естественно, кроме того, с которого кадр получен, так что кадр 1 в таком случае поступит на порты P18, P19 и P10 коммутатора 1). В последнем случае произойдет также зацикливание кадров — они будут постоянно циркулировать между двумя коммутаторами, причем удалить их из сети невозможно, поскольку в кадрах канального уровня отсутствует поле «срок жизни», часто используемое в протоколах верхних уровней, например в IP и IPX.

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

Еще больше проблем создают кадры с широковещательным адресом — они всегда должны передаваться на все порты, кроме исходного, и будут постоянно зацикливаться, так что в любом случае «засорение» сети посторонним трафиком окажется значительным.

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

БОРЬБА С «РАЗМНОЖЕНИЕМ»

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

Рисунок 3. Распределение потоков по каналам транков.

В примере, изображенном на Рисунке 3, в таблице продвижения вместо портов P17, P18, P19 и P10 фигурирует логический порт AL11. С ним связаны адреса всех узлов, путь к которым лежит через коммутатор 2. Выявление неизвестного адреса на любом из физических портов, входящих в транк, приводит к появлению в таблице продвижения коммутатора новой записи с идентификатором логического порта. Поступающий в коммутатор кадр, адрес назначения которого изучен и связан с идентификатором логического порта, передается на один (и только один!) выходной физический порт, входящий в состав транка. Точно так же коммутатор поступает с неизученными, широковещательными и групповыми адресами — для передачи кадра используется только одна из связей. На порты коммутатора, не входящие в транк, это изменение в логике обработки кадров не распространяется: так, коммутатор 1 всегда передает кадр с неизученным или широковещательным адресом на порты P11-P16.

Благодаря такому решению, кадры не дублируются, и описанные сложности не возникают. Правда, это справедливо только тогда, когда оба коммутатора рассматривают каналы как транк, в противном случае часть проблем остается. Например, если коммутатор 2 не считает связи транком, то кадр с неизвестным для коммутатора 2 адресом назначения будет им размножен и отправлен обратно коммутатору 1 в трех копиях. Поэтому полностью задействовать свойства транка можно лишь при его соответствующей двусторонней конфигурации.

ОДИН ЗА ВСЕХ — НО КАКОЙ ИМЕННО?

Остается открытым вопрос — какой из портов коммутатора предпочтителен для продвижения кадра через транк? Можно предложить несколько вариантов ответа. Так как агрегирование каналов предназначено для повышения суммарной производительности участка сети между двумя коммутаторами (или коммутатором и сервером), то желательно кадры распределять по портам транка динамически, направляя их в наименее загруженные порты (с меньшей длиной очереди).

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

В то же время производительность целого ряда протоколов может заметно снижаться, если пакеты сеанса между двумя конечными узлами будут приходить не в том порядке, в котором они отправлены узлом-источником. А такая ситуация может возникнуть, если два или более смежных по отношению к сеансу кадра станут передаваться через разные порты транка из-за неодинаковой длины очередей в их буферах и, как следствие, неравномерной задержки передачи кадра, так что более поздний кадр обгонит своего предшественника.

Если протоколы стека IP (например, TCP) толерантны к неупорядоченности приходящих пакетов, то протоколы стека IPX и DECnet резко теряют полезную производительность, считая такие события потерей пакета и запрашивая его повторную передачу. Поэтому в большинстве реализаций механизмов агрегирования используются методы статического, а не динамического распределения кадров по портам.

Статическое распределение подразумевает закрепление за определенным портом транка потока кадров определенного сеанса между двумя узлами, в этом случае все кадры будут проходить через одну и ту же очередь и последовательность их не изменится. Обычно при статическом распределении выбор порта для конкретного сеанса выполняется на основании некоторых признаков поступающих пакетов. Как правило, это МАС-адреса источника или назначения, либо оба вместе.

В популярной реализации Fast EtherChannel компании Cisco для коммутаторов семейства Catalyst 5000/6000 выбор номера порта транка осуществляется с помощью операции исключающего ИЛИ (XOR) над двумя последними битами МАС-адресов источника и приемника. Результат этой операции имеет четыре значения: 00, 01, 10 и 11, которые и являются условными номерами портов транка. На Рисунке 3 приведен пример сети, в которой работает механизм Fast EtherChannel (аналогично работает и Gigabit EtherChannel) для коммутаторов Catalyst 5000/6000. При этом распределение потоков сеанса между конечными узлами достаточно случайно. Так как оно не учитывает реальной нагрузки, которую создает каждый сеанс, то общая пропускная способность транка может использоваться нерационально, особенно если по интенсивности сеансы намного отличаются друг от друга. Кроме того, алгоритм распределения не гарантирует даже равномерного в количественном отношении распределения сеансов по портам.

Случайный набор МАС-адресов в сети может привести к тому, что через один порт будут проходить несколько десятков сеансов, а через другой — два-три. При данном алгоритме только большое количество компьютеров и сеансов между ними способно обеспечить равномерную нагрузку на порты. Это характерно для таких магистральных коммутаторов, как Catalyst 5000/6000.

Сеансы можно распределить между портами и другими способами: например, в соответствии с IP-адресами пакетов внутри кадров канального уровня, номерами виртуальных локальных сетей (VLAN), типами прикладных протоколов (почта по одному порту, трафик Web по другому и т. д.). Полезным оказывается назначение порту сеансов с МАС-адресами, изученными именно через этот порт, чтобы трафик сеансов проходил через один и тот же порт в обоих направлениях.

Чем больше признаков учитывает механизм распределения, тем более равномерно нагружаются порты транка и, следовательно, эффективнее функционирует транк. Некоторые реализации могут выполнять распределение с учетом текущей загрузки портов, но не для каждого отдельного пакета, а для всех пакетов сеансов. Такой способ, наряду с учетом номера порта, по которому изучен МАС-адрес назначения, применяется в механизмах Fast EtherChannel в коммутаторах Catalyst 2900X.

ВОССТАНОВЛЕНИЕ ПРИ ОТКАЗЕ

При отказе какого-либо канала транка все пакеты сеансов, назначенные для соответствующего порта, направляются на один из оставшихся портов. Обычно такое восстановление связности занимает от нескольких до десятков миллисекунд. Это объясняется тем, что во многих реализациях транка после отказа канала все связанные с ним МАС-адреса принудительно отмечаются как неизученные.

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

Наталья Олифер — обозреватель «Журналa сетевых решений/LAN». С ней можно связаться по адресу: olifer@lanmag.ru.