Рекомендации по балансировке нагрузки для постоянства


8

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

Наша текущая балансировка нагрузки выполняется на двух уровнях, сначала мы используем циклический DNS для рекламы нескольких записей A для нашего адреса api.company.com. На каждом IP- адресе мы размещаем Linux LVS: http://www.linuxvirtualserver.org/ , балансировщик нагрузки, который просматривает исходный IP-адрес запроса, чтобы определить, к какому API-серверу передать соединение. Эти блоки LVS настроены с heartbeatd для передачи внешних VIP и IP-адресов внутренних шлюзов друг от друга.

В последнее время мы увидели два новых условия ошибки.

Первая ошибка - это когда клиенты колеблются или переходят с одного LVS на другой, в середине загрузки. Это, в свою очередь, приводит к тому, что наши балансировщики нагрузки теряют постоянное соединение и отправляют трафик на новый сервер API, тем самым разбивая загрузку по частям на два или более серверов. Мы стремились к тому, чтобы значение DNS TTL Round Robin для нашего api.company.com (которое мы установили равным 1 часу) учитывалось нижестоящими серверами имен кэширования, уровнями кэширования ОС и уровнями клиентских приложений. Эта ошибка возникает примерно для 15% наших загрузок.

Вторая ошибка мы видели гораздо реже. Клиент инициирует трафик к блоку LVS и направляется на реальный сервер A за ним. После этого клиент войдет через новый IP-адрес источника, который блок LVS не распознает, тем самым перенаправляя текущий трафик на реальный сервер B также за этим LVS.

Учитывая нашу архитектуру, как описано выше, я хотел бы знать, что люди воспринимают с лучшим подходом, который позволит нам более изящно обрабатывать каждый из описанных выше случаев ошибок?

Изменить 3/5/2010:

Это похоже на то, что нам нужно. Взвешенное хэширование GSLB на IP-адресе источника.

http://www.brocade.com/support/Product_Manuals/ServerIron_ADXGlobalServer_LoadBalancingGuide/gslb.2.11.html#271674


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

Ответы:


11

Каноническое решение этой проблемы - не полагаться на IP-адрес конечного пользователя, а вместо этого использовать балансировщик нагрузки уровня 7 (HTTP / HTTPS) с помощью «Sticky Sessions» через cookie.

Липкие сеансы означают, что балансировщик нагрузки будет всегда направлять данного клиента на один и тот же внутренний сервер. Через cookie означает, что балансировщик нагрузки (который сам по себе является полностью работоспособным устройством HTTP) вставляет cookie (который балансировщик нагрузки создает и управляет автоматически), чтобы запомнить, какой внутренний сервер должен использовать данное HTTP-соединение.

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

Практически каждый балансировщик нагрузки уровня 7 должен это делать. В Unix / Linux распространенными примерами являются nginx, HAProxy, Apsis Pound, Apache 2.2 с mod_proxy и многие другие. В Windows 2008+ есть маршрутизация запросов приложений Microsoft. Как приборы, Coyote Point, loadbalancer.org, Kemp и Barracuda распространены в низком пространстве; и F5, Citrix NetScaler и другие в high-end.

У Вилли Тарро, автора HAProxy, есть хороший обзор методов балансировки нагрузки .

О DNS Round Robin:

Мы стремились, чтобы значение TTL Round Robin DNS для нашего api.company.com (которое мы установили равным 1 часу) было выполнено нижестоящими серверами имен кэширования, уровнями кэширования ОС и уровнями клиентских приложений.

Не будет . А DNS Round Robin не очень подходит для балансировки нагрузки . И если ничто иное не убеждает вас, имейте в виду, что современные клиенты могут предпочесть один хост всем остальным из-за совпадения самого длинного префикса. закрепления , поэтому, если мобильный клиент меняет IP-адрес, он может выбрать другой хост RR.

По сути, можно использовать циклический перебор DNS в качестве грубого распределения нагрузки, указав 2 или более записей RR на высокодоступных IP-адресах, которые обрабатываются реальными балансировщиками нагрузки в активной / пассивной или активной / активной HA. И если это то, что вы делаете, то вы могли бы также обслуживать эти записи DNS RR с длинными значениями времени жизни, поскольку соответствующие IP-адреса уже доступны.


Спасибо. Мы находимся в активном / активном режиме с LVS. IP-адреса являются высокодоступными, и мы имеем большой контроль над клиентами, так как пишем их сами, и они полагаются на наш сервер API, который не является полностью безлимитным, как описано выше. Я проверил проблему кэширования на уровне ОС на своем компьютере с Linux (на нем не включено кэширование), а также на моем ноутбуке Mac OSX дома (он кэшируется на уровне ОС, который «привязывает» IP к одному результату или другому ).
dmourati

В итоге я написал свой собственный DNS-сервер, чтобы решить проблему с циклическим перебором. Он смотрит на исходный IP-адрес и использует хеш для ответа на непротиворечивую запись. Кажется, работает и уменьшил нашу проблему «поп-переключателя» в 10 раз.
dmourati

4

Чтобы ответить на ваш вопрос об альтернативах: Вы можете получить сплошную балансировку нагрузки на уровне 7 через HAProxy .

Что касается решения проблем схожести с LVS, я немного не уверен в твердых идеях. Это может быть так просто, как тайм-аут или переполнение. Некоторые мобильные клиенты будут переключать IP-адреса, когда они подключены к сети; возможно это может быть источником твоих бед? Я бы предложил, по крайней мере, распространить гранулярность сродства хотя бы на класс C.


HAProxy был определенно в моих взглядах. Я прочитал довольно интересную статью о балансировке нагрузки L4 v L7. blog.loadbalancer.org/why-layer-7-sucks Мое мнение : я хотел бы оставить это в руках приложения. Любые дополнительные «смарты», которые я добавляю в слой LB, просто должны быть исправлены / переадресованы при изменении нашего приложения. Решение проблемы в самом приложении означает, что мы можем оптимизировать и настроить вещи в LB, оставаясь при этом уверенными в том, что даже если будет ошибка LB, мы все равно получим данные.
Дмурати

@dmourati: Извините, но эта запись в блоге полна неточных предположений. Не слепо следуйте этому. Абсолютно верно, что архитектура «ничего не поделена» для серверов веб-приложений является «лучшей». В этом случае вы должны использовать Round Robin или Random Load Balancing. Но если вы загружаете HTTP объемом несколько ГБ, у вас есть долгоживущие HTTP-разговоры, а балансировщик нагрузки HTTP просто лучше понимает этот длинный HTTP-обмен и действует правильно. Использование балансировщика HTTP не мешает сделать код вашего внутреннего приложения «умнее», вы все равно можете это сделать в любое время.
Джеспер М
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.