Сценарий
База работает, а приложение её не находит по имени
Проверка здоровья orders-api падает с «Name or service not known». База слушает на этой же машине, сеть в порядке.
Ты дежуришь по сервису orders-api. Утром прилетело: приложение не видит базу заказов. База стоит на той же машине, вчера всё работало, и, как обычно, «никто ничего не менял». Ты заходишь на машину и запускаешь проверку здоровья.
Симптом
Проверка называет имя базы и падает, не дойдя до подключения. Резолвер, та часть библиотеки C, что превращает имя в адрес, этого имени не знает. База при этом слушает.
$ orders-api-check
orders-api-check: [db] host=orders-db.internal port=5433 (/etc/orders-api.conf)
db: [Errno -2] Name or service not known
$ getent hosts orders-db.internal
$ echo $?
2
$ ping -c 1 orders-db.internal
ping: orders-db.internal: Name or service not known
$ ss -ltn 'sport = :5433'
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:5433 0.0.0.0:*Порт открыт, процесс базы жив, а приложение до него не доходит: оно спотыкается раньше, на превращении имени в адрес. Последняя команда в листинге - ss -ltn - перечисляет слушающие TCP-сокеты: -l - только слушающие, -t - TCP, -n - порты числами, а фильтр 'sport = :5433' оставляет только нужный порт. Код -2 у ошибки и пустой ответ getent говорят одно и то же: имя не найдено ни в одном источнике. Сам код выхода 2 у getent шире: он не различает «не нашлось» и «источник не ответил», это видно только по тексту оши
Дальше бесплатно, нужен только аккаунт
Урок открывается после входа. Создай бесплатный аккаунт, чтобы дочитать его и запустить лабораторию.
Уже есть аккаунт? Войти