Mycat的概述

Posted Java架构师叶子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mycat的概述相关的知识,希望对你有一定的参考价值。

前言

分库分表

简单来说有垂直和水平两种方式,垂直就是将表按字段进行拆分,水平就是将表按照数据分布来做行拆分。

Mycat实现的应该是分库,也就是将一个表的行分开存储到不同的数据库中。(表名相同。)

读写分离

Mycat主从分离只是在读的时候做了分发至从库处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost。所以需要提前配置好mysql的salve。

  1. server.xml是Mycat服务器参数调整和用户授权的配置文件;

  2. schema.xml是逻辑库定义和表以及分片定义的配置文件;

  3. rule.xml是分片规则的配置文件;

schema.xml 详解

文件中定义了table、dataNode、rule、dateHost、writeHost、readHost等配置信息。

node

<table name="employee" primaryKey="ID" dataNode="dn1,dn2"  rule="sharding-by-intfile" />
在mycat的逻辑数据库中定义employee表,主键是ID字段,分表规则是sharding-by-intfile,该规则可以在rule.xml中找到对应的信息,而拆分的数据节点是dn1和dn2,数据节点是mycat的概念。

eg:
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost2" database="db1" />

将employee表的数据分配到不同的dataHost上。也可以分片在相同的dataHost上,但是database需要不同。

host

Mycat会根据对应的rule规则和具体的sql语句进行路由处理,包括数据分库存储和数据分库获取。

有多个dataHost,就说明有分库分表的设置。在一个dataHost中有readHost在writeHost下,或者有多个writeHost,而且balance不等于0(0代表没有读写分离),就说明有读写分离的设置。

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql"dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="ip1:3003" user="root" password="123">
<readHost host="hostS1" url="ip2:3009" user="root" password="123"/>
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="ip3:3003" user="root" password="123"></writeHost>
</dataHost>

实际中ip1和ip2是主从关系,假设localhost1对应db1,localhost2对应db2,这样ip1和ip2中存储了db1的分片数据,ip3中存储了db2的分片数据。在写操作的时候,mycat会将对应数据写入ip1,通过主从复制到ip2, 另一部分数据写入ip3,在读操作的时候,mycat会从ip2和ip3中获取对应数据合并后返回客户端。

假设在此时在ip2上新增数据,因为mycat要求写入的数据必须符合对应表的rule规则,比如rule设置了id字段只能取值10000和10010(mycat的例子),所以通过mycat是无法写入20000的值的,但是如果此时直接在ip2上写入20000,再select是可以读出来这条不合理的数据的,这也证明了mycat的读写分离功能。

在实际运用中,应该是设置好有部分的数据库服务器是用来作为分库分表服务器的,有部分数据库服务器则是用来作为读服务器的。也就是说在不同dataHost中的writeHost之间是没有关系的,只负责保存分配到本地的数据记录,而不同dataHost之间的readHost之间也是没有关系的,只负责同步对应writeHost的数据。

 

分库规则

在schema.xml文件中指定table的分库rule,关联rule.xml中的配置项。

tableRule

<tableRule name="jch">
<rule>
<columns>id</columns>
<algorithm>jump-consistent-hash</algorithm>
</rule>
</tableRule>

algorithm指定的算发必须在function中定义。

function

<function name="hash-int-test"class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int-test.txt</property>
<property name="type">1</property>
<property name="defaultNode">0</property>
</function>
  • mapFile指的是配置文件名。

  • type 标识需要分片columns的类型。默认值为0,0表示Integer,非零表示String。

  • defaultNode 默认DataNode节点。小于0表示不设置默认节点,大于等于0表示设置默认节点。作用: 枚举分片时,如果碰到不识别的枚举值,就路由到默认节点;不配置碰到不识别的枚举值就会报错。

枚举规则

在rule.xml当前目录下创建partition-hash-int-test.txt文件,定义枚举的规则。


以上是关于Mycat的概述的主要内容,如果未能解决你的问题,请参考以下文章

Mycat概述

Mycat的概述

Mycat 配置文件概述

MyCat概述与基本概念

mycat系列-概述

mycat系列-概述