官方网站:http://www.mycat.org.cn
MyCat通过定义表的分片来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法
schema.xml作为Mycat中重要的配置文件之一,管理着Mycat的逻辑库、表、分片规则、DataNode以及DataHost之间的映射关系。弄懂这些配置,是正确使用Mycat的前提。
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="item" dataNode="dn1,dn2,dn3" rule="mod-long"
primaryKey="ID"/>
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.24.129:3306" user="root"
password="root" >
writeHost>
dataHost>
mycat:schema>
server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparserproperty>
system>
<user name="mycat">
<property name="password">mycatproperty>
<property name="schemas">TESTDBproperty>
user>
mycat:server>
rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。
这个文件里面主要有tableRule和function这两个标签。
在具体使用过程中可以按照需求添加tableRule和function。
<mycat:rule xmlns:mycat=”http://io.mycat/“ >
//表规制定义
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_idcolumns>
<algorithm>hash-intalgorithm>
rule>
tableRule>
//对应分片方法定义
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txtproperty>
function>
mycat:rule>
tableRule 标签配置说明:
function 标签配置说明:
<tableRule name="sharding-by-date">
<rule>
<columns>create_timecolumns>
<algorithm>sharding-by-datealgorithm>
rule>
tableRule>
<function name="sharding-by-date" class="io.mycat.route.function..PartitionByDate">
<property name="dateFormat">yyyy-MM-ddproperty>
<property name="sBeginDate">2014-01-01property>
<property name="sPartionDay">10property>
function>
<tableRule name="sharding-by-month">
<rule>
<columns>create_timecolumns>
<algorithm>sharding-by-monthalgorithm>
rule>
tableRule>
<function name="sharding-by-month" class="io.mycat.route.function..PartitionByMonth">
<property name="dateFormat">yyyy-MM-ddproperty>
<property name="sBeginDate">2014-01-01property>
function>
<tableRule name="sharding-by-hour">
<rule>
<columns>create_timecolumns>
<algorithm>sharding-by-houralgorithm>
rule>
tableRule>
<function name="sharding-by-hour" class="io.mycat.route.function..LastestMonthPartition">
<property name="splitOneDay">24property>
function>
配置说明:
tableRule标签:
function标签:
<tableRule name="auto-sharding-long">
<rule>
<columns>user_idcolumns>
<algorithm>rang-longalgorithm>
rule>
tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txtproperty>
function>
配置说明:
tableRule标签:
function标签:
autopartition-long.txt文件内容:
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0 0-100 0
500M-1000M=1 101-200 1
1000M-1500M=2 201-300 2
default=0
# 或以下写法
# 0-10000000=0
# 10000001-20000000=1
优势:扩容无需迁移数据
缺点:热点数据,并发受限
<tableRule name="sharding-by-intfile">
<rule>
<columns>user_idcolumns>
<algorithm>hash-intalgorithm>
rule>
tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txtproperty>
<property name="type">0property>
<property name="defaultNode">0property>
function>
配置说明:
tableRule标签:
默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点。如果不配置默认节点(defaultNode值小于0表示不配置默认节点),碰到不识别的枚举值就会报错:can’t
find datanode for sharding column:column_name val:ffffffff
partition-hash-int.txt 文件
10000=0 列等于10000 放第一个分片
10010=1
男=0
女=1
beijing=0
tianjin=1
zhanghai=2
说明: 此种配置非常明确,即根据id与count(你的结点数)进行求模运算,相比方式1,此种在批量插入时需要切换数据源,id不连续
<tableRule name="mod-long">
<rule>
<columns>user_idcolumns>
<algorithm>mod-longalgorithm>
rule>
tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3property>
function>
配置说明:
tableRule标签:
function标签:
<tableRule name="sharding-by-stringhash">
<rule>
<columns>user_idcolumns>
<algorithm>sharding-by-stringhashalgorithm>
rule>
tableRule>
<function name="sharding-by-stringhash" class="io.mycat.route.function.PartitionByString">
<property name="length">512property>
<property name="count">2property>
<property name="hashSlice">0:2property>
function>
配置说明:
tableRule标签:
function标签:
预算位 即根据子字符串中int值 hash运算 0 代表 str.length(), -1 代表 str.length()-1,大于0只代表数字自身,简单理解为substring(start,end),start为0则只表示0
“2” -> (0,2)
“1:2” -> (1,2)
“1:” -> (1,0)
“-1:” -> (-1,0)
“:-1” ->(0,-1)
“:” -> (0,0)
<tableRule name="rule1">
<rule>
<columns>user_idcolumns>
<algorithm>func1algorithm>
rule>
tableRule>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">2,1property>
<property name="partitionLength">256,512property>
function>
配置说明:
tableRule标签:
function标签:
约束 :
count,length 两个数组的长度必须是一致的。 1024 = sum((count[i]*length[i]))
@Test
public void testPartition() {
// 本例的分区策略:希望将数据水平分成3份,前两份各占25%,第三份占50%。(故本例非均匀分区)
// |<---------------------1024------------------------>|
// |<----256--->|<----256--->|<----------512---------->|
// | partition0 | partition1 | partition2 |
// | 共2份,故count[0]=2 | 共1份,故count[1]=1 |
int[] count = new int[] { 2, 1 };
//如果需要平均分配设置:平均分为4分片,partitionCount*partitionLength=1024
//五、一致性hash
int[] length = new int[] { 256, 512 };
PartitionUtil pu = new PartitionUtil(count, length);
// 下面代码演示分别以offerId字段或memberId字段根据上述分区策略拆分的分配结果
int DEFAULT_STR_HEAD_LEN = 8; // cobar默认会配置为此值
long offerId = 12345;
String memberId = "qiushuo";
// 若根据offerId分配,partNo1将等于0,即按照上述分区策略,offerId为12345时将会被分配到partition0中
int partNo1 = pu.partition(offerId);
// 若根据memberId分配,partNo2将等于2,即按照上述分区策略,memberId为qiushuo时将会被分到partition2中
int partNo2 = pu.partition(memberId, 0, DEFAULT_STR_HEAD_LEN);
Assert.assertEquals(0, partNo1);
Assert.assertEquals(2, partNo2);
}
如果需要平均分配设置:平均分为4分片,partitionCount*partitionLength=1024
<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
<property name="partitionCount">4property>
<property name="partitionLength">256property>
function>
<tableRule name="sharding-by-murmur">
<rule>
<columns>user_idcolumns>
<algorithm>murmuralgorithm>
rule>
tableRule>
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0property>
<property name="count">2property>
<property name="virtualBucketTimes">160property>
function>
一致性hash 0-2的32次方减1,预算有效解决了分布式数据的扩容问题,前1-9中id规则都多少存在数据
扩容难题,而10规则解决了数据扩容难点
<tableRule name="sharding-by-substring">
<rule>
<columns>user_idcolumns>
<algorithm>sharding-by-substringalgorithm>
rule>
tableRule>
<function name="sharding-by-substring" class="io.mycat.route.function.PartitionDirectBySubString">
<property name="startIndex">0property>
<property name="size">2property>
<property name="partitionCount">8property>
<property name="defaultPartition">0property>
function>
配置说明:
tableRule标签:
function标签:
11010419800101
此方法为直接根据字符子串(必须是数字)计算分区号(由应用传递参数,显式指定分区号)。
例如id=05-100000002
在此配置中代表根据id中从startIndex=0,开始,截取siz=2位数字即05,05就是获取的分区,如果没
传默认分配到defaultPartition
优点:数据分布均匀,并发能力强
缺点:移植性差、扩容性差