前言
前文介绍了主从同步原理以及进行了实操演示,本文在前文的基础上学习基于mycat分库分表,读写分离。
上一篇:高性能Mysql(一) | 主从同步原理与实操
MyCat
示例架构图:
192.168.43.110:数据库test01,数据库test02,分别有student表
192.168.43.111:数据库test01,数据库test02,分别有student表
192.168.43.216:安装mycat,安装JDK
安装与配置(需要装JDK)
1.下载MyCat
2.解压:tar -xvzf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
3.进入conf目录,修改3个配置文件server.xml,schema.xml,rule.xml
文件 | 作用 |
---|---|
server.xml | 指定MyCat用户账号和密码,以及逻辑数据库等等 |
schema.xml | 设置分库分表,读写分离配置 |
rule.xml | 分表的一些规则 |
server.xml: |
- 只留一个用户,账号密码为 root/root,指定逻辑数据库为TESTDB(修改点)
- 注释掉的privileges是给表做一些DML权限控制(注意点)
<user name="root" defaultAccount="true">
<property name="password">root</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<!-- <user name="user"> -->
<!-- <property name="password">user</property> -->
<!-- <property name="schemas">TESTDB</property> -->
<!-- <property name="readOnly">true</property> -->
<!-- </user> -->
schema.xml:
解释:
1.给TESTDB逻辑库,拆分为2个物理库test01,test02。
2.student表以为rule为mod-long的规则来分表,这个规则是根据id平均分配,配置在rule.xml里面
3.读写分离,192.168.43.110master写,192.168.43.111slave节点读
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!--name:分表
dataNode:拆分后的数据切片的位置 dn1,dn2
rule:拆分规则myrule (拆分的规则叫 myrule)
-->
<table name="student" dataNode="dn1,dn2" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test01" />
<dataNode name="dn2" dataHost="localhost1" database="test02" />
<!-- dataHost:设置读写分离的主机地址-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.43.110:3306" user="root"
password="123456">
<readHost host="hostS2" url="192.168.43.111:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
部分参数说明:
datahost:
- balance:读请求的负载均衡
0 :不开启读写分离,所有的读操作 都发送到writehost中
1:全部的readhost和stand by writehost都参与 读操作的负责均衡
2:读请求 随机发送给readhost、writehost
3:读请求随机发送给writehost中的readhost (writehost不参与读请求) --推荐 - writeType:写请求的负载均衡
0:写请求先发送给schema.xml中的第一个writehost。当第一个writehost挂掉,再自动切换到writehost中 。切换的记录 会被记录在 conf/dnindex.properties --推荐
1:写请求随机发送到所有的wirtehost中 - switchType: 是否允许 “读操作”在readhost和writehost上自动切换(解决延迟问题:当从readhost中读取数据中 出现网络延迟等问题时,自动从writehost中读数据)
-1:不许
1:默认,允许
2:根据“主从同步的状态” 自动选择是否 切换。
主从之间 会持续发送心跳。 当心跳检测机制发送了IO延迟,则readhost自动切换到writehost;
否则不切换。 必须将心跳设置 show slave status --推荐
rule.xml
修改rule中mod-long的规则,count=2,因为配置的test01,test02 2个节点
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
启动MyCat
进入bin目录:
../mycat start --启动
../mycat stop --停止
../mycat restart --重启
../mycat status --查看状态
登录:
不能直接在mycat所在节点192.168.43.216 登录,需要借助一个 已经安装了mysql软件的 计算机上 远程操作mysql
我们在192.168.43.110或者192.168.43.111登录mycat,端口为8066:
mysql -uroot -proot -h192.168.43.216 -P8066
我们可以看到数据库为逻辑库TESTDB,
查看日志:如果有报错看日志
logs目录下的:wrapper.log文件
检验效果
看一下数据库的结构,也就是一开始的那张图的样子:
192.168.43.110:数据库test01,数据库test02,分别有student表
192.168.43.111:数据库test01,数据库test02,分别有student表
使用逻辑库TESTDB登录,查看student表,并且插入一条数据:
insert into student(id,name) values(1,‘testmycat1’);
注意:通过mycat是强语法,比如insert into student values(1,testmycat1) ;就不行)
我们可以看到,我们使用的逻辑库TESTDB,往master(192.168.43.110)的物理库test02插入了一条数据,并且通过主从同步同步到了slave(192.168.43.111)从节点的test02库
再次插入一条数据:
insert into student(id,name) values(2,‘testmycat2’);
我们可以看到这次在master(192.168.43.110)的test01库插入了一条数据,并且通过主从同步同步到了slave节点(192.168.43.110)的test01库
它是根据rule.xml文件里面配置的平均分的规则来确定入的哪个库的student表,id每加1交替入test01和test02库,然后同步至slave库
学习博文:MyCAT 配置详解
上一篇:高性能Mysql(一) | 主从同步原理与实操
下一篇:高性能Mysql(三) | 通过haproxy与keepalived对mysql分库分表实现高可用