"Исключение PDO: сетевые getaddresses php: ошибка getaddrinfo" после изменения преобразователей DNS с БД, работающей на AWS
В нашем приложении Laravel 5.2 у нас есть настройка БД, работающая на AWS, с использованием нескольких серверов чтения (и нескольких подключений к БД).
Ночью мы изменили распознаватели DNS для всех веб-серверов на DNS Google (8.8.8.8 и 8.8.4.4). Затем серверы начали выплевывать следующее:
Исключение PDOException: Исключение "Исключение PDOException" с сообщением "СОСТОЯНИЕ SQLSTATE[HY000] [2002] php_network_getaddresses: ошибка getaddrinfo: Имя или служба неизвестны' в /home/forge/studydrive.net/releases/20170320162143/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:55
Код в Connector.php:55
- это просто конструктор PDO:
public function createConnection($dsn, array $config, array $options)
{
$username = Arr::get($config, 'username');
$password = Arr::get($config, 'password');
try {
$pdo = new PDO($dsn, $username, $password, $options); // <== THIS ONE
} catch (Exception $e) {
$pdo = $this->tryAgainIfCausedByLostConnection(
$e, $dsn, $username, $password, $options
);
}
return $pdo;
}
Конфигурация .env для AWS (с измененными частями sesnsitive):
DB_HOST=myapp-cluster.cluster-123abc.eu-west-2.rds.amazonaws.com
DB_HOST_WRITE=myapp-cluster.cluster-123abc.eu-west-2.rds.amazonaws.com
DB_HOST_READ=myapp-cluster.cluster-ro-123abc.eu-west-2.rds.amazonaws.com
Итак, похоже, что PDO PHP внезапно не может разрешить имя DB_HOST
.
Обратите внимание, что мы не можем использовать IP-адрес для DB_HOST
, так как имя хоста (на стороне AWS) сопоставляется с 3 различными считываемыми базами данных серверы.
Кроме того, до того, как мы поменяли преобразователи, все работало нормально.
У кого-нибудь есть какие-либо идеи о том, что может быть причиной ошибки PDO или как ее устранить?
3 answers
Это ошибка в libc, согласно:
Https://bugs .launchpad.net/ubuntu /+источник/glibc/+ошибка/1674733
Php_network_getaddresses: ошибка getaddrinfo: Имя или служба неизвестны ubuntu
По состоянию на 20 марта у многих пользователей Ubuntu в Интернете внезапно возникли проблемы с разрешением DNS в их приложениях из-за плохого обновления, выпущенного Canonical (сопровождающими Ubuntu), которое нарушает разрешение DNS после нескольких часов безотказной работы. Вот отчет об ошибке, в котором сообщалось о проблеме и ее сортировке:
Https://bugs .launchpad.net/ubuntu /+источник/eglibc/+ошибка/1674532
Это могло привести к сбоям в обновлении/установке вашей CMS плагины/темы установки, сбои при подключении к внешним API и/или сообщения об ошибках, подобные следующим:
Предупреждение: file_get_contents(): php_network_getaddresses: ошибка getaddrinfo: Нет адреса, связанного с именем хоста Не удалось разрешить хост: downloads.wordpress.org Ошибка завитка 6: Не удалось разрешить узел: example.com в.... К счастью, Canonical с тех пор смогла устранить проблему, но затронутые системы должны обновиться, чтобы получить исправление. Для этого вам понадобится работающий DNS, поэтому, если в настоящее время он отключен, пожалуйста, сначала перезагрузите свой Droplet. Как только разрешение DNS заработает в обычном режиме, пожалуйста, запустите:
sudo apt-get update
sudo apt-get upgrade
Затем вы можете проверить свои версии, чтобы убедиться, что у вас есть правильные. Это можно сделать с помощью:
# sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
Если вы используете Ubuntu 16.X, вы должны увидеть вывод, подобный следующему:
# sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
2.23-0ubuntu7
2.23-0ubuntu7
2.23-0ubuntu7
Если вы используете Ubuntu 14.X, вы должны увидеть вывод, подобный следующему:
# sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
2.19-0ubuntu6.11
2.19-0ubuntu6.11
Если вы видите более старые версии этих пакетов, вам потребуется выполнить обновление в соответствии с предыдущие инструкции, чтобы избежать этой проблемы.
Я также столкнулся с этой проблемой после восстановления своего экземпляра и попытался восстановить снимок базы данных. И перезапуск серверов приложений решил эту проблему за меня. Сработало как по волшебству!:)