博客信息

Mycat读写分离

发布时间:『 2020-03-06 22:39』  博客类别:中间件  阅读(768)

简介

小李飞刀_Mycat

基于前面讲的Mysql主从复制,我们通过Mycat,能够实现读写分离,即master主服务器实现写操作(insert,update,delete等),salve从服务器实现读操作(select等),

主服务器一旦有写入操作,从服务器通过读取binlog,来实现数据同步;Mycat也时时发送心跳包来检测mysql服务器是否可用;

实现

1)配置文件详解

Mycat读写分离核心配置文件 schema.xml文件,我们打开; 我们对配置文件来详细介绍下;

schema.xml有几个标签,分别是:

mycat:schema 主配置标签;

schema逻辑库配置标签;

dataNode数据节点配置标签;

dataHost数据库主机配置标签;


小李飞刀_Mycat


一个逻辑库,对应多个逻辑表,每个逻辑表如上图,可以水平分片,分成一个或者多个数据分片节点,每个数据分片节点对应一个dataHost(数据库主机),dataHost里可以通过writeHost和readHost配置写主机和读主机;

1.1)schema逻辑库配置标签

(定义逻辑数据库)

属性解释
name配置逻辑库的名字(即数据库实例名)
checkSQLschemaSQLschema检查 boolean类型;当前端执行【select *from USERDB.tf_user;】时(表名前指定了mycat逻辑库名), 两种取值 true:mycat会把语句转换为【select * from tf_user;】 false:会报错
sqlMaxLimit最大查询每页记录数设置 相当于sql的结果集中,加上【limit N】。如果sql本身已经指定limit,则以sql指定的为准
dataNode配置数据库节点: 用于配置该逻辑库默认的分片。没有通过table标签配置的表,就会走到默认的分片上。这里注意没有配置在table标签的表,用工具查看是无法显示的,但是可以正常使用。 如果没有配置dataNode属性,则没有配置在table标签的表,是无法使用的。

1.2)dataNode数据节点配置标签

(定义数据分片节点)

属性解释
name数据分片节点名称
dataHost定义该数据分片节点属于哪个数据库主机
database定义该数据分片节点属于哪个具体数据库实例上的具体库(即对应mysql中实际的DB)

1.3)dataHost数据库主机配置标签

(定义后端的数据库主机)

属性解释
name指定dataHost的名字
maxCon指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、 readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。
minCon指定每个读写实例连接池的最小连接,初始化连接池的大小。
balance负载均衡类型:(1)balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。(2)balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。(3)balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。(4)balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType(1)writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties.(2)writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
dbType指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、 oracle、 spark 等。
dbDriver指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
switchType-1 表示不自动切换 1 默认值,自动切换 2 基于 MySQL 主从同步的状态决定是否切换 心跳语句为 show slave status 3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)
slaveThreshold配置真实MySQL与MyCat的心跳

heartbeat子标签属性(心跳执行SQL) writeHost子标签属性(写主机配置) readHost子标签属性(读主机配置)

属性解释
host用于标识不同实例,一般 writeHost 我们使用M1,readHost 我们用S1。
url后端实例连接地址,如果是使用 native 的 dbDriver,则一般为 address:port 这种形式。用 JDBC 或其他的dbDriver,则需要特殊指定。当使用 JDBC 时则可以这么写:jdbc:mysql://localhost:3306/。
user后端存储实例需要的用户名字
password后端存储实例需要的密码

2)读写分离实现

参考配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema>

<dataNode name="dn1" dataHost="localhost1" database="db_javaxl" />


<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
        writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">

    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->

    <writeHost host="masterHost1" url="172.20.0.2:3306" user="root"
            password="123456">
            <readHost host="slaveHost1" url="172.20.0.3:3306" user="root"
            password="123456"></readHost>
    </writeHost>

</dataHost>

</mycat:schema>

小李飞刀_Mycat


测试

重新启动一个Mycat容器

docker run --name mycat2 -p 8066:8066 -it --net extnetwork --ip 172.20.0.4 -v /home/docker/mycat/conf/:/home/mycat/conf/ -v /home/docker/mycat/logs/:/home/mycat/logs/ 镜像id

为了能看到读写分离效果,我们把mysql主从复制的一个配置文件改下:binlog_format= MIXED 改成 STATEMENT

改完mysql的配置需要重启,并确保mysql、mysql2主从复制生效;

可能涉及到的sql语句

CREATE USER 'slave1'@'172.20.0.3' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'172.20.0.3';
FLUSH PRIVILEGES;

SHOW MASTER STATUS
reset MASTER

START SLAVE
STOP SLAVE
SHOW SLAVE STATUS

CHANGE MASTER TO MASTER_HOST='172.20.0.2', MASTER_USER='slave1', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;

这样同步的时候 同步的是SQL,我们一些函数的一定特定,能分辨出哪个主机行了 写请求,哪个主机执行了 读请求; 我们在mycat中 执行

INSERT INTO TESTDB.t_student VALUES(NULL,@@hostname) 

插入主机名称;@@hostname

小李飞刀_Mycat


Master看到

小李飞刀_Mycat

Slave看到

小李飞刀_Mycat


我们再到Master服务器执行插入语句看看

小李飞刀_Mycat


我们再到Slave服务器执行插入语句看看

小李飞刀_Mycat


over......


关键字:     数据库中间件       读写分离       Mycat  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有