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已经自己决定了要去连哪里(给你挠挠?您来晚了!)