Mycat
1.Mycat
分库分表中间件,将存放在一个数据库的数据存放在不同的多个数据库中。来分散负载。
- scheme 逻辑库,对应mysql的数据库,一个逻辑库定义了包含的所有table.是数据库集群对外的统一访问接口。
- table 逻辑表,和物理数据库存储的一张表类似。
这里的表格需要声明所存储的逻辑数据节点,datanode。这里可以指定分片规则。 - DataNode 逻辑数据节点,存放table的具体物理节点,通过datasource来关联到后端的某个具体数据库上
- datasource,定义某个物理库的访问地址,用于捆绑到datanode上。
2.垂直切分与水平切分的不同
垂直切分,一个表很大字段很多,将它拆成多个表。比如订单表,有一些常见的不变的字段,比如订单金额之类的,下单人,电话留言等信息。还有一些状态信息,下单时间,发货时间,付款时间,退货时间以及对应的状态变化等等,将这两个就可以垂直拆分成两个表。
优点:拆分后业务清晰,拆分规则明确。
缺点:部分业务表无法join,只能通过接口解决,提高系统复杂度。
水平切分:根据表中的数据的逻辑关系,将一张表的数据按照某种条件拆分到多台数据库上面。
比如将用户id,取模,为1进第一个库,为2,3,0进2,3,4库。
优点:负载均衡的更好。
缺点:拆分规则不好想象,扩展和维护比较难,join比较难。
3.核心配置文件
scheme.xml 配置逻辑库,逻辑表,数据节点,节点主机
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mydatabase" checkSQLschema="true" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" primaryKey="id" rule="auto-sharding-long">
<childTable name="t_loginlog" primaryKey="id" joinKey="user_id" parentKey="id"></childTable>
</table>
<table name="t_student" dataNode="dn1,dn3" primaryKey="id" rule="student_id" />
<table name="t_dictionaries" dataNode="dn1,dn2,dn3" type="global" />
<table name="t_teacher" dataNode="dn1" />
</schema>
<dataNode name="dn1" dataHost="dtHost1" database="db1" />
<dataNode name="dn2" dataHost="dtHost1" database="db2" />
<dataNode name="dn3" dataHost="dtHost2" database="db3" />
<!--
name:节点名称,在上方dataNode标签中调用
maxCon:底层数据库的链接最大数
minCon:底层数据库的链接最小数
balance:值可以为0,1,2,3,分别表示对当前datahost中维护的数据库们的读操作逻辑
0:不开启读写分离,所有的读写操作都在最小的索引号的writeHost(第一个writeHost标签)
1:全部的readHost和备用writeHost都参与读数据的平衡,如果读的请求过多,负责写的第一个writeHost也分担一部分
2 :所有的读操作,都随机的在所有的writeHost和readHost中进行
3 :所有的读操作,都到writeHost对应的readHost上进行(备用writeHost不参加了),在集群中没有配置ReadHost的情况下,读都到第一个writeHost完成
writeType:控制当前datahost维护的数据库集群的写操作
0:所有的写操作都在第一个writeHost标签的数据库进行
1:所有的写操作,都随机分配到所有的writeHost(mycat1.5完全不建议配置了)
dbtype:数据库类型(不同数据库配置不同名称,mysql)
dbDriver:数据库驱动,native,动态获取
switchType:切换的逻辑
-1:故障不切换
1:故障切换,当前写操作的writeHost故障,进行切换,切换到下一个writeHost;
slaveThreshold:标签中的<heartbeat>用来检测后端数据库的心跳sql语句;本属性检查从节点与主节点的同步情况(延迟时间数),配合心
跳语句show slave status; 读写分离时,所有的readHost的数据都可靠
-->
<dataHost name="dtHost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--用于验证心跳,这个是mysql主库的配置-->
<heartbeat>select user()</heartbeat>
<writeHost host="127.0.0.1" url="192.168.199.11:3306" user="root" password="123456">
<readHost host="127.0.0.1" url=