Re: Маршрутизация запросов

2015-07-29 Пенетрантность Alexey Malov
29 июля 2015 г., 0:43 пользователь Budulianin nginx-fo...@nginx.us
написал:

 Но hash же не гарантирует равномерного распределения запросов по бэкендам,
 он как раз гарантирует, что запросы с одинаковым id будут идти на одну и
 ту
 же ноду.

 А где-то описывается алгоритм работы hash?


Вообще вот тут вот:-)
http://hg.nginx.org/nginx/file/341e4303d25b/src/http/modules/ngx_http_upstream_hash_module.c


 Чтобы можно было понять наверняка, всегда ли с одним id на одну и туже ноду
 или нет.


Можно в debug-логах посмотреть, какой хеш получается у какого клиента и у
какого id, и посмотреть на какую ноду он уходит.


 Я конечно проверю, но ещё хотелось бы что-то в документации прочитать по
 этому поводу.

 Posted at Nginx Forum:
 http://forum.nginx.org/read.php?21,260591,260602#msg-260602

 ___
 nginx-ru mailing list
 nginx-ru@nginx.org
 http://mailman.nginx.org/mailman/listinfo/nginx-ru




-- 
Alexey Malov
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Маршрутизация запросов

2015-07-29 Пенетрантность Budulianin
Большое спасибо за развёрнутый ответ.

Hash (как и другие алгоритмы баллансировки) учитывает состояние апстрима.
И если апстрим не доступен, то для маршрутизации запроса будет выбран один
из оставшихся.

