Назад | Перейти на главную страницу

Когда IP-адрес сервера изменяется, существующие TCP (например, http / mysql) соединения продолжают работать

У нас есть несколько серверов PHP-FPM, и когда им требуется соединение с базой данных, они подключаются к серверу HAProxy, который выбирает им сервер базы данных для использования, и соединение открывается. Когда мы затем хотим выполнить некоторое обслуживание серверов HAProxy (например, изменения конфигурации, требующие перезапуска HAProxy), процесс будет следующим:

  1. Завершение работы Keepalived на сервере HAProxy
  2. Подождите, пока плавающий IP-адрес будет передан на резервный сервер HAProxy (также работающий Keepalived)
  3. Подождите, пока статистика HAProxy не сообщит только об одном соединении (мы проверяем количество соединений)
  4. Перезапустите HAProxy
  5. Перезапустить Keepalived

Что произойдет с открытыми соединениями mysql в этот момент на шаге 2? В соответствии с этот вопрос о сессиях TCP и изменениях IP соединения будут отключены. Так ли это на самом деле? Если да, то что можно сделать, чтобы этого не произошло? Можно ли каким-то образом заставить соединение использовать основной (неплавающий) IP-адрес сервера?

У нас также есть аналогичная установка с двумя серверами Nginx с запущенным на них Keepalived, и мы планировали выполнить аналогичный процесс. Если мы это сделаем, то применим тот же вопрос - что происходит с существующими http-соединениями, когда IP-адрес перемещается на другой сервер?

Я ценю вашу помощь.

Они отключаются. TCP не имеет протокола для изменения IP-адреса, поэтому клиенты не узнают, что он изменился волшебным образом. Необходимо будет установить новое соединение.

IP-адреса, используемые для TCP-соединения, выбираются клиентом при установке соединения. Выбор может быть сделан либо на уровне приложения, привязав сокет к определенному IP перед подключением, либо ядром, если уровень приложения не сделал выбор.

Выбор, сделанный ядром, можно контролировать несколькими способами. Хост, у которого есть как статический IP-адрес, так и плавающий IP-адрес, должен быть настроен на использование статического IP-адреса для исходящих соединений. Если вы хотите использовать IP только для входящих подключений, а не для исходящих, вы можете назначить его фиктивному интерфейсу.

По умолчанию ядром выбирается IP-адрес, назначенный интерфейсу, через который отправляется пакет TCP SYN. Если вы используете IPv6, у вас более детальный контроль, вот несколько примеров команд, которые можно использовать в Linux:

/sbin/ip -6 addr change 2001:db8::234 dev eth0 preferred_lft 1
/sbin/ip -6 addr change 2001:db8::1 dev eth0 preferred_lft 0

Приведенная выше пара команд будет использовать 2001:db8::234 для пакетов SYN, отправленных через eth0.