在应用层和数据库集群之间添加一个代理服务,应用层访问代理,代理根据请求类型(读/写)自动分流到不同的数据库服务器。
下面通过一个完整的示例,说明mycat如何实现读写分离。
本示例需要利用mysql主从复制,需要提前搭建主从同步环境,可以参考上一篇博客https://blog.csdn.net/Weixiaohuai/article/details/101161525,提先搭建好主从复制。
【a】创建数据库和表
create database septwriteread;
use septwriteread;
create table user(id int not null,name varchar(20));
create database septwriteread02;
use septwriteread02;
create table user(id int not null,name varchar(20));
同时,从库也同步过来了主库创建的数据库和表:
【b】配置server.xml
0905
TESTDB
0905
TESTDB
true
【c】schema.xml配置分片节点、分片表等
select user()
【d】配置rule.xml
2
id
mod-long
【e】测试插入数据
在MyCat服务器192.168.8.130上面执行:
insert into user(id,name) values(1111111,database());
insert into user(id,name) values(2222222,database());
insert into user(id,name) values(3333333,database());
insert into user(id,name) values(4444444,database());
重启mycat:
mysql -uroot -p0905 -h192.168.8.130 -P8066
【f】测试分析查询数据:
select * from user;
下面分几种情况分析当balance取不同值,请求分发的情况如下:
【a】当balance=“3”,开启负载均衡,请求分发到writeHost对应的readHost。查看mycat.log debug日志,走从服务器192.168.8.131的hostS1节点。
【b】当balance=“0”,表示不开启负载均衡,查看mycat.log debug日志,走主服务器192.168.8.130,可见所有读操作都发送到writeHost中。
修改schema.xml中balance负载均衡的值:
select user()
然后重启mycat,在主库执行查询语句 select * from user;查看日志:
【c】当balance=“2”,表示请求随机分发到writeHost或者readhost。查看mycat.log debug日志,走192.168.8.130或者192.168.8.131,所有读操作都随机发送到writeHost或者readHost中。
select user()
然后重启mycat,在主库执行查询语句 select * from user;查看日志:
【d】当balance=1时,开启读写分离机制,所有读操作都发送到当前writeHost对应的readHost和备用的writeHost上,通过日志分析所有读操作都发送到hostS1或者hostM2【让全部的readHost及备用的writeHost参与select的负载均衡。 】
select user()
下面补充一下dataHost节点中比较重要的三个属性以及各自值的含义,具体如下。
balance指的负载均衡类型,目前的取值有4种:
writeType属性:
switchType指的是切换的模式,目前的取值也有4种: