mysql proxy读写分离

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 -a
Linux 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_BIT
64

解压安装:

[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]# ls
bin  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/bin
PATH=$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 restart
iptables: 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 -V
mysql-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 -P4041
select * 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=utf8

mysql> 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 -p123456
mysql> select * from repl_db.repl_table;
+------+------+
| f1   | f2   |
+------+------+
|    1 | one  |
+------+------+
1 row in set (0.00 sec)
结果有数据。恭喜你,配置成功。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值