Eine der leistungsstärksten Funktionen von MySQL Proxy ist die „Lese-/Schreibaufteilung“. Das Grundprinzip besteht darin, dass die Master-Datenbank Transaktionsabfragen verarbeitet, 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 Problem des Verbindungspools ausführlich in „MySQL Proxy lernt R/W-Splitting“ vor:
Um eine Lese- und Schreibtrennung zu erreichen, haben wir Benötigen Sie einen 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-/Ergebnisrückgabephase 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- und Schreibtrennung:
- 读写分离 -- -- 发送所有的非事务性Select到一个从数据库 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
Hinweis: Diese Technik kann auch zur Implementierung anderer Datenverteilungsstrategien wie Sharding verwendet werden.
Das Obige ist der Inhalt der MySQL-Lese- und Schreibtrennung (praktischer Artikel). Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn)!