前提是:
- 已经有了一主一从的Mysql服务架构。
- 已经安装启动好了mycat。并对mycat有一定了解。
实现
- 修改mycat的schema配置文件:
<!--schema 标签用于定义 MyCat 实例中的逻辑库-->
<!-- name是逻辑库的名称,客户端连接mycat是看到这个数据库名称的-->
<!-- dataNode是设置逻辑库的真实数据库分片节点-->
<schema name="producer" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- 设置分片节点-->
<!-- dataHost设置真实数据库 database为真实数据库名称-->
<dataNode name="dn1" dataHost="producerHost" database="producer" />
<!-- 设置真实库-->
<dataHost name="producerHost" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 设置写的节点,通常是master节点 -->
<writeHost host="MasterHost1" url="192.168.18.142:3306" user="root"
password="123456">
<!-- 在writeHost 设置readHost,通常是从节点-->
<readHost host="slaveHost1" url="192.168.18.144:3306" user="root" password="123456"/>
</writeHost>
</dataHost>
dataHost 的balance属性说明:
此属性用于配置dataHost 的负载类型,可以设置以下值:
值 | 说明 |
---|---|
0 | 不开启读写分离机制,所以的读操作都发送到当前可用的writehost中,也就是相当于没有负载 |
1 | 全部readhost和standby writehost参与select语句的负载均衡,这个是双主双从架构的情况下适用,M1位主机,M2为standby 主机,S1位M1从机,S2位M2从机,这种情况下就是M2、S1、S2进行读负载,M1负责写负载 |
2 | 所有的读操作都在writehost和readhost上面随机分发 |
3 | 所有读请求分发到readhost中,writehost不负载读请求 |
我们上面使用的是3.
设置完毕重启mycat。
验证:
先使用下面insert语句加入一条记录。
#@@host是系统变量,不同的主机不同。
INSERT INTO test(`name`) VALUES(@@hostname)
然后分别到两个mysql中查询。
主机的数据时142,从机是144.
然后我们连接mycat进行查询。
无论查多少次都是144,从机的数据,所以读压力都负载在从机上。
双主双从读写分离
使用mycat进行mysql双主双从读写分离,并进行主机故障时主备切换。
在上面单主单从的配置上,在配上一主一从。
然后修改blance的值,从3改成1
writeType属性说明:
0:所以的写请求都分发到配置的第一台writeHost上,也就是只有一台writeHost执行写操作(单写)。当该writeHost宕机后,会切换到还在生存的第二个。推荐使用单写模式。
1:所有的写请求都随机分配到所有配置的writeHost上,实现多写。1.5后废弃不推荐使用。
switchType属性说明:主备自动切换类型
1:自动切换。
-1:不切换。
2:基于Mysql主从同步状态来决定是否自动切换。
这里设置writeType=0 switchType=1
最终:
<!--schema 标签用于定义 MyCat 实例中的逻辑库-->
<!-- name是逻辑库的名称,客户端连接mycat是看到这个数据库名称的-->
<!-- dataNode是设置逻辑库的真实数据库分片节点-->
<schema name="producer" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- 设置分片节点-->
<!-- dataHost设置真实数据库 database为真实数据库名称-->
<dataNode name="dn1" dataHost="producerHost" database="producer" />
<!-- 设置真实库-->
<dataHost name="producerHost" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 设置写的节点,通常是master节点 -->
<writeHost host="MasterHost1" url="192.168.18.142:3306" user="root"
password="123456">
<!-- 在writeHost 设置readHost,通常是从节点-->
<readHost host="slaveHost1" url="192.168.18.144:3306" user="root" password="123456"/>
</writeHost>
<writeHost host="MasterHost2" url="192.168.18.145:3306" user="root"
password="123456">
<readHost host="slaveHost2" url="192.168.18.143:3306" user="root" password="123456"/>
</writeHost>
</dataHost>
重启mycat验证:
插入一条数据:
INSERT INTO test(`name`) VALUES(@@hostname)
查询:
我后面两台虚拟机(145、143)没有修改主机名,所以会小时localhosy.localdomain。
点击多次,你会发现不会有42的 因为读负载都分摊到了m2 s1 s2上。
验证自动切换:
把m1关了。
然后继续插入查询数据。
也成功了,但是 这就相当于废了一个主从。M1S1不能用了。