mysql proxy读写分离

来源:互联网 发布:基础英语口语对话软件 编辑:程序博客网 时间:2024/05/04 08:08

mysql proxy 介绍
MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。
这里写图片描述
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可
服务器说明:
192.168.1.100 (主库)
192.168.1.101 (从库)
192.168.1.100 (mysql proxy)
mysql proxy安装
前往mysql官网下载软件包,我这里的平台是centos 6.5,64位操作系统,所以下载http://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz,这个下载的是已编译的文件,解压即可使用。
这里写图片描述
查看操作系统版本信息:

[root@iZ23rter8cjZ /]# uname -aLinux iZ23rter8cjZ 2.6.32-573.22.1.el6.x86_64 #1 SMP Wed Mar 23 03:35:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux[root@iZ23rter8cjZ /]# getconf LONG_BIT64

解压安装:

[root@iZ23rter8cjZ ~]# tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz [root@iZ23rter8cjZ ~]# cd mysql-proxy-0.8.5-linux-el6-x86-64bit[root@iZ23rter8cjZ mysql-proxy-0.8.5-linux-el6-x86-64bit]# lsbin  include  lib  libexec  licenses  share[root@iZ23rter8cjZ ~]# cp mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql/proxy/[root@iZ23rter8cjZ ~]# cd /usr/local/mysql/proxy/

配置环境变量

[root@iZ23rter8cjZ proxy]# vim ~/.bash_profile #添加:/usr/local/mysql/proxy/binPATH=$PATH:$HOME/bin:/usr/local/mysql/proxy/bin#保存退出,读取环境变量[root@iZ23rter8cjZ proxy]# source ~/.bash_profile 

把lua,读写分离脚本拷贝lua目录

[root@iZ23rter8cjZ proxy]# cp /usr/local/mysql/proxy/share/doc/mysql-proxy/rw-splitting.lua /usr/local/mysql/proxy/lib/mysql-proxy/lua/

编辑rw-splitting.lua脚本

这里写图片描述
默认最小4个(最大8个)以上的客户端连接才会实现读写分离, 现改为最小1个最大1
个,便于读写分离的测试。

注:在读写分离测试时,需要开启多个窗口连接mysql-proxy

这是因为mysql-proxy会检测客户端连接, 当连接没有超过min_idle_connections
预设值时, 不会进行读写分离, 即查询操作会发生到Master上
就像这样子:
这里写图片描述

开启防火墙
在192.168.1.100和192.168.1.101上都设置

-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT -A INPUT -p tcp -m tcp --dport 4040 -j ACCEPT 

重启防火墙设置:

[root@iZ23rter8cjZ lua]# service iptables restartiptables: Setting chains to policy ACCEPT: filter          [  OK  ]iptables: Flushing firewall rules:                         [  OK  ]iptables: Unloading modules:                               [  OK  ]iptables: Applying firewall rules:                         [  OK  ]

设置LUA_PATH变量

注:对于此变量也可不设置。可在mysql-proxy启动脚本中配置。
在/etc/profile中添加如下内容

LUA_PATH="/usr/local/mysql/proxy/lib/mysql-proxy/lua/?.lua"export LUA_PATH

执行mysql-proxy -V显示如下结果,显示mysql proxy的lua脚本路径

[root@iZ23rter8cjZ lua]# mysql-proxy -Vmysql-proxy 0.8.5  chassis: 0.8.5  glib2: 2.16.6  libevent: 2.0.21-stable  LUA: Lua 5.1.4    package.path: /usr/local/mysql/proxy/lib/mysql-proxy/lua/?.lua    package.cpath: /usr/local/mysql/proxy/lib/mysql-proxy/lua/?.so;-- modules  proxy: 0.8.5

登录主库192.168.1.100和从库192.168.1.101给mysq-proxy登录用户授权

授权grant all privileges on *.* to 'mysql-proxy'@'%' identified by '123456';刷新权限flush privileges;

mysql proxy 命令简介
–help-all ———— 用于获取全部帮助信息
–proxy-address=host:port ———— 代理服务监听的地址和端口(缺省是4040)
–admin-address=host:port ———— 指定管理主机地址和端口(缺省是4041)
–proxy-backend-addresses=host:port ——后端mysql服务器的地址和端口(主服务器)
简写:-b
–proxy-read-only-backend-addresses=host:port ———— 后端只读mysql服务器的地址和端口(从服务器)简写:-r
–proxy-lua-script=file ———— 指定mysql代理功能的Lua脚本文件 –daemon ———— 以守护进程模式启动mysql-proxy
–defaults-file=/path/to/conf_file_name ———— 默认使用的配置文件路径
–log-file=/path/to/log_file_name ———— 日志文件名称
–log-level=level ———— 日志级别
–user=user_name ———— 运行mysql-proxy进程的用户
–admin-username=user ———— 指定登录到mysql-proxy管理界面的用户名 –admin-password=pass ———— 指定登录到mysql-proxy管理界面的用户密码
–admin-lua-script=script-file ————管理模块的lua脚本文件路径(创建管理接口)
–plugins=admin ———— 加载管理插件

可以是用mysql-proxy –help 查看帮助

开关选项启动 mysql-proxy

mysql-proxy --daemon --log-level=debug \--log-file=/var/log/mysql-proxy.log \--plugins=proxy -b 192.168.1.100:3306 -r 192.168.1.101:3306 \--proxy-lua-script=/usr/local/mysql/proxy/lib/mysql-proxy/lua/rw-splitting.lua \--plugins=admin --admin-username=admin \--admin-password=admin \--admin-lua-script=/usr/local/mysql/proxy/lib/mysql-proxy/lua/admin.lua

这里写图片描述

查看启动日志:
这里写图片描述

测试读写分离

mysql -umysql-proxy -p123456 -h192.168.1.100 -P4040注意:这里需要多开几个终端,连接mysql-proxy先登录mysql-proxy管理界面mysql -uadmin -padmin -h192.168.1.100 -P4041select * from backends;mysql> select * from backends;+-----------+-----------------+-------+------+------+-------------------+| backend_ndx | address             | state | type | uuid | connected_clients |+-----------+-----------------+-------+------+------+-------------------+|           1 | 192.168.1.100:3306  | up    | rw   | NULL |                 0 ||           2 | 192.168.1.101:3306 | up    | ro   | NULL |                 0 |+-----------+-----------------+-------+------+------+-------------------+2 rows in set (0.00 sec)state:up时才能经行读写分离,所以需要多开几个连接,查看这个状态。之前创建了数据库repl_db和repl_table,注意两个数据库都需要创建同样的数据表create database repl_db charset=utf8;use repl_db;CREATE TABLE `repl_table` (  `f1` int(11) DEFAULT NULL,  `f2` varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mysql> insert into repl_table(f1,f2) values('1','one');Query OK, 1 row affected (0.01 sec)mysql> select * from repl_db.repl_table;Empty set (0.02 sec)发现查询为空,先不着急,mysql连接主库查看一下,登录192.168.1.100连接主库。mysql -uroot -p123456mysql> select * from repl_db.repl_table;+------+------+| f1   | f2   |+------+------+|    1 | one  |+------+------+1 row in set (0.00 sec)结果有数据。恭喜你,配置成功。
0 0
原创粉丝点击