网上的:
MyCAT的读写分离机制如下:
1)事务内的SQL,全部走写节点,除非某个select语句以注释/*balance*/开头
2)自动提交的select语句会走读节点,并在所有可用读节点中间随机负载均衡
3)当某个主节点宕机,则其全部读节点都不再被使用,因为此时,同步失败,数据已经不是最新的,MyCAT会采用另外一个主节点所对应的全部读节点来实现select负载均衡。
4)当所有主节点都失败,则为了系统高可用性,自动提交的所有select语句仍将提交到全部存活的读节点上执行,此时系统的很多页面还是能出来数据,只是用户修改或提交会失败。
本次读写分离测试结果的:(测试发现有些情况跟网上的有出入) mycat 1.6.5
- 写操作全部走写节点
- 自动提交的select语句会走读节点,并在所有可用读节点中间随机负载均衡
3)当某个主节点宕机,则其全部读节点都不再被使用,因为此时,同步失败,数据已经不是最新的,MyCAT会采用另外一个主节点所对应的全部读节点来实现select负载均衡。
4)当所有主节点都失败,系统连接不上了。
测试情况如下:
1、测试一个writeHost 的主从(3台机器1主两从)
<schema name="db11" checkSQLschema="true" sqlMaxLimit="1000" dataNode="dn1"/>
<dataNode name="dn1" dataHost="mysql34_1" database="db1"/>
<dataHost balance="1" maxCon="1000" minCon="10" name="mysql34_1" writeType="0" switchType="1" slaveThreshold="100" dbType="mysql
" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.1.34:3307" password="123456" user="root">
<readHost host="W1R1" url="192.168.1.34:3308" password="123456" user="root"/>
<readHost host="W1R2" url="192.168.1.34:3309" password="123456" user="root"/>
</writeHost>
</dataHost>
99e0c576e362 是主3307.
e83f7ae714aa 是从3308.
b2f619097811 是从3309
测试结果:写全走的主库3307,读全走的两个从库(两个从库负载均衡)。
唯一的writeHost 写节点挂了后,连接不上了,报1184,连接拒绝。
插入7条数据,全走主。
读全走的从。
[root@pxcnode70 lzj]# more testload.sh
#!/bin/sh
while true;do
mysql -ulzj -p123789 -h 192.168.1.245 -P13306 db11 -e "select count(*),@@hostname from t_test;"
sleep 2;
done
2、writeType=2测试。
writeType="2",不执行写操作。测试结果报3009错误。
<dataHost balance="1" maxCon="1000" minCon="10" name="mysql34_1" writeType="2" switchType="1" slaveThreshold="100" dbType="mysql
" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.1.34:3307" password="123456" user="root">
<readHost host="W1R1" url="192.168.1.34:3308" password="123456" user="root"/>
<readHost host="W1R2" url="192.168.1.34:3309" password="123456" user="root"/>
</writeHost>
</dataHost>
3、两个writeHost 的情况
<dataHost balance="1" maxCon="1000" minCon="10" name="mysql34_1" writeType="0" switchType="1" slaveThreshold="100" dbType="mysql
" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.1.34:3308" password="123456" user="root">
<readHost host="W1R1" url="192.168.1.34:3307" password="123456" user="root"/>
<readHost host="W1R2" url="192.168.1.34:3309" password="123456" user="root"/>
</writeHost>
<writeHost host="W2" url="192.168.1.34:3307" password="123456" user="root">
<readHost host="W2R1" url="192.168.1.34:3309" password="123456" user="root"/>
</writeHost>
</dataHost>
环境:
99e0c576e362 是3307.
e83f7ae714aa 是3308.
b2f619097811 是3309
3307和3308 互为主从。 3309 是3307的从。
测试结果:
Mycat插入5条数据,全走3308.第一个写节点writeHost 。读全走的3307和3309.(除了第一个写节点外其他节点)。
第一个写节点3308挂掉后:写操作正常,写入5条数据,全路由到第二个写节点3307。读全路由到第二个写对应的读节点3309分片。
第一个写节点3308恢复后:写入5条数据还是全路由到第二个写节点3307。读操作路由到
3个节点3307,3308,3309.
所有的写节点 3307和3308都挂掉后,连接不上了。报错:[Err] 1184 - Connection refused
第一个写节点3308挂掉后:
第一个写节点恢复后:
所有写节点3307和3308都挂掉后: