MyCat集群环境负载均衡

MyCat集群环境负载均衡

1、配置数据库集群

所有的集群配置,都必须配置多主多从模式。即多个 master 节点相互之间配置主从。如:master1 和 slave1 为第一组主从,master2 和 slave2 为第二组主从,master1 和 master2互为对方的主/从。双主双从结构。

20200420191848

注意:

crc32slot 分片规则,在使用的时候,要求必须先设置好分片规则,再启动 mycat。
如果先启动了 mycat,再设置分片规则,会导致分片规则失效。需要删除 conf 目录中的ruledata 子目录。ruledata 目录中会记录 crc32slot 的分片节点,日志文件命名规则为crc32slot_表名。

2、集群负载均衡策略

第一种方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.102:3306" user="root" password="root">
<readHost host="hostS1" url="192.168.1.103:3306" user="root" password="root" />
</writeHost>
<writeHost host="hostM2" url="192.168.1.104:3306" user="root" password="root">
<readHost host="hostS2" url="192.168.1.105:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>

这种方式有缺陷:可能有 IO 延迟问题。

第二种方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn$1-6" rule="crc32slot" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataNode name="dn4" dataHost="localhost2" database="db1" />
<dataNode name="dn5" dataHost="localhost2" database="db2" />
<dataNode name="dn6" dataHost="localhost2" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.1.102:3306" user="root" password="root"/>
<writeHost host="hostS2" url="192.168.1.103:3306" user="root" password="root" />
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM2" url="192.168.1.104:3306" user="root" password="root"/>
<writeHost host="hostS2" url="192.168.1.105:3306" user="root" password="root" />
</dataHost>
</mycat:schema>

建议为不同的表格定位不同的 dataHost 节点

balance 属性

balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡
balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。
balance="3", 所有读请求随机的分发到 writeHost 对应的 readhost 执行,writerHost不负担读压力

writeType 属性

writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:conf/dnindex.properties(datanode index)
writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐

switchType 属性:涉及到读写分离问题,可以解决 IO 延迟问题。

switchType='-1' 表示不自动切换
switchType='1' 默认值,表示自动切换
switchType='2' 基于 MySQL 主从同步的状态决定是否切换读写主机,心跳语句为 show slave status。 如果写数据通过心跳检测出那台是master和slave,就往master上写数据;如果是读,通过心跳检测IO延迟,如果没有就在slave上读,如果有延迟,则在master上读。

注意: 在 mycat 中,rule.xml 配置文件中定义的分片规则只能给一个表格使用。如果有多个表格使用同一个分片规则,需要再 rule.xml 配置文件中,为每个表格定义一个分片规则。

配置mycat eye可视化监控界面https://blog.csdn.net/zh15732621679/article/details/78837760