Mysql-proxy实现读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。所以读写分离,解决的是,数据库的写入,影响了查询的效率。数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。

实验准备3台主机:

server2:(master)

server3:(slave)

server4:(proxy)

首先配置好server2/3的主从复制。

Mysql-proxy实现读写分离

安装mysql-proxy:

mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[[email protected] ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[[email protected] ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy

[[email protected] ~]# cd /usr/local/mysql-proxy/bin/

[[email protected] bin]# vim ~/.bash_profile

[[email protected] bin]# source ~/.bash_profile

Mysql-proxy实现读写分离

[[email protected] mysql-proxy]# cd share/doc/

[[email protected] doc]# cd mysql-proxy/

[[email protected] mysql-proxy]# vim rw-splitting.lua

Mysql-proxy实现读写分离

min_idle_connections = 1,默认超过4个连接数时,才开始读写分离,改为1

max_idle_connections = 2,#默认8,改为2

配置mysql-proxy启动文件

[[email protected] conf]# /usr/local/mysql-proxy/bin/mysql-proxy --help            ##查看配置项

[[email protected] ~]# cd /usr/local/mysql-proxy/

[[email protected] mysql-proxy]# mkdir conf

[[email protected] mysql-proxy]# mkdir logs

[[email protected] mysql-proxy]# cd conf/

[[email protected] conf]# vim mysql-proxy.conf

user=root运行mysql-proxy用户
proxy-address=0.0.0.0:3306
proxy-read-only-backend-addresses=172.25.0.118:3306 指定后端从slave读取数据
proxy-backend-addresses=172.25.0.117:3306指定后端主master写入数据
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua读
写分离配置脚本 admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua管理脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log日志位置
log-level=debug定义log日志级别,由高到低分别有(error|warning|info|message|debug
daemon=true以守护进程方式运行
keepalive=true 崩溃时,尝试重启

admin-address=172.25.0.119:4041   ##proxy的管理用户adminiphe端口
admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua        #admin的lua脚本地址
admin-username=admin                      #添加admin用户
admin-password=Westos+123          ## admin用户的密码
plugins=proxy,admin                            #添加admin模块

Mysql-proxy实现读写分离

启动mysql-proxy

[[email protected] conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf

[[email protected] conf]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf

Mysql-proxy实现读写分离

测试:

主库授权:#该用户必须可以远程登陆root

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Westos+123';

[[email protected] ~]# mysql -h 172.25.0.117 -u root -p

mysql> use westos

mysql> select * from usertable;

Mysql-proxy实现读写分离

 

安装lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接 和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

[[email protected] ~]# yum install lsof -y

[[email protected] ~]# lsof -i :3306

Mysql-proxy实现读写分离

当连接数大于2(lua脚本中设置);即启动了读写分离机制:可以登陆admin proxy管理用户查看

再开启一个shell连接mysql

Mysql-proxy实现读写分离

在连接mysql的shell里添加信息

mysql> insert into usertable values('user3','333');

通过tcpdump抓取数据分析读写分离

[[email protected] ~]# yum install tcpdump -y

[[email protected] ~]# tcpdump -i eth0 port 3306

Mysql-proxy实现读写分离