Mysql读写分离原理
原理就是让Master 数据库处理事务性增、删除、修改、更新操作(create、insert、delete、update),Slave数据库处理Select操作。
读写分离的前提是基于MYSQL主从复制,这样可以保证在Master上修改数据,Slave同步之后,WEB应用可以读取到Slave侧的数据。
Mysql读写分离有以下几种方式:
1.Mysql-proxy读写分离
2.Amoeba读写分离
3.Mycat读写分离
4.通过开发代码实现
本文主要介绍mysql-proxy方式实现读写分离
Mysql-proxy介绍:
Mysql-proxy是Mysql官方提供的中间件服务,支持无数客户端连接,同时后端可以连接若干台Mysql-Server服务器,Mysql-proxy自身基于Mysql协议,连接Mysql-proxy客户端无需修改任何设置,跟正常连接Mysql Server没有区别。
Mysql-proxy是应用App(客户端)与Mysql Server之间的一个连接代理,Mysql-proxy负责将App应用的SQL请求根据转发规则,转发至相应的后端数据库,基于lua脚本,可以实现复杂的连接控制和过滤,从而实现数据读写分离和负责均衡的需求。
下图为Mysql-proxy读写分离的架构图:
Mysql-proxy读写分离安装配置
1.环境准备
准备两台MYSQL服务器配置为主从复制,具体安装配置请见:http://blog.csdn.net/scott_bing/article/details/78353427
Mysql-proxy服务器:192.168.241.136
2.安装配置
a.下载mysql-proxy,解压并重命名至/usr/local/mysql-proxy wget -c -P /src http://mirrors.sohu.com/mysql/MySQL-Proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz tar zxvf /src/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz-C /usr/local/ mv /usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy b.创建系统用户mysql-proxyuseradd –r mysql-proxy c.配置环境变量 /etc/profile中添加一下代码: export PATH=$PATH:/usr/local/mysql-proxy/bin/ 然后执行source /etc/profile使环境变量生效 d.启动mysql-proxy中间件,命令如下: mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive--log-file=/var/log/mysql-proxy.log --plugins="proxy"--proxy-backend-addresses="192.168.241.133:3306"--proxy-read-only-backend-addresses="192.168.241.135:3306"--proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"--plugins=admin --admin-username="admin"--admin-password="admin"--admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua" --proxy-backend-addresses="192.168.241.133:3306"主mysql写 --proxy-read-only-backend-addresses="192.168.241.135:3306"从mysql读 |
3.安装后测试mysql-proxy读写状态是否正常
a.Mysql-proxy启动后,在服务器端查看端口 4040为proxy代理端口,用于WEB应用连接 4041为管理端口,用于SA或DBA管理员连接 b.基于4041端口Mysql-proxy查看读写分离状态,登录4041管理端口(在master/slave登录操作) mysql -h192.168.241.136 -uadmin -padmin -P 4041 登录后执行select命令,如图state均为up状态,type类型为rw、ro,则证明读写分离状态成功 select * from backends; c.如果状态未unknown未知状态,可以在unknown数据库上登录mysql-proxy的4040端口,执行:show databases;命令,直到state变成up状态为止。 若unknown数据库上登录不了mysql-proxy的4040端口,需给mysql-proxy授权: grant all on *.* to discuz@'192.168.241.136' identified by 'discuz'; mysql -h192.168.241.136 -udiscuz -pdiscuz -P 4040 -e 'show databases'; 这边选择业务数据库discuz来测试 |
写数据 以3306端口登录至Master库,进行数据写入操作,执行以下代码: use discuz; create table db_test(id varchar(20),name varchar(20),age int(10)); insert into db_test values(01,'Mike',18); insert into db_test values(02,'James',20); --------------------------------------------------------------------------------------------------------------------------------------- 读数据 以4040端口登录mysql-proxy,进行数据读操作,执行以下代码: mysql -h192.168.241.136 -udiscuz -pdiscuz -P 4040 -e 'select * from discuz.db_test' |
5.discuz配置mysql-proxy
登录apache服务器,修改discuz网站发布目录/usr/local/apache/htdocs,全局配置文件config_global.php,查找dbhost段,将192.168.241.133修改为192.168.241.136:4040,如下图: |