Мы запускаем веб-приложение, обслуживающее веб-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-адресе источника.