Mysql读写分离详解

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-proxy

useradd –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来测试
4.进行读写业务数据测试

写数据
以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,如下图:
刷新页面即可。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章