mycat读写分离怎么实现?

TheDisguiser 2020-07-05 20:57:21 java常见问答 6356

Mycat中,除了分库分表,还有着一个重要核心功能,读写分离,相信小伙伴们都很耳熟吧,这次我们就来看看读写分离是如何实现的吧。

示例:用三个实例组成MySQL主从集群,验证MyCAT的读写分离功能,其实,一主一从就可以满足,之所以用三个,是为了验证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读写分离

以上就是mycat读写分离的所有内容了,更多java中项目常见问题及答案,请关注奇Q工具网了解详情。

推荐阅读;

mycat原理,mycat分库分表的原理是什么?

mycat是什么意思?是啥意思?特性介绍

mycat分库分表如何实现?原理是什么?