Mycat读写分离测试

配置文件解析

前文说了schema.xml文件的前两块内容,真正与读写分离有关的是第三块dataHost内容:

1
2
3
4
5
6
<dataHost name="mycatTEST" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="rm-bp1099x0552q92edr.mysql.rds.aliyuncs.com:3306" user="mycat" password="这里是密码">
<readHost host="hostS1" url="rr-bp1x35g0w6r767eu4.mysql.rds.aliyuncs.com:3306" user="mycat" password="这里是密码">
</writeHost>
</dataHost>

这里主要描述的就是逻辑库需要映射的后端真实数据库的情况。某些选项含义如下:

  1. maxCon:指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHostreadHost标签都会使用这个属性的值来实例化出连接池的最大连接数;
  2. minCon:指定每个读写实例连接池的最小连接,初始化连接池的大小;
  3. balance:负载均衡类型,目前的取值有4种:
    balance=“0”, 所有读操作都发送到当前可用的writeHost上。
    balance=“1”,所有读操作都随机的发送到readHost。
    balance=“2”,所有读操作都随机的在writeHost、readhost上分发。
    balance=”3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
  4. writeType:负载均衡类型,目前的取值有3种:
    writeType=“0”, 所有满足规则的写操作轮询的发送到可用的writeHost上。
    writeType=“1”,所有满足规则的写操作随机的发送到readHost。
    writeType=“2”,所有满足规则的写操作随机的在writeHost、readhost分发。(这一点我很怀疑,写操作怎么在readhost上进行)
  5. dbType:指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、 spark等;
  6. dbDriver:指定连接后端数据库使用的Driver,目前可选的值有native和JDBC,当使用JDBC时则可以这么写:jdbc:mysql://mycatTEST:3306/;
  7. switchType:主库切换算法,目前的取值有3种:
    switchType=”-1”,表示不自动切换
    switchType=”1”, 默认值,自动切换
    switchType=”2”, 基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status
    switchType=”3”,基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为show status like 'wsrep%'
  8. heartbeat:这个标签内指明用于和后端数据库进行心跳检查的语句;
  9. writeHost & readHost:这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。在一个dataHost内可以定义多个writeHost和readHost(我这里就配了一对,其实可以配很多对)。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。

Demo测试

先登陆主库,然后show slave status \G;命令看一下状态,重点是Slave_IO_RunningSlave_SQL_RunningSeconds_Behind_Master这三个字段,如图:
akb48

关注这三个字段的原因是“Mycat心跳机制通过检测他们来确定当前主从同步的状态”,如果Seconds_Behind_Master的数值大于slaveThreshold,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换。

确认完之后,再去log4j2.xml文件把日志级别改成debug。如下:

1
2
3
4
5
6
 <Loggers>
<asyncRoot level="debug" includeLocation="true">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile"/>
</asyncRoot>
</Loggers>

改完之后重启mycat。登陆到8066端口的mycat逻辑库,先创建一个库,再执行一个写的操作:

1
2
3
4
5
CREATE TABLE `travelrecord` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into travelrecord (id,name) values(5000010,'bengbeng');

在日志一看,发现这条记录已经被写入了dn2这个datanode里,如下:
akb48

日志的意思是:逻辑库收到了insert命令,然后与真实库连接成功并且执行同步命令,con need syn ,total syn cmd 1 commands,之后发送查询sql,因为插入的那个数据是5000000,按照auto-sharding-long的规则,只会记录到db2的分片里。执行完后,会释放mycat逻辑库与真实Mysql连接也就是release connection MySQLConnectionrelease channel MySQLConnection

再执行一个读的操作,比如SELECT * FROM travelrecord;,日志是这样记录的:
akb48

schema.xml里的readhost字段对比,的确是从hostS1上读取到的,由于balance=”3”,所以只会从读库读取,由于读的操作db1、db2、db3这3个分片都会操作(需要把他们的内容拼接在一起才是完整的内容),于是日志会打印三遍,实验结束。至于其他的更改参数情况,可以去看参考资料里的第二篇文章,说的很详尽了。

参考资料

http://valleylord.github.io/post/201601-mycat-log-analysis/
http://codingo.xyz/index.php/2018/03/08/mycat2/

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------