具体拆分方案已经有了:
但是在操作的时候还是有点小问题,但基本上是按照这个设计实现的。
首先是mycat的,mycat正式版本是1.3.0.3-release,但是这个不包括partitionbymonth这个类,其次partitionbymonth 这个类的输入参数是日期也不好按月进行分表。
还好这类可以转换月,不用修改代码,也可以将就着用。
打包partitionbymonth这个类生成一个jar。这个类在1.4-rc包里面有。将新jar放到lib目录下面。
partitionbymonth这个类非常简单,对比下日期然后返回分区的序号。
如果业务复杂不是一个月一个月的分区可以直接写死逻辑然后打包使用,比如按季度分区,半个月一分区,或者在2015-06月以前是一个表以后是按月分区等等。
首先创建数据库,默认分4个表,所有创建4个数据库,同理可以直接创建好一年的12个表,这里只是举例子。
在这4个数据库中创建表,表做10个分区(具体分区数可根据业务量划定,每个月的mysql分区可以不一样),按照gid做分区。
配置mycat 的rule.xml,这里用到了一个小技巧。month的格式化是
schema.xml配置:
server.xml配置:
如果mycat启动正常,查看logs/wrapper.log没有异常,且数据库连接已经创建。
java客户端调用说明,首先msg表的id是按照gid连续自增的,如果id > 1,且当月没有查询到数据,查询前一个月的数据,直到id = 1 为止。
使用递归函数往前一个月一个月查询数据,直到查询到id = 1 为止。查询结果如下,每次显示20条数据,插入的100 条 % 28 分别插入4个月数据。
查询结果可以跨月查询:
mycat可以支持按月插入数据,但是查询起来要自己做好分月查询方案。
由于用户插入的数据有可能分散在多个月的数据表中,查询的时候需倒序一个月一个月的查询。
数据的存储可以按照年,500g数据放到一个磁盘,一年增加一个磁盘,新数据都写到新磁盘上面,保证数据随着时间增长只需要新增加数据库和磁盘即可,不需要进行数据迁移。