Посоветуйте load balancer
От: elmal  
Дата: 06.08.12 08:23
Оценка:
Интересует вопрос. Есть stateful веб сервис, развернут на томкате. Рассчитан на N пользователей. Нужно этот сервис отмасштабировать, чтоб он держал K*N пользователей.
Итого, нужен load balancer, который всегда определенного юзера гарантированно будет отправлять строго на определенный сервер, переключаясь на другой только в случае падения. То есть в моем случае (у меня spring security используется для аутентификации) нужно для каждого запроса прочитать данные аутентификации и в соответствии с этим перебросить запрос на соответствующий сервер. Такой балансер в принципе написать большого труда не составит, вот только вопрос — а нет ли какого балансера, который делает базовые вещи по балансировке, и который можно кастомизировать под мои требования?
Re: Посоветуйте load balancer
От: Gurney Великобритания www.kharlamov.biz
Дата: 06.08.12 08:52
Оценка:
Здравствуйте, elmal, Вы писали:

А почему вы не можете использовать Sticky sessions и любой стандартный load balancer?
Re[2]: Посоветуйте load balancer
От: elmal  
Дата: 06.08.12 09:14
Оценка:
Здравствуйте, Gurney, Вы писали:

G>А почему вы не можете использовать Sticky sessions и любой стандартный load balancer?

Может быть обращение двух пользователей с разных устройств одновременно. Пользователь один, а сессии разные. И это штатное поведение.
Re[3]: Посоветуйте load balancer
От: hrensgory Россия  
Дата: 06.08.12 09:51
Оценка:
On 06.08.2012 13:14, elmal wrote:

> G>А почему вы не можете использовать Sticky sessions и любой стандартный

> load balancer?
> Может быть обращение двух пользователей с разных устройств одновременно.
> Пользователь один, а сессии разные. И это штатное поведение.

Ну вы же их как-то отличаете, что это один пользователь? Если эти
отличия делаются на уровне ХТТП (по кукам, хидерам) — то реально научить
готовый лоад балансер (на базе apache, nginx) их отличать, если уже в
приложении — то только свой писать, наверное (как вариант — модуль для
того же apache или nginx).

--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Посоветуйте load balancer
От: elmal  
Дата: 06.08.12 10:22
Оценка:
Здравствуйте, hrensgory, Вы писали:

H>Ну вы же их как-то отличаете, что это один пользователь? Если эти

H>отличия делаются на уровне ХТТП (по кукам, хидерам) — то реально научить
H>готовый лоад балансер (на базе apache, nginx) их отличать, если уже в
H>приложении — то только свой писать, наверное (как вариант — модуль для
H>того же apache или nginx).
Увы, блин, в приложении. Вот думаю — а если сделать метод getSessionId который будет вычислять непосредственно хеш от данных аутентификации,и подменить sessionId. Интересно возможно ли такое, не пробовал такие хаки. Метод будет stateless, так что пофиг на какой сервер попадем вначале. А далее уже все стандартными средствами, sessionId не меняется.
Re: Посоветуйте load balancer
От: Аноним  
Дата: 06.08.12 10:27
Оценка:
Здравствуйте, elmal, Вы писали:

E>Интересует вопрос. Есть stateful веб сервис, развернут на томкате. Рассчитан на N пользователей. Нужно этот сервис отмасштабировать, чтоб он держал K*N пользователей.

E>Итого, нужен load balancer, который всегда определенного юзера гарантированно будет отправлять строго на определенный сервер, переключаясь на другой только в случае падения. То есть в моем случае (у меня spring security используется для аутентификации) нужно для каждого запроса прочитать данные аутентификации и в соответствии с этим перебросить запрос на соответствующий сервер. Такой балансер в принципе написать большого труда не составит, вот только вопрос — а нет ли какого балансера, который делает базовые вещи по балансировке, и который можно кастомизировать под мои требования?

Nginx

ну или http://serverfault.com/questions/169797/load-balancing-based-on-session-cookie
Re[5]: Посоветуйте load balancer
От: hrensgory Россия  
Дата: 06.08.12 10:33
Оценка: 14 (1) +1
On 06.08.2012 14:22, elmal wrote:
> H>Ну вы же их как-то отличаете, что это один пользователь? Если эти
> H>отличия делаются на уровне ХТТП (по кукам, хидерам) — то реально научить
> H>готовый лоад балансер (на базе apache, nginx) их отличать, если уже в
> H>приложении — то только свой писать, наверное (как вариант — модуль для
> H>того же apache или nginx).

> Увы, блин, в приложении. Вот думаю — а если сделать метод getSessionId

> который будет вычислять непосредственно хеш от данных аутентификации,и
> подменить sessionId. Интересно возможно ли такое, не пробовал такие
> хаки. Метод будет stateless, так что пофиг на какой сервер попадем
> вначале. А далее уже все стандартными средствами, sessionId не меняется.

