基本原理是在主数据库中处理事务查询,然后从数据库中处理SELECT查询。 数据库复制用于将事务查询所做的更改同步到群集中的从数据库。
Jan Kneschke在《MySQL Proxy learns R/W Splitting》中详细介绍了该技术和连接池问题:
为了实现读写分离,需要连接池。 只有在到后端的经过验证的连接打开时才切换到后端。 MySQL协议首先进行握手。 进入返回查询/结果阶段后认证新连接太晚了。 为了正常工作,必须确保足够的连接。
用于读写分离的LUA脚本:
-读写分离
--
-将所有非事务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]
-必须选择具有空闲连接的从数据库
ifs.type==proxy.back end _ type _ roand
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
结束
结束
结束
-现在,您找到了具有空闲连接的从数据库
if max_conns_ndx 0 then
proxy.connection.back end _ ndx=max _ conns _ ndx
结束
else
-发送到主数据库
结束
return proxy.PROXY_SEND_QUERY
注释:此技术还可以用于实现其他数据分布策略,如切片(Sharding )。