主服务器一旦有写入操作,从服务器通过读取binlog,来实现数据同步;Mycat也时时发送心跳包来检测mysql服务器是否可用;
1)配置文件详解
Mycat读写分离核心配置文件 schema.xml文件,我们打开; 我们对配置文件来详细介绍下;
schema.xml有几个标签,分别是:
mycat:schema 主配置标签;
schema逻辑库配置标签;
dataNode数据节点配置标签;
dataHost数据库主机配置标签;
1.1)schema逻辑库配置标签
(定义逻辑数据库)
属性 | 解释 |
---|---|
name | 配置逻辑库的名字(即数据库实例名) |
checkSQLschema | SQLschema检查 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容器
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
Master看到
Slave看到
我们再到Master服务器执行插入语句看看
我们再到Slave服务器执行插入语句看看
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有