Я хочу задать жёсткую маршрутизацию для каждого пользователя(по сути сама
балансировка мне тут не нужна
просто я пытался через неё задать жёсткий маршрут), для организации
websocket.
Дело в том, что планируется несколько instance приложения, с которым
соединяется клиент.
И чтобы общаться с пользователем, нужно знать, с каким именно instance он
установил соединение, чтобы работать именно с ним.
Поэтому мне каким-то образом нужно либо жёстко задать маршрут для каждого
пользователя либо отслеживать путь по которому
прошёл запрос пользователя(желательна такая схема(на будущее), req - Nginx
- {node1, node2, ...},
но пока планирую сделать напрямую  req - {node1, node2, ...} таким образом,
мне нужно будет только запомнить адрес конкретной ноды(простой вариант)

Но хотелось бы req - Nginx - {node1, node2, ...}. Для этого мне нужно
делать запрос на Nginx и он каким-то образом должен отправлять этот запрос
в нужную ноду. Может передавать в адрес ноды в заголовке или параметре и
Nginx будет его использовать для правильного перенаправления?

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,260591,260611#msg-260611

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Маршрутизация запросов

2015-07-29 Пенетрантность Ekaterina Kukushkina
Привет.

On Wed, Jul 29, 2015 at 01:43:11AM -0400, Budulianin wrote:
 Но hash же не гарантирует равномерного распределения запросов по бэкендам,
 он как раз гарантирует, что запросы с одинаковым id будут идти на одну и
 ту
 же ноду.
 
 А где-то описывается алгоритм работы hash?
 Чтобы можно было понять наверняка, всегда ли с одним id на одну и туже ноду
 или нет.
 Я конечно проверю, но ещё хотелось бы что-то в документации прочитать по
 этому поводу.

Hash (как и другие алгоритмы баллансировки) учитывает состояние апстрима. 
И если апстрим не доступен, то для маршрутизации запроса будет выбран один 
из оставшихся. 

Недоступным апстрим может считаться по нескольким причинам: не ответил в 
течение заданного таймаута, ответил, но nginx оценил его ответ как 
невалидный. Это конфигурируется с помощью директивы proxy_next_upstream. 

Также обратите внимание на директиву max_fails. Хоть она и не фигурирует в 
вашей конструкции, но тем не менее присутствует в виде 'max_fails=1'. 
При каждом неуспешном ответе (или неответе в установленное время) nginx 
будет помечать указанный сервер как недоступный (на 10 секунд по 
умолчанию). И в этом случае nginx заново выберет актуальный апстрим для 
указанного хэша и будет использовать его до тех пор пока он жив.
 
Для того чтобы это подтвердить, рекомендую посмотреть error_log на предмет 
таймаутов от апстрима (они видны на уровне error). Также можно в access_log 
добавить пременные $upstream_status и $upstream_addr. В этом случае в 
access_log'е будут видны переходы с следующему апстриму.

-- 
Ekaterina Kukushkina

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Маршрутизация запросов

2015-07-28 Пенетрантность Alexey Malov
2015-07-28 15:15 GMT-05:00 Budulianin nginx-fo...@nginx.us:

 Да, надо было вставить.


 map $http_upgrade $connection_upgrade {
 default upgrade;
 '' close;
 }

 upstream tornado {
 hash $arg_key;

 server 127.0.0.1:9995;
 server 127.0.0.1:9996;
 server 127.0.0.1:9997;
 server 127.0.0.1:9998;
 server 127.0.0.1:;
 }

 server {
 listen 8080 default_server;

 access_log /var/log/nginx/nginx-access.log;
 error_log /var/log/nginx/nginx-error.log;

 location /ws/ {
 proxy_pass http://tornado;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection $connection_upgrade;
 }

 }


Вроде вы всё делаете правильно..
Но hash же не гарантирует равномерного распределения запросов по бэкендам,
он как раз гарантирует, что запросы с одинаковым id будут идти на одну и ту
же ноду. Попробуйте протестировать с большим разнообразием id, штук 20,
например. Тогда должны, скорее всего, все ноды задействоваться.

Если включите debug-лог, то там можно будет увидеть, какой hash у каждого
клиента посчитан будет, может, с ними нагляднее будет.




 Posted at Nginx Forum:
 http://forum.nginx.org/read.php?21,260591,260595#msg-260595

 ___
 nginx-ru mailing list
 nginx-ru@nginx.org
 http://mailman.nginx.org/mailman/listinfo/nginx-ru




-- 
Alexey Malov
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Маршрутизация запросов

2015-07-28 Пенетрантность Budulianin
Но hash же не гарантирует равномерного распределения запросов по бэкендам,
он как раз гарантирует, что запросы с одинаковым id будут идти на одну и
ту
же ноду.

А где-то описывается алгоритм работы hash?
Чтобы можно было понять наверняка, всегда ли с одним id на одну и туже ноду
или нет.
Я конечно проверю, но ещё хотелось бы что-то в документации прочитать по
этому поводу.

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,260591,260602#msg-260602

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Маршрутизация запросов

2015-07-28 Пенетрантность Budulianin
Всем привет.

Есть задача: каждого определённого пользователя всегда отправлять на
определённую ноду.
Пытаюсь решить её с помощью балансировки, через директиву upstream + hash.

Задаю каждому пользователю уникальный id, передаю его в запросе
и потом nginx делает из него hash и в соответствии с ним отправляет запрос
на определённую ноду.
Но не все запросы равномерно распределяются по нодам.
Например: у меня 5 нод, отправляю 4 запроса с одним id, они приходят на 1
ноду,
отправляю следующие 4 запроса c новым id, они приходят на 2 ноду,
отправляю следующие 4 запроса c новым id, они приходят на 3 ноду,
повторяю те же действия с новыми id, но на ноду 4 и 5 ничего не приходит,
запросы распределяются между 1, 2 и 3.

Подскажите пожалуйста:
Как происходит выбор ноды, когда upstream + hash?

Как решают подобные задачи? Может вообще по другому?
Если nginx вычислил hash от id и отправил на ноду n, то он всегда будет
отправлять с тем же id на ноду n?(если список нод не менялся)

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,260591,260591#msg-260591

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Маршрутизация запросов

2015-07-28 Пенетрантность Alexey Malov
28 июля 2015 г., 13:42 пользователь Budulianin nginx-fo...@nginx.us
написал:

 Всем привет.

 Есть задача: каждого определённого пользователя всегда отправлять на
 определённую ноду.
 Пытаюсь решить её с помощью балансировки, через директиву upstream + hash.

 Задаю каждому пользователю уникальный id, передаю его в запросе
 и потом nginx делает из него hash и в соответствии с ним отправляет запрос
 на определённую ноду.
 Но не все запросы равномерно распределяются по нодам.
 Например: у меня 5 нод, отправляю 4 запроса с одним id, они приходят на 1
 ноду,
 отправляю следующие 4 запроса c новым id, они приходят на 2 ноду,
 отправляю следующие 4 запроса c новым id, они приходят на 3 ноду,
 повторяю те же действия с новыми id, но на ноду 4 и 5 ничего не приходит,
 запросы распределяются между 1, 2 и 3.

 Подскажите пожалуйста:
 Как происходит выбор ноды, когда upstream + hash?


А конфиг покажите, пожалуйста?



 Как решают подобные задачи? Может вообще по другому?
 Если nginx вычислил hash от id и отправил на ноду n, то он всегда будет
 отправлять с тем же id на ноду n?(если список нод не менялся)

 Posted at Nginx Forum:
 http://forum.nginx.org/read.php?21,260591,260591#msg-260591

 ___
 nginx-ru mailing list
 nginx-ru@nginx.org
 http://mailman.nginx.org/mailman/listinfo/nginx-ru




-- 
Alexey Malov
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Маршрутизация запросов

2015-07-28 Пенетрантность Budulianin
Да, надо было вставить.


map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

upstream tornado {
hash $arg_key;

server 127.0.0.1:9995;
server 127.0.0.1:9996;
server 127.0.0.1:9997;
server 127.0.0.1:9998;
server 127.0.0.1:;
}

server {
listen 8080 default_server;

access_log /var/log/nginx/nginx-access.log;
error_log /var/log/nginx/nginx-error.log;

location /ws/ {
proxy_pass http://tornado;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}

}

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,260591,260595#msg-260595

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru