Avec le développement rapide d'Internet, de plus en plus d'entreprises migrent leurs systèmes d'entreprise vers le cloud et utilisent une architecture distribuée pour gérer d'énormes quantités de données et un trafic simultané élevé. Cependant, dans une architecture distribuée, la récupération après panne devient plus complexe. En particulier lorsqu'une panne de base de données partitionnée se produit, les données sur le nœud défaillant doivent être restaurées à temps, sinon le fonctionnement stable de l'entreprise peut être sérieusement affecté. Cet article explique comment utiliser PHP pour réaliser une récupération après échec de partitionnement de base de données.
1. L'impact de l'échec d'une base de données fragmentée
Le partage consiste à diviser un élément de données en plusieurs sous-ensembles et à les stocker sur différents serveurs de base de données pour obtenir un stockage distribué et un équilibrage de charge. Cependant, lorsqu’un certain fragment tombe en panne, cela affectera le fonctionnement de l’ensemble de l’entreprise.
Supposons qu'une plate-forme de commerce électronique ait une table de commande utilisateur placée sur la base de données fragmentée A et que la base de données fragmentée A échoue soudainement. À ce moment-là, l'ensemble du processus de requête de commande et de paiement du commerçant sera entravé et les utilisateurs ne pourront pas terminer. La commande des marchandises normalement commandées et payées. Par conséquent, dans une architecture de base de données partitionnée, la reprise après incident devient particulièrement importante.
2. Processus PHP pour réaliser une récupération après échec de partitionnement de base de données
Afin de résoudre le problème de défaillance de base de données partitionnée, nous pouvons utiliser la réplication maître-esclave et la solution HA pour réaliser le basculement et la récupération de données. Voici le processus permettant à PHP de mettre en œuvre la récupération après échec de partitionnement de base de données :
1. Réplication de base de données maître-esclave
La réplication maître-esclave réplique les données via le journal binaire de MySQL. La base de données maître écrit les données et les écrit dans le fichier journal binaire. La base de données esclave copie le fichier journal binaire sur son propre serveur pour garantir que les données de la base de données esclave sont cohérentes avec celles de la base de données maître. De cette façon, après une panne de la base de données principale, la base de données esclave peut être rapidement basculée vers la base de données principale pour assurer le fonctionnement stable du système d'entreprise.
Solution 2.HA
La solution HA (haute disponibilité) peut automatiquement basculer les nœuds défaillants pour assurer la stabilité du système d'entreprise. La solution HA utilise VRRP (Virtual Router Redundancy Protocol) ou d'autres protocoles pour implémenter la commutation d'adresses IP virtuelles.
Lorsqu'un nœud s'avère défectueux, le système HA pointe automatiquement l'adresse IP vers son nœud de sauvegarde. À ce stade, le nœud de secours deviendra automatiquement le nœud maître et démarrera le service de réplication pour garantir la cohérence des données et une haute fiabilité.
3. Programme de commutation automatique
Le programme de commutation automatique est utilisé pour surveiller la base de données maître et la base de données esclave. Lorsque la base de données maître tombe en panne, elle passe automatiquement de la base de données esclave à la base de données maître. Le programme de commutation automatique peut basculer automatiquement sans intervention manuelle, afin que le système commercial puisse continuer à fonctionner de manière stable.
4. Procédure de récupération des données
Une fois qu'une panne de base de données partitionnée se produit, la récupération après panne doit être effectuée rapidement pour restaurer les données du nœud de secours. Le programme de récupération de données peut exporter les données du nœud de secours vers le nœud défaillant via la commande mysqldump de MySQL pour obtenir une récupération rapide des données.
3. Implémentation du code PHP pour la récupération des erreurs de partitionnement de base de données
Cet article utilise le langage PHP comme exemple pour démontrer l'implémentation du code pour la récupération des erreurs de partitionnement de base de données.
1. Configurez l'adresse IP virtuelle du serveur maître-esclave de la base de données et de la solution HA :
$master_db_host = '192.168.1.1'; $master_db_user = 'root'; $master_db_pwd = '123456'; $master_db_name = 'orders'; $slave_db_host = '192.168.1.2'; $slave_db_user = 'root'; $slave_db_pwd = '123456'; $slave_db_name = 'orders'; $vip = '192.168.1.3';
2 Implémentez la fonction de réplication maître-esclave, définissez le serveur maître et le serveur esclave dans la base de données pour réaliser la réplication de la base de données :
$dsn = "mysql:host=$master_db_host;dbname=$master_db_name"; $user = $master_db_user; $pwd = $master_db_pwd; try { $pdo = new PDO($dsn, $user, $pwd); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec('SET NAMES utf8'); $stmt = $pdo->query("SHOW MASTER STATUS"); $master_status = $stmt->fetch(PDO::FETCH_ASSOC); $pdo = null; } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } $dsn = "mysql:host=$slave_db_host;dbname=$slave_db_name"; try { $pdo = new PDO($dsn, $slave_db_user, $slave_db_pwd); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec('SET NAMES utf8'); $stmt = $pdo->prepare("STOP SLAVE;"); $stmt->execute(); $stmt = $pdo->prepare("CHANGE MASTER TO MASTER_HOST=:host, " . "MASTER_USER=:user, MASTER_PASSWORD=:pwd, " . "MASTER_LOG_FILE=:log_file, MASTER_LOG_POS=:log_pos;"); $stmt->bindParam(":host", $master_db_host, PDO::PARAM_STR); $stmt->bindParam(":user", $master_db_user, PDO::PARAM_STR); $stmt->bindParam(":pwd", $master_db_pwd, PDO::PARAM_STR); $stmt->bindParam(":log_file", $master_status['File'], PDO::PARAM_STR); $stmt->bindParam(":log_pos", $master_status['Position'], PDO::PARAM_INT); $stmt->execute(); $stmt = $pdo->prepare("START SLAVE;"); $stmt->execute(); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); }
3. Implémentez la solution HA, changez automatiquement les nœuds maître et esclave :
exec("ifconfig eth1:$vip $vip netmask 255.255.255.255"); exec("route add -host $vip dev eth1:$vip");
4. Implémentez le programme de commutation automatique et surveillez l'état des bases de données maître et esclave :
$dsn = "mysql:host=$master_db_host;dbname=$master_db_name"; $user = $master_db_user; $pwd = $master_db_pwd; try { $pdo = new PDO($dsn, $user, $pwd); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec("SELECT 1 FROM DUAL;"); $pdo = null; } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); $dsn = "mysql:host=$slave_db_host;dbname=$slave_db_name"; try { $pdo = new PDO($dsn, $slave_db_user, $slave_db_pwd); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); exec("ifconfig eth1:$vip down"); exec("ifconfig eth1:$vip up"); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } }
5. Implémentez le programme de récupération de données et utilisez mysqldump. commande pour exporter les données du nœud de veille vers le nœud défaillant :
$cmd = "/usr/bin/mysqldump -h $slave_db_host -u $slave_db_user -p$slave_db_pwd $slave_db_name orders | mysql -h $master_db_host -u $master_db_user -p$master_db_pwd $master_db_name"; exec($cmd);
IV.Résumé
La récupération après panne d'une architecture distribuée est plus compliquée que celle d'un système monomachine. Pour les pannes de base de données fragmentées, nous pouvons utiliser maître-esclave. solutions de réplication et de haute disponibilité pour obtenir une commutation automatique et une récupération rapide des données. Ce qui précède est la méthode et l'implémentation du code de récupération des erreurs de partitionnement de base de données à l'aide de PHP. J'espère que cela sera utile aux lecteurs dans la récupération des erreurs sous une architecture distribuée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!