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