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