一、可以使用rpm包安装,需要安装epel软件包库,或者直接从官网下载rpm包;
二、安装配置mysql-proxy:
<a href="http://s3.51cto.com/wyfs02/M00/59/CF/wKiom1Tl5ByRPughAAIPgA9lPVw679.jpg" target="_blank"></a>
2.1 下载所需要的版本
这里的系统平台为rhel6.4 32位系统,因此就以mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit.tar.gz为例。
1
2
3
<code>tar</code> <code>xf mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit.</code><code>tar</code><code>.gz -C </code><code>/usr/local</code>
<code>cd</code> <code>/usr/local</code>
<code>ln</code> <code>-sv mysql-proxy-0.8.1-linux-glibc2.3-x86-32bit mysql-proxy</code>
添加代理用户
<code>useradd</code> <code>mysql-proxy</code>
2.2 为mysql-proxy提供SysV服务脚本,内容如下所示
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<code>#!/bin/bash</code>
<code>#</code>
<code># mysql-proxy This script starts and stops the mysql-proxy daemon</code>
<code># chkconfig: - 78 30</code>
<code># processname: mysql-proxy</code>
<code># description: mysql-proxy is a proxy daemon for mysql</code>
<code># Source function library.</code>
<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>
<code>prog=</code><code>"/usr/local/mysql-proxy/bin/mysql-proxy"</code>
<code># Source networking configuration.</code>
<code>if</code> <code>[ -f </code><code>/etc/sysconfig/network</code> <code>]; </code><code>then</code>
<code> </code><code>. </code><code>/etc/sysconfig/network</code>
<code>fi</code>
<code># Check that networking is up.</code>
<code>[ ${NETWORKING} = </code><code>"no"</code> <code>] && </code><code>exit</code> <code>0</code>
<code># Set default mysql-proxy configuration.</code>
<code>ADMIN_USER=</code><code>"admin"</code>
<code>ADMIN_PASSWD=</code><code>"admin"</code>
<code>ADMIN_LUA_SCRIPT=</code><code>"/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"</code>
<code>PROXY_OPTIONS=</code><code>"--daemon"</code>
<code>PROXY_PID=</code><code>/var/run/mysql-proxy</code><code>.pid</code>
<code>PROXY_USER=</code><code>"mysql-proxy"</code>
<code># Source mysql-proxy configuration.</code>
<code>if</code> <code>[ -f </code><code>/etc/sysconfig/mysql-proxy</code> <code>]; </code><code>then</code>
<code> </code><code>. </code><code>/etc/sysconfig/mysql-proxy</code>
<code>RETVAL=0</code>
<code>start() {</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Starting $prog: "</code>
<code> </code><code>daemon $prog $PROXY_OPTIONS --pid-</code><code>file</code><code>=$PROXY_PID --proxy-address=</code><code>"$PROXY_ADDRESS"</code> <code>--user=$PROXY_USER --admin-username=</code><code>"$ADMIN_USER"</code> <code>--admin-lua-script=</code><code>"$ADMIN_LUA_SCRIPT"</code> <code>--admin-password=</code><code>"$ADMIN_PASSWORD"</code>
<code> </code><code>RETVAL=$?</code>
<code> </code><code>echo</code>
<code> </code><code>if</code> <code>[ $RETVAL -</code><code>eq</code> <code>0 ]; </code><code>then</code>
<code> </code><code>touch</code> <code>/var/lock/subsys/mysql-proxy</code>
<code> </code><code>fi</code>
<code>}</code>
<code>stop() {</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Stopping $prog: "</code>
<code> </code><code>killproc -p $PROXY_PID -d 3 $prog</code>
<code> </code><code>rm</code> <code>-f </code><code>/var/lock/subsys/mysql-proxy</code>
<code> </code><code>rm</code> <code>-f $PROXY_PID</code>
<code># See how we were called.</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code><code>start)</code>
<code> </code><code>start</code>
<code> </code><code>;;</code>
<code> </code><code>stop)</code>
<code> </code><code>stop</code>
<code> </code><code>restart)</code>
<code> </code><code>condrestart|try-restart)</code>
<code> </code><code>if</code> <code>status -p $PROXY_PIDFILE $prog >&</code><code>/dev/null</code><code>; </code><code>then</code>
<code> </code><code>stop</code>
<code> </code><code>start</code>
<code> </code><code>fi</code>
<code> </code><code>status)</code>
<code> </code><code>status -p $PROXY_PID $prog</code>
<code> </code><code>*)</code>
<code> </code><code>echo</code> <code>"Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart}"</code>
<code> </code><code>RETVAL=1</code>
<code>esac</code>
<code>exit</code> <code>$RETVAL</code>
将上述内容保存为/etc/rc.d/init.d/mysql-proxy,给予执行权限,而后加入到服务列表。
<code>chmod</code> <code>+x </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/mysql-proxy</code>
<code>chkconfig --add mysql-proxy</code>
2.3 为服务脚本提供配置文件/etc/sysconfig/mysql-proxy,内容如下所示:
<code># Options for mysql-proxy </code>
<code>ADMIN_PASSWORD=</code><code>"admin"</code>
<code>ADMIN_ADDRESS=</code><code>""</code>
<code>PROXY_ADDRESS=</code><code>""</code>
<code>PROXY_OPTIONS=</code><code>"--daemon --log-level=info --log-use-syslog"</code>
其中最后一行,需要按实际场景进行修改,例如:
<code>PROXY_OPTIONS=</code><code>"--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.21:3306 --proxy-read-only-backend-addresses=192.168.1.211:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"</code>
其中的proxy-backend-addresses选项和proxy-read-only-backend-addresses选项均可重复使用多次,以实现指定多个读写服务器或只读服务器。
2.4 mysql-proxy的配置选项
mysql-proxy的配置选项大致可分为帮助选项、管理选项、代理选项及应用程序选项几类,下面一起去介绍它们。
<code>--help</code>
<code>--help-admin</code>
<code>--help-proxy</code>
<code>--help-all ———— 以上四个选项均用于获取帮助信息;</code>
<code>--proxy-address=host:port ———— 代理服务监听的地址和端口;</code>
<code>--admin-address=host:port ———— 管理模块监听的地址和端口;</code>
<code>--proxy-backend-addresses=host:port ———— 后端mysql服务器的地址和端口;</code>
<code>--proxy-</code><code>read</code><code>-only-backend-addresses=host:port ———— 后端只读mysql服务器的地址和端口;</code>
<code>--proxy-lua-script=file_name ———— 完成mysql代理功能的Lua脚本;</code>
<code>--daemon ———— 以守护进程模式启动mysql-proxy;</code>
<code>--keepalive ———— 在mysql-proxy崩溃时尝试重启之;</code>
<code>--log-</code><code>file</code><code>=</code><code>/path/to/log_file_name</code> <code>———— 日志文件名称;</code>
<code>--log-level=level ———— 日志级别;</code>
<code>--log-use-syslog ———— 基于syslog记录日志;</code>
<code>--plugins=plugin,.. ———— 在mysql-proxy启动时加载的插件;</code>
<code>--user=user_name ———— 运行mysql-proxy进程的用户;</code>
<code>--defaults-</code><code>file</code><code>=</code><code>/path/to/conf_file_name</code> <code>———— 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;</code>
<code>--proxy-skip-profiling ———— 禁用profile;</code>
<code>--pid-</code><code>file</code><code>=</code><code>/path/to/pid_file_name</code> <code>———— 进程文件名;</code>
3、复制如下内容建立admin.lua文件,将其保存至/usr/local/mysql-proxy/share/doc/mysql-proxy/目录中。
75
76
77
78
79
80
81
82
83
84
85
86
87
<code>--[[ $%BEGINLICENSE%$</code>
<code> </code><code>Copyright (c) 2007, 2012, Oracle and</code><code>/or</code> <code>its affiliates. All rights reserved.</code>
<code> </code><code>This program is </code><code>free</code> <code>software; you can redistribute it and</code><code>/or</code>
<code> </code><code>modify it under the terms of the GNU General Public License as</code>
<code> </code><code>published by the Free Software Foundation; version 2 of the</code>
<code> </code><code>License.</code>
<code> </code><code>This program is distributed </code><code>in</code> <code>the hope that it will be useful,</code>
<code> </code><code>but WITHOUT ANY WARRANTY; without even the implied warranty of</code>
<code> </code><code>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</code>
<code> </code><code>GNU General Public License </code><code>for</code> <code>more</code> <code>details.</code>
<code> </code><code>You should have received a copy of the GNU General Public License</code>
<code> </code><code>along with this program; </code><code>if</code> <code>not, write to the Free Software</code>
<code> </code><code>Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA</code>
<code> </code><code>02110-1301 USA</code>
<code> </code><code>$%ENDLICENSE%$ --]]</code>
<code>function</code> <code>set_error(errmsg) </code>
<code>proxy.response = {</code>
<code>type</code> <code>= proxy.MYSQLD_PACKET_ERR,</code>
<code>errmsg = errmsg or </code><code>"error"</code>
<code>end</code>
<code>function</code> <code>read_query(packet)</code>
<code>if</code> <code>packet:byte() ~= proxy.COM_QUERY </code><code>then</code>
<code>set_error(</code><code>"[admin] we only handle text-based queries (COM_QUERY)"</code><code>)</code>
<code>return</code> <code>proxy.PROXY_SEND_RESULT</code>
<code>local</code> <code>query = packet:sub(2)</code>
<code>local</code> <code>rows = { }</code>
<code>local</code> <code>fields = { }</code>
<code>if</code> <code>query:lower() == </code><code>"select * from backends"</code> <code>then</code>
<code>fields = { </code>
<code>{ name = </code><code>"backend_ndx"</code><code>, </code>
<code> </code><code>type</code> <code>= proxy.MYSQL_TYPE_LONG },</code>
<code>{ name = </code><code>"address"</code><code>,</code>
<code> </code><code>type</code> <code>= proxy.MYSQL_TYPE_STRING },</code>
<code>{ name = </code><code>"state"</code><code>,</code>
<code>{ name = </code><code>"type"</code><code>,</code>
<code>{ name = </code><code>"uuid"</code><code>,</code>
<code>{ name = </code><code>"connected_clients"</code><code>, </code>
<code>for</code> <code>i = 1, </code><code>#proxy.global.backends do</code>
<code>local</code> <code>states = {</code>
<code>"unknown"</code><code>,</code>
<code>"up"</code><code>,</code>
<code>"down"</code>
<code>local</code> <code>types = {</code>
<code>"rw"</code><code>,</code>
<code>"ro"</code>
<code>local</code> <code>b = proxy.global.backends[i]</code>
<code>rows[</code><code>#rows + 1] = {</code>
<code>i,</code>
<code>b.dst.name, -- configured backend address</code>
<code>states[b.state + 1], -- the C-</code><code>id</code> <code>is pushed down starting at 0</code>
<code>types[b.</code><code>type</code> <code>+ 1], -- the C-</code><code>id</code> <code>is pushed down starting at 0</code>
<code>b.uuid, -- the MySQL Server's UUID </code><code>if</code> <code>it is managed</code>
<code>b.connected_clients -- currently connected clients</code>
<code>elseif query:lower() == </code><code>"select * from help"</code> <code>then</code>
<code>{ name = </code><code>"command"</code><code>, </code>
<code>{ name = </code><code>"description"</code><code>, </code>
<code>rows[</code><code>#rows + 1] = { "SELECT * FROM help", "shows this help" }</code>
<code>rows[</code><code>#rows + 1] = { "SELECT * FROM backends", "lists the backends and their state" }</code>
<code>else</code>
<code>set_error(</code><code>"use 'SELECT * FROM help' to see the supported commands"</code><code>)</code>
<code>type</code> <code>= proxy.MYSQLD_PACKET_OK,</code>
<code>resultset = {</code>
<code>fields = fields,</code>
<code>rows = rows</code>
4、测试
4.1 管理功能测试
<code># mysql -uadmin -padmin -192.168.1.22 --port=4041 </code>
<code>Welcome to the MySQL monitor. Commands end with ; or \g.</code>
<code>Your MySQL connection </code><code>id</code> <code>is 1</code>
<code>Server version: 5.0.99-agent-admin</code>
<code>Type </code><code>'help;'</code> <code>or </code><code>'\h'</code> <code>for</code> <code>help. Type </code><code>'\c'</code> <code>to </code><code>clear</code> <code>the buffer.</code>
<code>mysql> SELECT * FROM backends;</code>
<code>+-------------+--------------------+---------+------+------+-------------------+</code>
<code>| backend_ndx | address | state | </code><code>type</code> <code>| uuid | connected_clients |</code>
<code>| 1 | 192.168.1.21:3306 | up | rw | NULL | 0 |</code>
<code>| 2 | 192.168.1.211:3306 | unknown | ro | NULL | 0 |</code>
<code>2 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
4.2 读写分离测试
<code>mysql -uroot -h192.168.1.22 --port=4040 -p</code>
<code></code>
本文转自 wzlinux 51CTO博客,原文链接:http://blog.51cto.com/wzlinux/1614918,如需转载请自行联系原作者