0.MySQL-proxy介绍
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
1.MySQL-proxy正确理解的理论指导
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参数也能修改成功,但对连接的选择造不成影响。
2.测试:
测试使用的proxy-backend-address参数:
proxy-backend-addresses=172.16.15.42:3306,172.16.15.42:3307
测试一共启动了两个实例,两个实例在同一个主机上的不同端口上
2.1proxy默认的连接方式
为了更好的观察结果,我在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
root@172.16.15.42 [(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
root@172.16.15.42 [(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
root@172.16.15.42 [(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
2.2自定义Lua脚本
自己用来测试的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: *******
root@172.16.15.42 [(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: *******
root@172.16.15.42 [(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: *******
root@172.16.15.42 [(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已经自己决定了要去连哪里(给你挠挠?您来晚了!)