Das Grundprinzip besteht darin, die Hauptdatenbank transaktionale Abfragen verarbeiten zu lassen, während die Slave-Datenbank SELECT-Abfragen verarbeitet. Die Datenbankreplikation wird verwendet, um durch Transaktionsabfragen verursachte Änderungen an Slave-Datenbanken im Cluster zu synchronisieren.
Jan Kneschke stellte diese Technik und das Verbindungspoolproblem ausführlich in „MySQL Proxy lernt R/W-Splitting“ vor:
Um eine Lese- und Schreibtrennung zu erreichen, benötigen wir eine Verbindungspool. Wir wechseln nur dann zu einem Backend, wenn eine authentifizierte Verbindung zu diesem Backend geöffnet ist. Das MySQL-Protokoll beginnt mit einem Handshake. Beim Eintritt in die Abfrage-/Rückgabeergebnisphase ist es zu spät, die neue Verbindung zu authentifizieren. Wir müssen sicherstellen, dass wir über genügend offene Verbindungen verfügen, damit alles ordnungsgemäß funktioniert.
LUA-Skript zur Implementierung der Lese-Schreib-Trennung:
--Lese-Schreib-Trennung
--
--Alle nicht-transaktionalen Selects an eine Slave-Datenbank senden
if is_in_transaction == 0 and packet:byte() == proxy.COM_QUERY and packet:sub(2, 7) == "SELECT" then local max_conns = -1 local max_conns_ndx = 0 for i = 1, #proxy.servers do local s = proxy.servers[i] -- 需要选择一个拥有空闲连接的从数据库 if s.type == proxy.BACKEND_TYPE_RO and s.idling_connections > 0 then if max_conns == -1 or s.connected_clients < max_conns then max_conns = s.connected_clients max_conns_ndx = i end end end -- 至此,我们找到了一个拥有空闲连接的从数据库 if max_conns_ndx > 0 then proxy.connection.backend_ndx = max_conns_ndx end else -- 发送到主数据库 end return proxy.PROXY_SEND_QUERY
Kommentar: Diese Technik kann auch zur Implementierung anderer Datenverteilungsstrategien wie Sharding verwendet werden.
Das Obige ist der Inhalt der MySQL-Lese-/Schreibtrennung (Grundlagen). Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn)!