SystemD и ожидание DNS

Sep 20, 2023 21:17


... Есть всякие нерадивые программисты, которые в процессе разработки почему-то наивно уверены в том, что сетевая связность между различными компонентами / приложениями / микросервисами незыблема, она типа есть / будет всегда. Поэтому после неудачной попытки подключения к чему-нибудь-там они даже и мысли не допускают о том, чтобы предпринять ещё одну.

... Есть всякие софтины типа NginX-а или HAProxy, которые разрешают DNS-имена ровно один раз в момент старта, и далее работают уже с IP-адресами. Косяк в том, что если им в момент запуска этого сделать не удалось, то они просто вываливаются с ошибкой, и "досвидос".

... В базовом механизме разрешения имён Linux, который libc / libresolv, "из коробки" отсутствует какое-либо кеширование. Поэтому если софтина представляет собой, например, PHP-скрипт, то она имеет все шансы до смерти задрючить запросами DNS-сервер, если там, скажем, сервер базы данных указан по доменному имени, а не по IP-адресу. Я такое уже проходил лично. Поэтому всё же лучше сразу внедрять-активировать какой-нибудь локальный кеширующий DNS-сервер. Самое простое - systemd-resolved.

... Но при этом никто не гарантирует, что systemd-resolved запустится и прогреется-прочухается раньше, чем коммерческая софтина пожелает разрешить какое-нибудь имя. Вы возразите, что systemd позволяет отрегулировать порядок запуска-останова демонов и достижения неких целей (состояний системы, runlevel-ов, target-ов). Это верно. Вот только факт запуска systemd-resolved ещё не означает того, что он готов обслуживать запросы. Или факт достижения цели "network-online.target" не означает, что сетевая карта реально подняла линк, согласовала скорость, обменялась ARP-кадрами с маршрутизаторами и так далее. На это всё тоже уходят какие-то миллисекунды, но их достаточно для того, чтобы тот же NginX при старте уже отвалился по ошибке.

... Даже в красных шапках магия навроде "After = NetworkManager-wait-online.service" всё равно не помогает. Проверено на практике. А в остальных дистрибутивах дык и вовсе не факт, что этот NetworkManager присутствует в принципе.

... Единственное, что реально работает, так это "ExecStartPre=/bin/sh -c 'until getent hosts example.com; do sleep 1; done'". Но это жы ж эталонные костыли, согласитесь. Только всё равно другого, "нормального" способа решить такую задачу персонально мне не известно.

Если кто-то ещё сталкивался с подобным, поделитесь пожалуйста премудростями.

Всем работающего DNS и приложений.

грабли, linux, systemd, it

Previous post Next post
Up