Re: upstream max_fails и упавшие сервера

2013-07-09 Пенетрантность Maxim Dounin
Hello!

On Tue, Jul 09, 2013 at 12:10:14PM +0400, Андрей Урядов wrote:

 Сделал так, как советовали: после старта бэкенд говорит фронтенду, что надо
 перечитать конфигурацию. Но в логах почему-то даже после перечитывания
 появляются ошибки: (110: Connection timed out) while connecting to
 upstream, причем указан ip бэкенда не из списка текущих - видимо, старый
 остался. Причем, такое повторяется через несколько минут после
 перечитывания конфигурации. Хотя, эти ошибки явно одиночные - проявляются
 только для нескольких клиентов, у остальных все нормально работает. Это
 результаты какого-то кэширования? Потому что запрос от клиента на nginx
 пришел явно после того, как конфигурация уже была перечитана.

Такое может быть, e.g., если запрос _начал_ приходить давно, и 
соответственно - в старый рабочий процесс, и делал это долго - 
e.g. от клиента принималось большое тело запроса.  Либо запрос до 
этого где-то долго обрабатывался (e.g. ходил на другой бекенд, и 
потом из-за ошибки или по X-Accel-Redirect был куда-то ещё 
отправлен).

В сообщениях об ошибках написан pid процесса, имеет смысл на него 
посмотреть - там должен быть pid одного из старых рабочих 
процессов.

Ну и $request_time, $upstream_response_time имеет смысл в логи 
добавить - чтобы не писать явно после, а оперировать фактами.

-- 
Maxim Dounin
http://nginx.org/en/donation.html

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

Re: upstream max_fails и упавшие сервера

2013-06-17 Пенетрантность Андрей Урядов
Да


17 июня 2013 г., 17:53 пользователь Maxim Dounin mdou...@mdounin.ruнаписал:

 Hello!

 On Mon, Jun 17, 2013 at 04:09:19PM +0400, Андрей Урядов wrote:

  Всем привет.
 
  Столкнулся с интересным поведением директивы max_fails в upstream.
  Версия nginx 1.2.6.
  Опишу ситуацию.
 
  1. Nginx работает на сервере some_host1. Кусок конфига:
  upstream fpm {
  server some_host1:9000 weight=6;
  serversome_host2:9000 weight=4;
  }
  2. В какой-то момент some_host2 зависает (на уровне ОС), т.е. не отвечает
  на запросы.
  3. В логах появляются строки connect() failed (110: Connection timed
 out)
  while connecting to upstream. Причем, я считал, что т.к. max_fails не
  указан, он равен 1, и, стало быть, таких строчек не должно быть, т.к.
 nginx
  должен перекидывать всех на первый сервер.
  4. some_host2 перестартует. На нем запускается fpm.
  5. Но почему-то строки из лога не пропадают и клиентам отдаются ошибки.
  6. Если перестартовать nginx, то он подцепит оба сервера, и все
 продолжится
  в штатном режиме.
 
 
  Вопросы:
  1. Почему после первого неудачного раза сервер не отрубается? Ведь
  max_fails равно 1.

 После того, как случилась ошибка - nginx будет посылать запросы на
 плохой сервер раз в fail_timeout секунд (нюанс: из каждого
 рабочего процесса).  Если он успешно ответит на запрос - то будет
 вновь включён в работу.

  2. Почему после рестарта сервера nginx его не видит? Он же продолжает его
  дергать, и мог бы понять, что сервер восстановился.

 Если продолжают происходить ошибки - значит, он как-то странно
 восстановился.  Возможно, у него в процессе поменялся ip-адрес?
 Это бы объяснило, почему после рестарта nginx его увидел.

 --
 Maxim Dounin
 http://nginx.org/en/donation.html

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

Re: upstream max_fails и упавшие сервера

2013-06-17 Пенетрантность Андрей Урядов
Если продолжают происходить ошибки - значит, он как-то странно
восстановился.  Возможно, у него в процессе поменялся ip-адрес?
Это бы объяснило, почему после рестарта nginx его увидел.
Дело в том, что эти 2 сервера - aws-инстансы. Внешний ip-адрес у них
постоянный, а вот внутренний - может меняться. Т.к. у меня идет привязка к
внутренней aws-dns-службе. Так что вариант, что во внутренней сети и них
разные ip, вполне имеет почву.
А, если это так, можно ли что-то сделать на стороне nginx? Я же их
прописываю в конфиге по dns-адресам, а не ip. Или nginx внутри себя все
равно хранит представление в ip-адресе?


