重要概念
![](https://i-blog.csdnimg.cn/blog_migrate/6bc6c8a1a219c4dd81507c04f126695f.png)
-
逻辑库(db_user)
数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库 -
逻辑表(db_user里的表)
- 分片表(用户表)
—> 是指那些原有的很大数据的表,需要切分到多个数据库的表 - 全局表(数据字典)
—> 数据不常变,数据量不大,跟其他表都有一些关联关系,被拷贝到各个分片上。比如数据字典表 - ER表(用户地址表)
—> 描述跟分片表的关联关系,与相同ID的分片表在同一个分片上,解决夸库join的问题 - 非分片表(系统配置表、短信模板表)
—> 非分片是相对分片表来说的,就是那些不需要进行数据切分的表,数据来源于某一个节点
- 分片表(用户表)
-
分片规则
按照某种业务规则把数据分到某个分片的规则就是分片规则 -
分片节点
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode) -
节点主机
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)
mycat配置文件
conf目录下存放配置文件:
- server.xml 是mycat参数调整和用户授权的配置文件,默认监听端口8066、9066
- schema.xml 是逻辑库、逻辑表定义及分配引用的配置文件
- rule.xml 是分片规则的配置文件,分片规则具体的一些参数信息单独存放为文件,也在这个目录下
配置文件详细解读
rule.xml
该文件主要定义了分片的规则,这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule和function
-
tableRule标签:
<tableRule name="auto-sharding-long”> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule>
name:用户标识不同的分表规则
columns:指定按哪一列进行拆分
algorithm:该属性值为下面function标签中name的属性值,定义了连接表规则的具体的路由算法,多个表规则可以连接到同一个路由算法上 -
function标签
<function name="rang-long” class="org.opencloudb.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function>
name:标识算法的名字
class:指定路由算法具体的类名字
property:具体算法用到的一些属性
schema.xml
该文件是MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource
<?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>
- schema标签:定义mycat实例中的逻辑库
- table标签:定义mycat实例中的逻辑表
- dataNode标签:定义mycat中的数据节点,也是通常说的数据分片
- dataHost标签:作为最底层标签存在,定义了具体的真正存放数据的数据库实例,读写分离配置和心跳语句,我这只用了一台主机,所以只配了一个dataHost,如果你配了N个主机,就要配N个dataHost节点
具体讲解如图(网上借用):
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就是只读
主键自增
-
在对表进行分库分表时,如果主键设置为自增,插入数据时,不同库的同一名称的表会出现主键重复问题, 需要利用mycat的主键唯一去处理。 从MyCAT 1.3开始,支持自增长主键,依赖于全局序列号机制,建议采用数据库方式的全局序列号,并正确设置步长,以免影响实际性能。
-
首先要开启数据库方式的全局序列号,对于需要定义自增长主键的表,建立对应的全局序列号,与table名称同名大写。但暂不支持主键为null。具体实现参见:https://blog.csdn.net/l1994m/article/details/88641809 ,下面只说一下实现的思路:
(1) 首先在server.xml设置主键的生成方式<property name="sequnceHandlerType">1</property>
(2) 在分表的table上设置主键自增
<table name=”CUSTOMER” autoIncrement=”true”>
(3) 创建生成主键的逻辑表,并插入数据,数据包括:自增主键的表名,初始值,步长
(4) 在其中一个库上执行3个函数分别为:获取当前sequence值,设置sequence值,获取下一个sequence值 -
上面生成自增主键的方法,必须注意数据库的存储过程本身无法保证其原子性,因此该问题不得不由我们应用程序的事务或加锁来解决,而这样的办法会使生成ID的效率大打折扣。如果不嫌麻烦的话可以考虑用乐观锁去解决那样效率会高一些。
schema.xml 配置示例
- 单库大表拆分
- 跨库分表
- 读写分离
mycat集群部署架构图
![](https://i-blog.csdnimg.cn/blog_migrate/3d981ced3459aec0ad6d3fc0344480cf.jpeg)