Re: Маршрутизация запросов
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: Маршрутизация запросов
Большое спасибо за развёрнутый ответ. 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: Маршрутизация запросов
Привет. 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 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: Маршрутизация запросов
Но 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
Маршрутизация запросов
Всем привет. Есть задача: каждого определённого пользователя всегда отправлять на определённую ноду. Пытаюсь решить её с помощью балансировки, через директиву 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: Маршрутизация запросов
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: Маршрутизация запросов
Да, надо было вставить. 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