Dans notre application Laravel 5.2, nous avons une configuration de base de données s'exécutant sur AWS, utilisant plusieurs serveurs de lecture (et plusieurs connexions à une base de données).
De nuit, nous avons remplacé les résolveurs DNS de tous les serveurs Web par ceux de Google (8.8.8.8 et 8.8.4.4). Ensuite, les serveurs ont commencé à cracher ceux-ci:
PDOException: Exception 'PDOException' avec message ' SQLSTATE [HY000] [2002] php_network_getaddresses: getaddrinfo a échoué: nom ou service inconnu ' dans /home/forge/studydrive.net/releases/20170320162143/vendor/laravel/framework /src/Illuminate/Database/Connectors/Connector.php:55
Le code à Connector.php:55
est simplement le constructeur 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;
}
Le .env config pour AWS (avec des parties non négatives modifiées):
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
Il semble donc que le PDO de PHP ne puisse soudainement pas résoudre le nom DB_Host
.
Notez que nous ne pouvons pas utiliser d'adresse IP pour le DB_Host
, car le nom d'hôte (côté AWS) correspond à 3 serveurs READ de bases de données différents.
De plus, avant de changer les résolveurs, tout fonctionnait bien.
Quelqu'un a une idée de ce qui pourrait causer l'erreur PDO, ou comment le résoudre?
C'est un bug dans libc, selon:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1674733
php_network_getaddresses: getaddrinfo a échoué: nom ou service inconnu ubuntu
Le 20 mars, de nombreux utilisateurs Ubuntu sur le Web étaient confrontés à des problèmes de résolution DNS dans leurs applications en raison d'une mauvaise mise à jour diffusée par Canonical (les responsables de la maintenance d'Ubuntu) qui interrompt la résolution DNS après quelques heures de disponibilité. Voici le rapport de bogue où le problème a été signalé et trié:
https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/1674532
Cela peut avoir entraîné des échecs de mise à jour/installation de plugins/thèmes de votre CMS, des échecs de connexion aux API externes et/ou des messages d'erreur similaires à ceux-ci:
Avertissement: file_get_contents (): php_network_getaddresses: getaddrinfo en échec: aucune adresse associée à hostname Impossible de résoudre l'hôte: downloads.wordpress.org erreur cURL 6: impossible de résoudre l'hôte: example.com dans .... Heureusement, Canonical a depuis lors pu résolvez le problème, mais les systèmes concernés doivent effectuer la mise à jour pour acquérir le correctif. Pour ce faire, le DNS doit fonctionner. Par conséquent, s'il est hors service, veuillez tout d'abord redémarrer votre Droplet. Une fois que la résolution DNS fonctionne normalement, exécutez:
Sudo apt-get update
Sudo apt-get upgrade
Ensuite, vous pouvez vérifier vos versions pour vous assurer que vous en avez les bonnes. Cela peut être fait avec:
# Sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
Si vous êtes sur Ubuntu 16.X, vous devriez voir une sortie semblable à celle-ci:
# Sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
2.23-0ubuntu7
2.23-0ubuntu7
2.23-0ubuntu7
Si vous êtes sur Ubuntu 14.X, vous devriez voir une sortie semblable à celle-ci:
# Sudo dpkg -l | grep "GNU C Library" | awk '{print $3}'
2.19-0ubuntu6.11
2.19-0ubuntu6.11
Si vous voyez des versions plus anciennes de ces packages, vous devrez procéder à la mise à niveau en suivant les instructions précédentes pour éviter ce problème.
J'ai également rencontré ce problème après avoir reconstruit mon instance et j'ai essayé de restaurer un instantané de base de données. Et le redémarrage des serveurs d'applications a résolu le problème pour moi. Travaillé comme un charme! :)