Инициализация сетевой связи с другими серверами

На данном этапе программа открывает сетевой UDP-сокет. Управляющая программа использует тот же номер порта, что и сетевой драйвер сервера dbs_tcp, но по UDP-протоколу. Также на данном этапе генерируется уникальный случайный идентификатор данного сервера резервирования, который в дальнейшем используется для определения старшего сервера.

На основании информации файла настройки nodetab управляющая программа посылает специальные UDP-пакеты каждому из узлов, входящих в систему резервирования. Рассылка UDP-пакетов производится на протяжении всей последующей работы управляющей программы. Назначение этих пакетов различно на определенных этапах работы управляющей программы. На этапе инициализации UDP-пакет содержит уникальный идентификатор сервера. На основании этого идентификатора определяется принадлежность узлов данному серверу. Те узлы, с которых пришел пакет с совпадающим идентификатором, принадлежат данному серверу. В последующем сервер сам себе пакеты уже не посылает.

Те же самые действия выполняют и другие серверы резервирования при старте. Поэтому, принимая пакеты от других серверов, программа управления по одинаковым идентификаторам определяет принадлежность узла различным серверам. В случае повторения идентификаторов, принятых с другого узла, этот узел считается тем же самым сервером с запасной линией связи. В случае наличия нескольких линий связи одна из них (по которой поступил первый пакет) назначается основной, а остальные – запасными. По основной линии связи происходит передача данных. Все линии связи периодически проверяются путем отсылки тестовых пакетов.

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