Есть ли какой-нибудь подход к обновлению и перезапуску сервера, поддерживающего сокет в «приостановленном» состоянии? - PullRequest
0 голосов
/ 01 ноября 2018

В порту TCP / IP есть программа, которая прослушивает и отвечает на запросы ( собственный двоичный протокол ). Но эта программа нуждается в обновлении, поэтому ее необходимо перезапустить, а затем продолжить работу на том же порту.

Согласно его протоколу, все текущие соединения могут быть закрыты, потому что все клиенты будут восстанавливать новые соединения сразу после их закрытия, но новые соединения должны сохраняться (но не запрещаться) до тех пор, пока программа не будет перезапущена (для некоторых секунд) как это можно сделать?

Таким образом, как только он снова запустится, все сохраненные соединения на данном порту могут быть освобождены для достижения сокета прослушивания.

Давайте представим следующие шаги:

  1. Серверная программа работает и прослушивает данный порт, давайте скажем порт А.
  2. Он просит внешний ресурс (например, операционную систему или любой сторонний модуль) сохранить все соединения, поступающие на порт A.
  3. Он закрывает все текущие соединения, которые в данный момент установлены с портом A - ЭТО МОЖЕТ СДЕЛАТЬ ВРЕМЯ (может быть, пару минут, потому что сначала он завершит все запрошенные услуги)
  4. Он перезапускается, и новый исполняемый файл оживает и начинает слушать порт A.
  5. Он просит внешний ресурс освободить все сохраненные соединения, чтобы они теперь могли достичь порта А, который теперь готов к приему соединений.

Шаги 2 и 4 являются лишь предположениями.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Разъем для прослушивания не связан с соединениями. Хитрость заключается в том, чтобы новый сервер подошел и согласовал со старым сервером прослушивание порта обслуживания. Как только старый сервер закрыл свой сокет прослушивания, новый сервер может открыть свой собственный. Затем он продолжает обработку новых соединений.

Между тем, старый сервер продолжает обслуживать ранее принятые соединения до того, как новый сервер вступает во владение, и закрывает каждое соединение, когда оно завершает работу с ним. После того, как все они закрыты, старый сервер может выйти.

0 голосов
/ 02 ноября 2018

В системах POSIXy (Linux, Mac, BSD) существует довольно простой, но умный способ для процесса обслуживания достичь этого. Для этого даже не нужны никакие привилегии.

Основная идея очень проста: когда служба знает, что перезапустится, она создаст отдельный дочерний процесс (в новом сеансе и группе процессов, поэтому он будет переименован в init), содержащий прослушивающий сокет (ы) , Тогда родитель просто больше не будет accept() новых подключений, завершит все неполные ответы и повторно выполнит себя с обновленным двоичным файлом.

Процесс-держатель также будет прослушивать входящие соединения через сокет домена Unix (потоковый или seqpacket; ориентированный на соединение). Обновленный экземпляр сервера будет подключаться к процессу держателя со вспомогательной полезной нагрузкой SCM_CREDENTIALS, которая включает проверенного в ядре пользователя и группу, под которой запускается процесс, и идентификатор процесса, который процесс держателя может использовать, чтобы проверить, является ли подключающаяся сторона обновленной версией двоичного файла. (В Linux это можно сделать путем сравнения stat() из /proc/PID/exe и ожидаемого исполняемого файла.) Если другой конец авторизован, держатель передает дескрипторы прослушивающего сокета обратно, используя вспомогательную полезную нагрузку SCM_RIGHTS. Наконец, обновленный сервис отправляет последнюю благодарность, которая сообщает завершающемуся процессу держателя (который также закрывает свои копии дескрипторов слушающих сокетов).

Пока достаточно невыполненных заданий (см. listen()) (или syncookies , включенных в Linux, что делает это задание практически неограниченным), это должен быть достаточно надежный подход.

При желании я могу привести пример кода о том, как это будет работать в Linux. (Я считаю, что здесь важны аспекты безопасности, поэтому я определенно хотел бы заняться вещами только для Linux, такими как проверка /proc/PID/exe, чтобы убедиться, что только обновленный двоичный файл может повторно получить сокеты прослушивания.)

...