PHP implementiert die MySQL-Lese-/Schreibtrennung und muss die folgenden Funktionen implementieren:
1. Unterscheiden Sie Lese- und Schreibvorgänge: Im PHP-Code müssen Datenbankvorgänge unterschieden werden, und Lesevorgänge und Schreibvorgänge werden eingefügt verschiedene MySQLs.
Sie müssen eine Lastausgleichslösung entwerfen, um Leseanforderungen mithilfe verschiedener Algorithmen gleichmäßig auf mehrere MySQL-Instanzen zu verteilen.
Im Folgenden stellen wir detailliert vor, wie die oben genannten Funktionen implementiert werden.
Unterscheiden Sie zwischen Lese- und Schreibvorgängen
Die Implementierung der Lese- und Schreibtrennung von MySQL erfordert die Unterstützung der MySQL-Master-Slave-Replikationstechnologie. Bei der MySQL-Master-Slave-Replikation werden alle Schreibvorgänge in der Master-Datenbank ausgeführt, während nur Lesevorgänge in der Slave-Datenbank ausgeführt werden.
Im PHP-Code müssen MySQL-Lese- und Schreibvorgänge unterschieden werden. Schreibvorgänge werden an die Hauptbibliothek gesendet, während Lesevorgänge an die Slave-Bibliothek gesendet werden.
Die folgenden zwei Methoden können für die spezifische Implementierung verwendet werden:
1. Manuelle Schaltverbindung: Schaltverbindungen für Lese- und Schreibvorgänge manuell im Code implementieren. Verbinden Sie die Hauptdatenbank und die Slave-Datenbank nach Bedarf auf verschiedenen MySQL-Instanzen und führen Sie die entsprechenden SQL-Anweisungen aus.
Zum Beispiel für die folgende SQL-Anweisung:
SELECT * FROM users WHERE age>18;
Der folgende Code kann verwendet werden, um die Schaltverbindung für den Lesevorgang zu implementieren:
//生成一个读取从库的连接 $slaveConn = mysqli_connect($slaveHost, $slaveUser, $slavePass, $dbName); mysqli_query($slaveConn, "SET NAMES utf8"); //查询数据 $result = mysqli_query($slaveConn, "SELECT * FROM users WHERE age>18");
Ebenso kann für den Schreibvorgang:
INSERT INTO users (name,age,sex) VALUES ('jack',18,'male');
Der folgende Code verwendet werden Implementieren Sie die Schaltverbindung für den Schreibvorgang:
//生成一个写入主库的连接 $masterConn = mysqli_connect($masterHost, $masterUser, $masterPass, $dbName); mysqli_query($masterConn, "SET NAMES utf8"); //插入数据 $result = mysqli_query($masterConn, "INSERT INTO users (name,age,sex) VALUES ('jack',18,'male')");
Im obigen Code wird die Funktion mysqli_connect zum Generieren einer Datenbankverbindung und die Methode mysqli_query zum Betreiben der MySQL-Datenbank verwendet. Darunter sind $slaveHost, $slaveUser und $slavePass die Verbindungsinformationen der Slave-Bibliothek und $masterHost, $masterUser und $masterPass die Verbindungsinformationen der Master-Bibliothek.
Sie können die integrierte Implementierung im PHP-Framework verwenden, um Lese- und Schreibvorgänge zu wechseln. Im Yii2-Framework kann der folgende Code verwendet werden, um zwischen Lese- und Schreibvorgängen zu wechseln:
//生成一个读取从库的连接 $slaveConn = Yii::$app->slaveDb->getConnection(); //查询数据 $query = new \yii\db\Query(); $result = $query->from('users')->where(['age' > 18])->all($slaveConn);
Verwenden Sie auf ähnliche Weise den folgenden Code, um zwischen Schreibvorgängen zu wechseln:
//生成一个写入主库的连接 $masterConn = Yii::$app->masterDb->getConnection(); //插入数据 $result = Yii::$app->db->createCommand()->insert('users', [ 'name' => 'jack', 'age' => 18, 'sex' => 'male' ])->execute($masterConn);
Im obigen Code lautet Yii::$app-> SlaveDb und Yii:: $app->masterDb sind integrierte Datenbankverbindungskomponenten des Yii2-Frameworks und stellen Methoden zum Lesen aus der Slave-Bibliothek und zum Schreiben in die Master-Bibliothek bereit.
Lastausgleichsstrategie
Für die Implementierung der MySQL-Lese- und Schreibtrennung ist der Lastausgleich ein sehr wichtiger Teil. Nur wenn alle Leseanfragen gleichmäßig auf jede Slave-Datenbank verteilt werden, können die Vorteile der MySQL-Lese- und Schreibtrennung voll ausgenutzt werden.
Zu den häufig verwendeten Lastausgleichsstrategien gehören:
1. Zufällige Strategie: Leseanforderungen zufällig an jede Slave-Datenbank verteilen.
2. Polling-Strategie: Leseanfragen nacheinander jeder Slave-Bibliothek zuweisen und zyklisch verwenden.
3. Verfügbarkeitsprioritätsstrategie: Verwenden Sie eine Verfügbarkeitsüberwachungsmethode, um verfügbare Slave-Bibliotheken vor Lesevorgängen auszuwählen.
Dieser Artikel verwendet eine Abfragestrategie und die spezifische Implementierung ist wie folgt:
//从库连接信息 $slave1 = array( 'host' => 'slave1.host.com', 'user' => 'slave1user', 'pass' => 'slave1pass', 'name' => 'dbname' ); $slave2 = array( 'host' => 'slave2.host.com', 'user' => 'slave2user', 'pass' => 'slave2pass', 'name' => 'dbname' ); $slave3 = array( 'host' => 'slave3.host.com', 'user' => 'slave3user', 'pass' => 'slave3pass', 'name' => 'dbname' ); //增加从库列表 $slaveList = array($slave1, $slave2, $slave3); //轮询获取从库连接信息 function getSlaveConn() { global $slaveList; static $index = 0; if ($index >= count($slaveList)) { $index = 0; } $slave = $slaveList[$index]; $index++; $conn = mysqli_connect($slave['host'], $slave['user'], $slave['pass'], $slave['name']); mysqli_query($conn, "SET NAMES utf8"); return $conn; }
Im obigen Code sind $slave1, $slave2, $slave3 Verbindungsinformationen der Slave-Bibliothek und $slaveList die Liste der Slave-Bibliotheken. In der Funktion getSlaveConn ist $index die Anzahl der Verbindungen zur Slave-Bibliothek. Wenn die Anzahl der Verbindungen der Länge der Slave-Bibliotheksliste entspricht, wird $index auf Null zurückgesetzt und die Verbindung wird von der ersten Slave-Bibliothek aus erneut hergestellt. Verwenden Sie jedes Mal, wenn Sie eine Verbindung zu einer Slave-Bibliothek herstellen, die Funktion mysqli_connect, um eine Verbindung zur Datenbank herzustellen.
Durch die obige Implementierung wurde die PHP-Funktion zur Realisierung der MySQL-Lese- und Schreibtrennung implementiert. Sie können den obigen Code verwenden, um die MySQL-Lese-Schreib-Trennfunktion in PHP-Anwendungen zu implementieren und nach Bedarf Lastausgleichsstrategien hinzuzufügen oder zu ändern.
Bei hoher Parallelität und großem Datenvolumen kann die Verwendung von PHP zum Trennen von MySQL-Lesen und -Schreiben die Lese- und Schreibleistung der MySQL-Datenbank effektiv verbessern, die Antwortzeit der Anwendung verkürzen und das Benutzererlebnis verbessern.
Das obige ist der detaillierte Inhalt vonSo realisieren Sie die Lese- und Schreibtrennung in PHP+MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!