一、mycat介绍
目前最流行的分布式数据库中间插件,能满足数据库大量存储,提高查询性能。
二、Mycat架构
前端用户可以把mycat看做一个数据库代理,用mysql客户端工具(Navicat)和命令访问,而后端支持mysql,sqlserver,
Oracle等主流数据库,用mysql native协议和多个mysql服务器通信,也可用JDBC协议和大多数主流数据库服务器通信,
其核心功能就是分库分表,即将一个大表水平切分成N个小表,真正的存储在后端Mysql服务器中或其他数据库中。
三、Mycat原理
可以用拦截一词来形容,它拦截了用户发送过来的SQL语句,首先对SQL语句做一些特定的分析,比如分片分析,路由分析
读写分离分析,缓存分析等,然后将sql发往后端真实的数据库,并将返回的结果做适当处理,最终返回给用户。
四、分片
数据库分片:将数据分散存放在不同的多个数据库中,分为垂直切片和水平切片。
垂直切片:将不同的表切分到不同的数据库中
水平切片:将同一张表按照某种条件切分到不同的数据库中。
五、mycat概念
Mycat通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定
一个函数,来实现动态分片算法。
schema:逻辑库,与mysql中database对应,一个逻辑库中定义了所包括的Table
table: 逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明所存储的逻辑数据节点data弄得,
在此可以指定表的分片规则。
datanode: 分片节点,mycat的逻辑数据节点,是存放table的具体物理节点,通过datasource来关联到具体数据库上。
datasource: 定义某个物理库的访问地址,用于捆绑到datanode上。
六、mycat配置文件详解
mycat主要有三个配置文件,rule.xml,schema.xml,server.xml
rule.xml:
主要定义了分片的规则,这个文件里面主要有tableRule和function这两个标签,在具体使用过程中按照需要添加tableRule和
funciton。
示例标签:
1、
#name:用户标识不同的分表规则
#columns:指定按照哪一列进行拆分
#algorithm:该属性下面function标签中name的属性值,定义了表具体的路由算法,多个表可以链接同一个路由算法。
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
2、function标签
#name:标识算法的名称
#class : 路由算法具体类的名称
#property:具体算法用到的一些属性
<function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
3、shcema.xml
mycat中的配置文件之一,管理着mycat的逻辑库、表、分片规则、datanode以及datasource。
#schema标签:定义mycat实例中的逻辑库
#table标签:定义mycat实例中的逻辑表
#dataNode标签:定义mycat中的数据节点,也就是数据分片
#dataHost标签:最底层标签存在,定义具体存放数据的数据库实例,读写分离配置和心跳语句。一个主机对应一个
dataHost节点。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<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.20.216:3306" user="root"
password="root">
</writeHost>
</dataHost>
</mycat:schema>
sqlMaxLimit:sql返回条数
4.跨库查询解决方案
全局表设置:
<table name="" primaryKey="" type="global">
全局表的特性:
全局表的插入、更新操作会实时在所有节点上执行,保持各个分片节点数据的一致性(所有写操作会同步多个库,所以全局表一般不能是大数据表或者更新频繁的表)
全局表的查询操作,只从一个节点获取
全局表可以跟任何一个表进行JOIN操作,利用冗余解决多表join联查的问题
<table name="tenant" primaryKey="tenant_id" autoIncrement="true" dataNode="dn1,dn2" type="global" />
ER Join:
将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JOIN的效率和性能问题,根据这一思路,
提出了基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,解决多表关联跨库的问题
设置:
<table name="customer" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="orders" joinKey="customer_id" parentKey="id"/>
</table>
childTable:mycat子表
childTable标签,定义分片子表
name属性,子表名称
joinKey属性,标志子表中的列,用于与父表做关联。
parentKey标签,标志父表中的列,与joinKey对应。
4.server.xml
!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="user">
<property name="password">user</property>
<property name="schemas">e3mall</property>
<property name="readOnly">false</property>
</user>
</mycat:server>
system标签:内嵌的所有property标签都与系统配置有关
defaultSqlParser:指定默认的解析器(如解析sql),目前的可用的取值有:druidparser和 fdbparser。
使用的时候可以选择其中的一种,目前一般都使用druidparser
user标签
name:逻辑用户名,即登录mycat的用户名
password:逻辑密码,即登录mycat的用户名对应的密码
schemas:逻辑数据库,可配置多个,用英文逗号隔开,对应于schema.xml文件中配置的逻辑数据库,两者对应
readOnly:该数据库是否为只读,如果true就是只读
https://dbaplus.cn/news-11-1854-1.html
MyCAT 支持跨库表 Join,目前版本仅支持跨库两表 Join。