注意:mycat主要处理读写分离,分片
关于主从同步主要是依赖mysql的功能
mycat使用逻辑图
前提:安装jdk,jdk1.7版本以上。我安装的是jdk1.8
mycat默认端口是8066
server.xml配置 博客提供:https://www.cnblogs.com/wolf-bin/p/8732602.html
https://blog.csdn.net/qq_19943157/article/details/79707968
service.xml主要配置mycat服务的参数,比如端口号,myact用户名和密码使用的逻辑数据库等
<user name="连接mycat的用户">
<property name="password">密码</property>
<property name="schemas">schema.xml中的name,连接哪个schema</property>
</user>
<user name="连接mycat的用户">
<property name="password">密码</property>
<property name="schemas">schema.xml中的name,连接哪个schema</property>
<property name="readOnly">true</property>
</user>
schema.xml文件介绍
schema.xml文件主要配置数据库的信息,例如逻辑数据库名称,物理上真实的数据源以及表和数据源之间的对应关系和路由策略等。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="tbl_test" dataNode="dn1,dn2" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test_dn1" />
<dataNode name="dn2" dataHost="localhost1" database="test_dn2" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.110:3306" password="root" user="root">
</writeHost>
<writeHost host="hostM2" url="192.168.1.111:3306" user="root" password="root">
</writeHost>
</dataHost>
</mycat:schema>
文件配置详解:
balance项是控制读而writeType是控制写的
自己测试,有hostM1,HostM2,读写发生在第一个,如果第一个失效,读写发生在第二个。
一:writeType介绍
1.writeType=0,所有的写操作发送到配置的第一个writeHost,第一个管理切换到生存的第二个writeHost,重新启动会已切换后的为准,切换记录在配置文件中:dnindex.properties
2.writeType=0,所有的写操作随机发送到配置的writeHost,1.5版本后不推荐
二:balance介绍
1.balance="0",不开启读写分离机制,所有的读操作都发往当前可用的writeHost
2.balance="1",全部的readHost与stand by write Host 参与select语句的负载均衡,当前运行的write Host与所有的readHost参与select语句的负载均衡。
3.balance="2",所有的读请求都随机发往write host与read host
4.balance="3",所有的读请求都随机发往write host对应的read host上, write host不负责读压力.balance=3只在版本1.4以及以后有.
rule.xml
rule.xml主要配置路由策略,主要有分片的片键,拆分的策略(取模还是按区间划分等)
常见的分片规则:
PartitionByFileMap:枚举分片
AutoPartitionByLong:范围分片
PartitionByMod:求模分片
PartitionByDate:日期列分区法
分片规则名称是rule1,使用id列进行分片,algorithm是分片算法;关联function标签,通过name关联
<tableRule name="rule1">
<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">3</property>
</function>
schme.xml使用 table 中的rule=rule.xml中的tableRule的name,使用什么分片规则
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="tbl_test" dataNode="dn1,dn2" rule="rule1" />
</schema>
常用水平分库
水平分库指的是将一个数据量庞大的数据表分别保存到不同的数据库里,即:现在有多个数据库,这个库保存同样结构的数据表,这些数据根据MyCat的算法,分别保存到符合自身要求的数据库的数据表中,MyCat的分片规则配置文件
- 求模分库:mod-long
- 范围分库:auto-sharding-long
- Hash分库:hash-int
- 月分库:sharding-by-month
- ER模型分库:childTable
- 自定义分库:CustomRule(该方式需要自己实现分库算法)
我测试使用的是水平分库,求模分库,不同的id分配到不同的数据库,比如id为1,模式1,会到第二个数据库中。测试没有问题
<dataNode name="dn1" dataHost="localhost1" database="test_dn1" />
<dataNode name="dn2" dataHost="localhost1" database="test_dn2" />
<dataNode name="dn3" dataHost="localhost1" database="test_dn3" />
常用命令
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态