17 июня 2013 г., 17:56 пользователь Андрей Урядов anurya...@gmail.comнаписал:

 Да


 17 июня 2013 г., 17:53 пользователь Maxim Dounin mdou...@mdounin.ruнаписал:

 Hello!

 On Mon, Jun 17, 2013 at 04:09:19PM +0400, Андрей Урядов wrote:

  Всем привет.
 
  Столкнулся с интересным поведением директивы max_fails в upstream.
  Версия nginx 1.2.6.
  Опишу ситуацию.
 
  1. Nginx работает на сервере some_host1. Кусок конфига:
  upstream fpm {
  server some_host1:9000 weight=6;
  serversome_host2:9000 weight=4;
  }
  2. В какой-то момент some_host2 зависает (на уровне ОС), т.е. не
 отвечает
  на запросы.
  3. В логах появляются строки connect() failed (110: Connection timed
 out)
  while connecting to upstream. Причем, я считал, что т.к. max_fails не
  указан, он равен 1, и, стало быть, таких строчек не должно быть, т.к.
 nginx
  должен перекидывать всех на первый сервер.
  4. some_host2 перестартует. На нем запускается fpm.
  5. Но почему-то строки из лога не пропадают и клиентам отдаются ошибки.
  6. Если перестартовать nginx, то он подцепит оба сервера, и все
 продолжится
  в штатном режиме.
 
 
  Вопросы:
  1. Почему после первого неудачного раза сервер не отрубается? Ведь
  max_fails равно 1.

 После того, как случилась ошибка - nginx будет посылать запросы на
 плохой сервер раз в fail_timeout секунд (нюанс: из каждого
 рабочего процесса).  Если он успешно ответит на запрос - то будет
 вновь включён в работу.

  2. Почему после рестарта сервера nginx его не видит? Он же продолжает
 его
  дергать, и мог бы понять, что сервер восстановился.

 Если продолжают происходить ошибки - значит, он как-то странно
 восстановился.  Возможно, у него в процессе поменялся ip-адрес?
 Это бы объяснило, почему после рестарта nginx его увидел.

 --
 Maxim Dounin
 http://nginx.org/en/donation.html

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



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

Re: upstream max_fails и упавшие сервера

2013-06-17 Пенетрантность Андрей Урядов
Понятно, спасибо.
Видимо, самым дешевым вариантом будет прописывание в cron перечитывания
конфигурации каждый час + ручное перечитывание каждый раз после сбоя.
Тогда, даже если забыть руками перечитать конфигурацию, через час она
перечитается. Я так понимаю, это дешевая операция?


17 июня 2013 г., 18:19 пользователь Maxim Dounin mdou...@mdounin.ruнаписал:

 Hello!

 On Mon, Jun 17, 2013 at 05:59:15PM +0400, Андрей Урядов wrote:

  Если продолжают происходить ошибки - значит, он как-то странно
  восстановился.  Возможно, у него в процессе поменялся ip-адрес?
  Это бы объяснило, почему после рестарта nginx его увидел.
  Дело в том, что эти 2 сервера - aws-инстансы. Внешний ip-адрес у них
  постоянный, а вот внутренний - может меняться. Т.к. у меня идет привязка
 к
  внутренней aws-dns-службе. Так что вариант, что во внутренней сети и них
  разные ip, вполне имеет почву.
  А, если это так, можно ли что-то сделать на стороне nginx? Я же их
  прописываю в конфиге по dns-адресам, а не ip. Или nginx внутри себя все
  равно хранит представление в ip-адресе?

 Имена превращаются в IP-адреса при чтении конфигурации.  Если
 IP-адреса меняются - нужно пнуть nginx, чтобы он перечитал
 конфигурацию.

 --
 Maxim Dounin
 http://nginx.org/en/donation.html

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

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

Re: upstream max_fails и упавшие сервера

2013-06-17 Пенетрантность Maxim Dounin
Hello!

On Mon, Jun 17, 2013 at 06:32:29PM +0400, Андрей Урядов wrote:

 Понятно, спасибо.
 Видимо, самым дешевым вариантом будет прописывание в cron перечитывания
 конфигурации каждый час + ручное перечитывание каждый раз после сбоя.
 Тогда, даже если забыть руками перечитать конфигурацию, через час она
 перечитается. Я так понимаю, это дешевая операция?

Это зависит от структуры нагрузки.  Если есть длинные запросы - то 
старые рабочие процессы могут долго не завершаться.  В общем 
случае - я бы скорее смотрел в сторону init-скриптов на бекендах, 
уведомляющих фронтенд, что ему надо перечитать конфигурацию.

-- 
Maxim Dounin
http://nginx.org/en/donation.html

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