А зачем sessionId подменять? Вы можете навесить на приложение фильтр,
который будет HTTP Header ставить соответствующий или спец. куку — а
лоад балансер на базе этой информации будет балансировать по узлам. Ну
тут конечно ещё много о чём надо будет подумать в плане security,
определения адреса узла при аутентификации и т.п., но по-моему можно
этим обойтись.

--
WBR,
Serge.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Посоветуйте load balancer
От: elmal  
Дата: 06.08.12 11:13
Оценка:
Здравствуйте, hrensgory, Вы писали:

H>А зачем sessionId подменять? Вы можете навесить на приложение фильтр,

H>который будет HTTP Header ставить соответствующий или спец. куку — а
H>лоад балансер на базе этой информации будет балансировать по узлам. Ну
H>тут конечно ещё много о чём надо будет подумать в плане security,
H>определения адреса узла при аутентификации и т.п., но по-моему можно
H>этим обойтись.
А вот это решение мне нравится, если спецкуку. Правда блин не факт что клиенты ее нормально передадут мне обратно, но можно попытаться. Только навешивать нужно фильтр не на приложение, а нужно строго в одном методе сделать хитрую логику. У меня приложение по нескольким протоколам сразу работает, с фильтрами там не просто будет, придется до кук пытаться из метода достучаться. ServletRequest то без проблем получаю, а вот смогу ли повлиять на Response — вопрос, так еще не делал.
Re: Посоветуйте load balancer
От: mazurkin http://mazurkin.info
Дата: 06.08.12 17:09
Оценка: 27 (4)
On 06/08/12 12:23, elmal wrote:

> Интересует вопрос. Есть stateful веб сервис, развернут на томкате.

> Рассчитан на N пользователей. Нужно этот сервис отмасштабировать,
> чтоб он держал K*N пользователей.

В Tomcat можно задать идентификатор ноды в аттрибуте jvmRoute тэга
Engine — этот идентификатор будет добавлен через точку к штатное
сессионной куке JSESSIONID

Дале впереди ставите один или несколько инстансов NGINX в каждом из
которых анализируется кука $cookie_JSESSIONID (регекспом получаем
значение после точки) — и в соответствии со значением отправляем на
соответствующую ноду бэкенда.
Posted via RSDN NNTP Server 2.1 beta
Re: Посоветуйте load balancer
От: and_hom  
Дата: 13.08.12 14:50
Оценка:
Попробуйте nginx-sticky-module
Маршрутизирует по собственной куке. Если нода отваливается, то пользователь идет на др ноду (таймауты настраиваются). Соответственно, томкаты должны хранить сессию в базе. Я делал балансировку на nginx+jetty — серьёзных проблем пока не было. Единственная проблема — по умолчанию этот модуль в nginx не включен.

E>Интересует вопрос. Есть stateful веб сервис, развернут на томкате. Рассчитан на N пользователей. Нужно этот сервис отмасштабировать, чтоб он держал K*N пользователей.

E>Итого, нужен load balancer, который всегда определенного юзера гарантированно будет отправлять строго на определенный сервер, переключаясь на другой только в случае падения. То есть в моем случае (у меня spring security используется для аутентификации) нужно для каждого запроса прочитать данные аутентификации и в соответствии с этим перебросить запрос на соответствующий сервер. Такой балансер в принципе написать большого труда не составит, вот только вопрос — а нет ли какого балансера, который делает базовые вещи по балансировке, и который можно кастомизировать под мои требования?
Re[6]: Посоветуйте load balancer
От: elmal  
Дата: 26.04.13 07:29
Оценка:
Здравствуйте, hrensgory, Вы писали:

H>А зачем sessionId подменять? Вы можете навесить на приложение фильтр,

H>который будет HTTP Header ставить соответствующий или спец. куку — а
H>лоад балансер на базе этой информации будет балансировать по узлам. Ну
H>тут конечно ещё много о чём надо будет подумать в плане security,
H>определения адреса узла при аутентификации и т.п., но по-моему можно
H>этим обойтись.
Здесь еще один ньюанс. Итак — приложение авторизовалось, и у нее кука будет указывать на определенную ноду. Прекрасно. Далее берем второе устройство. Которое авторизуется с нуля, и совсем из другого места. Так как никаких кук нет, то балансер отправит на произвольную ноду, в результате будем иметь дубликат пользователя и рассогласованность данных. А нужно чтоб мы попали с одинаковыми авторизованными данными строго на одну ноду, если нода жива. Если нода померла, то допустимо переключение на другую, в этом случае некоторые операции будут выполняться дольше, но для пользователя будет прозрачно. Но нужно чтобы все другие пользователи с определенным логином тоже переключились на новую, чтобы дубликатов пользователей никогда не было. Соответственно пришли туда, откуда начали.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.