天天看点

基于mysql-proxy读写分离

一、可以使用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>] &amp;&amp; </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 &gt;&amp;</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&gt; 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,如需转载请自行联系原作者

继续阅读