MySQL-proxy是处在client和数据库服务器之间的一个连接器,由MySQL自己开发。截止当前(2014-08-25),最新的版本为 0.8.4 ,这篇博客中使用的版本也是0.8.4
mysql-proxy 0.8.4 chassis: 0.8.4 glib2: 2.26.1 libevent: 1.4.13-stable LUA: Lua 5.1.4 package.path: /usr/local/lib/mysql-proxy/lua/?.lua package.cpath: /usr/local/lib/mysql-proxy/lua/?.so -- modules proxy: 0.8.4
MySQL-proxy处在client和db server之间,同一个proxy可以同时设置多台db server,只要在启动参数或者配置文件设置即可。后台的db server使用的是MM、MMS、MS等冗余方案的话,proxy可以很好的管理到db的连接。如MMS中,M1宕机之后,可以把读写任务切到M2。
那么MySQL-proxy是如何选择要连接的db的呢?proxy可以连接的db由proxy-backend-address参数来设置。该参数的格式为:
address1:port;address2:port
不同服务器之间使用分号(;)隔开,服务器地址和端口之间使用冒号(:)隔开
当后台存在多台服务器的时候,proxy默认是采用round robin(循环)的方式选择连接的db,如:MM中,第一个请求连接到M1,第二个请求连接到M2,第三个请求连接到M1......以此循环。
当然,也可以使用脚本来指定自己的连接规则,proxy安装后自带有一个balance.lua脚本,看名字也知道是用于平衡负载的(其实这脚本我也没仔细看过),MySQL-proxy使用的是Lua脚本,proxy所在的机器需要先安装Lua解释器。我所使用的是Lua版本为5.1
[root@mysql tmp]$ lua -v Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
在Lua中,要连接的db server由proxy.connection.backend_ndx参数指定。该参数值初始为0,连接之后的值为:1、2......之类的,1即proxy-backend-address参数中第一个地址,2即proxy-backend-address参数第二个地址,以此类推
如果需要在脚本中制定自己的连接规则,在脚本的connect_server()函数中设置backend_ndx的值即可,在之后的函数中修改backend_ndx参数也能修改成功,但对连接的选择造不成影响。
测试使用的proxy-backend-address参数:
proxy-backend-addresses=172.16.15.42:3306,172.16.15.42:3307
测试一共启动了两个实例,两个实例在同一个主机上的不同端口上
为了更好的观察结果,我在Lua脚本中添加了将backend_ndx参数打印出来的语句:
function connect_server() print("******************") print("------------------") --proxy.connection.backend_ndx = 2 print("backend_ndx : " .. proxy.connection.backend_ndx) end function read_auth_result() print("-------read_auth_result------") print("backend_ndx : " .. proxy.connection.backend_ndx) end
结果:
#第一个连接 mysql -uroot -h 172.16.15.42 -P 4040 -p [email protected] [(none)] >show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3306 | +---------------+-------+ 1 row in set (0.00 sec) #第一个连接Lua的输出结果 ****************** ------------------ backend_ndx : 0 -------read_auth_result------ backend_ndx : 1 #第二个连接 mysql -uroot -h 172.16.15.42 -P 4040 -p [email protected] [(none)] >show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3307 | +---------------+-------+ 1 row in set (0.00 sec) #第二个连接Lua的输出结果 ****************** ------------------ backend_ndx : 0 -------read_auth_result------ backend_ndx : 2 #第三个连接 mysql -uroot -h 172.16.15.42 -P 4040 -p [email protected] [(none)] >show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3306 | +---------------+-------+ 1 row in set (0.00 sec) #第三个连接Lua的输出结果 ****************** ------------------ backend_ndx : 0 -------read_auth_result------ backend_ndx : 1
自己用来测试的Lua脚本:
function connect_server() print("******************") print("------------------") proxy.connection.backend_ndx = 2 print("backend_ndx : " .. proxy.connection.backend_ndx) end function read_auth_result() print("-------read_auth_result------") print("backend_ndx : " .. proxy.connection.backend_ndx) end #呀,被你发现了,这和之前的不是一样的脚本么! #恩,只是之前的注释了proxy.connection.backend_ndx = 2 一行
结果:
#第一个连接 mysql -uroot -h 172.16.15.42 -P 4040 -p Enter password: ******* [email protected] [(none)] >show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3307 | +---------------+-------+ 1 row in set (0.00 sec) #第一个连接Lua的输出结果 ****************** ------------------ backend_ndx : 2 -------read_auth_result------ backend_ndx : 2 #第二个连接 mysql -uroot -h 172.16.15.42 -P 4040 -p Enter password: ******* [email protected] [(none)] >show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3307 | +---------------+-------+ 1 row in set (0.00 sec) #第二个连接Lua的输出结果 ****************** ------------------ backend_ndx : 2 -------read_auth_result------ backend_ndx : 2 #第三个连接 mysql -uroot -h 172.16.15.42 -P 4040 -p Enter password: ******* [email protected] [(none)] >show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3307 | +---------------+-------+ 1 row in set (0.00 sec) #第三个连接Lua的输出结果 ****************** ------------------ backend_ndx : 2 -------read_auth_result------ backend_ndx : 2
好啦,结果已经很明显了。然后就可以用这点去干别的事了。就可以自己写一些判断啊之类的东西来指定请求发到哪个服务器了。另外,设置连接的服务器需要在connect_server( )函数中就指定,之后的read_handshake( )函数就不好使了,因为proxy已经自己决定了要去连哪里(给你挠挠?您来晚了!)