创建HTTP自定义分库分表
/*+ mycat:createTable{
"schemaName":"创建的schema是的schemaName",
"shardingTable":{
"createTableSQL":"建表语句",
"function":{
"clazz":"io.mycat.router.custom.HttpCustomRuleFunction",
"properties":{
"name":"自定义名称",
"shardingDbKeys":"分库字段",
"shardingTableKeys":"分表字段",
"shardingTargetKeys":"分实例字段",
"allScanPartitionTimeout":5,
"fetchTimeout":60000,
"routerServiceAddress":"http://127.0.0.1:8000/router_service_address",
}
}
},
"tableName":"表名称"
} */;
也就是说,需要我们提供一个接口给mycat 进行动态获取分库分表的策略
mycat以form的方式进行请求
请求参数有3个:
schemaName:schemaName名字
tableName:表名
condition:条件
如果传过来的condition为空,需要返回当前表的所有分区信息
返回数据格式如下:
[
{
"targetName":"集群实例名,例 c0,c1 就能确定当前这个分区是在哪个集群分",
"dbIndex":"库索引下标,不是实际库名,分多个库需要注意,一张表不能有重复的字段",
"tableIndex":"表索引下标,不是实际表名,不能重复",
"index":"总分区表下标,当前分的第几个区",
"table":"表名称,实际表名,例:同一个库,表名不能相同",
"targetIndex":"index+1 这个没搞懂,使用总分区表下标+1就行",
"schema":"库名称,实际库名,例:c0集群分2个库,c1集群2个库, 所有库的名称不能相同 , 库名_0,库名_1 类似写法"
},
{
"targetName":"集群实例名,例 c0,c1 就能确定当前这个分区是在哪个集群分",
"dbIndex":"库索引下标,不是实际库名,分多个库需要注意,一张表不能有重复的字段",
"tableIndex":"表索引下标,不是实际表名,不能重复",
"index":"总分区表下标,当前分的第几个区",
"table":"表名称,实际表名,例:同一个库,表名不能相同",
"targetIndex":"index+1 这个没搞懂,使用总分区表下标+1就行",
"schema":"库名称,实际库名,例:c0集群分2个库,c1集群2个库, 所有库的名称不能相同 , 库名_0,库名_1 类似写法"
},
{
"targetName":"集群实例名,例 c0,c1 就能确定当前这个分区是在哪个集群分",
"dbIndex":"库索引下标,不是实际库名,分多个库需要注意,一张表不能有重复的字段",
"tableIndex":"表索引下标,不是实际表名,不能重复",
"index":"总分区表下标,当前分的第几个区",
"table":"表名称,实际表名,例:同一个库,表名不能相同",
"targetIndex":"index+1 这个没搞懂,使用总分区表下标+1就行",
"schema":"库名称,实际库名,例:c0集群分2个库,c1集群2个库, 所有库的名称不能相同 , 库名_0,库名_1 类似写法"
},
]
如果condition 不为空 ,需要根据自己的算法算出,数据落在哪个库,就是从所有的分库中取一个,返回给mycat,
建议: 以map方式,用特殊的键保存所有分区信息, 当条件传过来是,根据字段的值能快速定位到分区位置即可
弊端
mycat 每次查询和插入数据,都需要从提供策略的服务器获取信息
1.每次创建http连接,耗时
2.要保障策略服务器的稳定
![在这里插入图片描述](https://img-blog.csdnimg.cn/e33a3cd5a41d4a4491293da50eace2cf.png
利用这个属性实现添加class文件,到jar包 进行自定义算法
-
下载mycat源码到本地
-
找到 io.mycat.router.custom.HttpCustomRuleFunction 这个类,复制一份。
-
HttpCustomRuleFunction 这个类是发送http 获取信息,将发送http获取信息的那段代码,改掉替换成自己写的那段http算法代码
-
修改完成后,打包
可以使用mycat2下的包,进行整个替换,
也可以使用router包下的jar ,打开里面将自定义的类的class 复制出来,再打开运行mycat的jar,复制进去。
创建分库分表的时候指定 clazz 全限定类名就可以了
效果是一样的,省了http的时间