mysql中间件mysql-proxy

mysql-proxy负责mysql数据库的主从分离和负载均衡

1.读写分离是由lua实现的,即lua是基础组件,现在mysql-proxy里面已经集成,无需再安装

1
# yum -y install gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmc rypt* libtool* flex*  pkgconfig*

2.proxy安装

下载地址:https://downloads.mysql.com/archives/proxy/#downloads

1
2
# tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz  //解压文件
# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy  //将解压得到的文件夹移动到某个位置,这个位置需要自己创建

3.proxy配置

 1
 2
 3
 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
# cd /usr/local/mysql-proxy
# mkdir lua #创建脚本存放目录
# mkdir logs #创建日志目录
# cp share/doc/mysql-proxy/rw-splitting.lua ./lua #复制读写分离配置文件
# cp share/doc/mysql-proxy/admin-sql.lua ./lua #复制管理脚本
# vi /etc/mysql-proxy.cnf   #创建配置文件
# 将以下复制到配置文件中,并按照自己的需要修改,重点注意的是:#后面的文字只是注释,在实际的文件中最好删除或者将注释和参数放在不同的行,同时,每个参数后面不能后空格,一个空格都不行(重点!重点!重点!)
####################################################################
[mysql-proxy]
user=root
#运行mysql-proxy用户
admin-username=root
#主从mysql共有的用户
admin-password=root
#用户的密码
proxy-address=192.168.20.166:4040
#mysql-proxy运行ip和端口,不加端口,默认4040
proxy-read-only-backend-addresses=192.168.20.166:3306
#指定后端从slave读取数据
proxy-backend-addresses=192.168.20.44:3306
#指定后端主master写入数据
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua
#指定读写分离配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua
#指定管理脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
#日志位置
log-level=info
#定义log日志级别,由高到低分别有(error|warning|info|message|debug)
daemon=true
#以守护进程方式运行
keepalive=true
#mysql-proxy崩溃时,尝试重启
####################################################################
#:wq保存后退出,然后修改文件的权限
# chmod 660 /etc/mysql-proxy.cnf

4.修改读写分离配置文件

1
2
3
4
5
6
7
8
# vi /usr/local/mysql-proxy/lua/rw-splitting.lua
if not proxy.global.config.rwsplit then
 proxy.global.config.rwsplit = {
  min_idle_connections = 1, #默认超过4个连接数时,才开始读写分离,改为1
  max_idle_connections = 1, #默认8,改为1
  is_debug = false
 }
end

5.配置一下环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# export PATH=$PATH:/usr/local/mysql-proxy/bin/
# echo "PATH=$PATH:/usr/local/mysql-proxy/bin" >> /etc/profile
配置完环境变量之后,可以使用该命令来测试一下是否配置成功
#vim /usr/local/mysql-proxy/logs/mysql-proxy.log
#mysql-proxy -V
#mysql-proxy --help
顺便,这里介绍一下各个参数的意义:
--help-all   :获取全部帮助信息;
--proxy-address=host:port  :代理服务监听的地址和端口;
--admin-address=host:port  :管理模块监听的地址和端口;
--proxy-backend-addresses=host:port :后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name :完成mysql代理功能的Lua脚本;
--daemon  :以守护进程模式启动mysql-proxy;
--keepalive  :在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name :日志文件名称;
--log-level=level :日志级别;
--log-use-syslog :基于syslog记录日志;
--plugins=plugin:在mysql-proxy启动时加载的插件;
--user=user_name  :运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name : 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling : 禁用profile;
--pid-file=/path/to/pid_file_name :进程文件名;

6.启动mysql-proxy

1
2
3
4
# mysql-proxy --defaults-file=/etc/mysql-proxy.cnf #开启服务
# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
# netstat -tupln | grep 4040 #已经启动
# tcp 0 0 192.168.189.130:4040 0.0.0.0:* LISTEN 1264/mysql-proxy

7.读写分离的测试

1).在主从和proxy配置正确的情况下

关闭从库的服务:slave stop;然后在proxy作查询操作,正常情况下只能看到表,但不能查询到表里面的内容

2).另一种方法就是使用抓包的方式,这里主要使用这种方式,应该比较容易理解

首先使用该命令分别在master服务器和slave服务器上监听: 其中eth部分是网卡的驱动名称,可以在/etc/sysconfig/network-scripts/中看到,一般第一个显示的就是,只需要eth*这部分就可以了 master服务器:

1
# tcpdump -i eth2 -nn -XX ip dst 192.168.20.44 and tcp dst port 3306

slave服务器:

1
#tcpdump -i ens32 -nn -XX ip dst 192.168.20.166 and tcp dst port 3306

master中能抓取到有关写的sql语句的包(update和delete读者可以自行测试),但slave不能,同时,slave能抓取到有关读的sql语句的包,但master不能,说明这已经完成了读写分离的配置了

8.停止mysql-proxy

1
sudo killall mysql-proxy