Mycat中,除了分库分表,还有着一个重要核心功能,读写分离,相信小伙伴们都很耳熟吧,这次我们就来看看读写分离是如何实现的吧。
示例:用三个实例组成MySQL主从集群,验证MyCAT的读写分离功能,其实,一主一从就可以满足,之所以用三个,是为了验证MyCAT的分片功能。
集群组成如下:
这里我们还是使用Travelrecord表进行测试。
首先我们来编辑MyCAT的配置文件schema.xml,关于dataHost的配置信息如下:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> </writeHost> <writeHost host="hostS1" url="192.168.244.146:3306" user="root" password="123456" /> <writeHost host="hostS2" url="192.168.244.144:3306" user="root" password="123456" /> </dataHost>
读写分离验证
创建Travelrecord表
create table travelrecord(id bigint not null primary key, user_id varchar(100), traveldate DATE, fee decimal, days int);
插入数据
mysql > insert into travelrecord(id, user_id, traveldate, fee, days) values(1, @ @hostname, 20160101, 100, 10); Query OK, 1 row affected, 1 warning(0.02 sec) mysql > insert into travelrecord(id, user_id, traveldate, fee, days) values(5000001, @ @hostname, 20160102, 100, 10); Query OK, 1 row affected, 1 warning(0.01 sec)
在这里,用了一个取巧的方法,即对user_id插入了当前实例的主机名,这样可直观的观察读写是否分离以及MyCAT的分片功能。能这样做的原因在于我当前的MySQL版本-5.6.26默认是基于statement的复制,如果是基于row的复制,则这个方法将不可取。
查询数据
mysql > select * from travelrecord; + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | id | user_id | traveldate | fee | days | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | 1 | mysql - server2 | 2016 - 01 - 01 | 100 | 10 | | 5000001 | mysql - server3 | 2016 - 01 - 02 | 100 | 10 | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + 2 rows in set(0.01 sec) mysql > select * from travelrecord; + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | id | user_id | traveldate | fee | days | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | 5000001 | mysql - server3 | 2016 - 01 - 02 | 100 | 10 | | 1 | mysql - server2 | 2016 - 01 - 01 | 100 | 10 | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + 2 rows in set(0.02 sec) mysql > select * from travelrecord; + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | id | user_id | traveldate | fee | days | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | 5000001 | mysql - server3 | 2016 - 01 - 02 | 100 | 10 | | 1 | mysql - server3 | 2016 - 01 - 01 | 100 | 10 | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + 2 rows in set(0.01 sec) mysql > select * from travelrecord; + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | id | user_id | traveldate | fee | days | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | 5000001 | mysql - server3 | 2016 - 01 - 02 | 100 | 10 | | 1 | mysql - server3 | 2016 - 01 - 01 | 100 | 10 | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + 2 rows in set(0.01 sec) mysql > select * from travelrecord; + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | id | user_id | traveldate | fee | days | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- + | 1 | mysql - server2 | 2016 - 01 - 01 | 100 | 10 | | 5000001 | mysql - server2 | 2016 - 01 - 02 | 100 | 10 | + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- +
从以上输出结果我们可以得出以下两点:
1)、这个配置已实现读写分离,读去数据是没有master节点的。
2)、MyCAT的随机分发不是基于statement的,即一个select语句查询其中一个节点,另外一个select语句查询另外一个节点。它分发针对的是片的,同一个select语句的结果是有不同dataNode返回的。
而且,从MyCAT日志中我们也可以获取到读写分离的相关信息,前提是你的MyCAT的日志级别是debug。如下:
以上就是mycat读写分离的所有内容了,更多java中项目常见问题及答案,请关注奇Q工具网了解详情。
推荐阅读;