分区分表支持

简介:

最近,正在做一个互联网项目,数据量比较大,因此,拟采用分区分表支持。

目前分区分表这种东东也比较多,在文章http://www.itokit.com/2012/0404/73496.html中有详细的介绍,写得非常好,建议对这个点比较感兴趣的同学前往观看。

文中也总结了觉的分区分表实现方式有两种:JDBC层的封装,ORM框架层的实现

Tiny框架中拟采用JDBC层的封装,采用JDBC层的封装有诸多好处,第一,对应用的影响最小,第二,对各种数据库有更好的更通用的支持;当然,同步带来的问题就是难度比较大。

目前拟提供特性如下:

  1. 支持同库分表:即把表aaa,分为aaa0,aaa1,aaa2,aaa3...的方式
  2. 支持异库分表:即把表aaa分解到db0,db1,db2,db3多个Schema中的方式
  3. 支持读写分离方式:即一写多读的支持
  4. 支持读写分离备方式:即一写,若干写备,多读的方式。如果写库当机,备机可以顶上

删除语句示例代码如下:

?
1
2
3
4
5
Class.forName( "org.tinygroup.dbcluster.jdbc.TinyDriver" );
         Connection conn = DriverManager.getConnection( "jdbc:dbcluster://cluster1" , "sa" , "123456" );
         Statement stmt = conn.createStatement();
         String sql = "delete from aaa" ;
         stmt.execute(sql);



日志输出
?
1
2
3
Using shard:shard0 to execute sql:delete from aaa
Using shard:shard1 to execute sql:delete from aaa
Using shard:shard2 to execute sql:delete from aaa



插入语句示例:
?
1
2
3
4
5
6
7
8
9
Class.forName( "org.tinygroup.dbcluster.jdbc.TinyDriver" );
         Connection conn = DriverManager.getConnection( "jdbc:dbcluster://cluster1" , "sa" , "123456" );
         Statement stmt = conn.createStatement();
         String sql;
         //插入100条数据
         for ( int i = 0 ; i < 100 ; i++) {
             sql = "insert into aaa(id,aaa) values (" + clusterManager.getPrimaryKey(cluster, "aaa" ) + ",'ppp')" ;
             boolean result = stmt.execute(sql);
         }



控制台信息:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Using shard:shard0 to execute sql:insert into aaa(id,aaa) values ( 0 , 'ppp' )
Using shard:shard1 to execute sql:insert into aaa(id,aaa) values ( 1 , 'ppp' )
Using shard:shard2 to execute sql:insert into aaa(id,aaa) values ( 2 , 'ppp' )
Using shard:shard0 to execute sql:insert into aaa(id,aaa) values ( 3 , 'ppp' )
Using shard:shard1 to execute sql:insert into aaa(id,aaa) values ( 4 , 'ppp' )
Using shard:shard2 to execute sql:insert into aaa(id,aaa) values ( 5 , 'ppp' )
Using shard:shard0 to execute sql:insert into aaa(id,aaa) values ( 6 , 'ppp' )
Using shard:shard1 to execute sql:insert into aaa(id,aaa) values ( 7 , 'ppp' )
Using shard:shard2 to execute sql:insert into aaa(id,aaa) values ( 8 , 'ppp' )
Using shard:shard0 to execute sql:insert into aaa(id,aaa) values ( 9 , 'ppp' )
Using shard:shard1 to execute sql:insert into aaa(id,aaa) values ( 10 , 'ppp' )
Using shard:shard2 to execute sql:insert into aaa(id,aaa) values ( 11 , 'ppp' )
Using shard:shard0 to execute sql:insert into aaa(id,aaa) values ( 12 , 'ppp' )
Using shard:shard1 to execute sql:insert into aaa(id,aaa) values ( 13 , 'ppp' )
Using shard:shard2 to execute sql:insert into aaa(id,aaa) values ( 14 , 'ppp' )
Using shard:shard0 to execute sql:insert into aaa(id,aaa) values ( 15 , 'ppp' )
......


比上面的示例看出,对于最终用户来说,除了url有些不一样之外,其它是与普通的JDBC使用完全一致的。所以,不会像某些框架,只支持少数几种数据库类型的情况出现。只要是遵从JDBC规范的数据库,全部可以支持。

当然,说到到分片处理,唯一主键的处理就非常关键。

为了方便使用,主键的处理,是在JDBC层进行处理的,也就是说,只要像常见的方式设置主键自动生成,应用层不用做任何特殊处理,底层就会自动为期提供主键,且保证不同的分片之间的主键不会重复。

对于SQL的支持来说,除了两个分片之间不能做关联之外,其它与常见处理没有任何区别。

当然,为了方便使用,对于统计方面的支持也是非常好的。

比如:执行的sql语句是select count(*) from aaa,底层会自动进行结果搜索并返回合并后的结果。

比如:执行的SQL语句是select avg(score) from student,底层也会进行处理,并返回合并后的结果,能够做到结果与未库完全一致。

对于读写分离来说,处理就简单多了,这里不再细述。

进度情况:目前已经实现相关部分功能,期待在2013年结束之前能够放出来。

框架的扩展性非常好,完全可以自定义各种分区,分表,路由规则的实现,当然在一般情况下,框架自带的也已经足够。

相关内容在实现到一定程度再行补充。

相关文章
|
9月前
|
存储 关系型数据库 MySQL
MySQL数据库的分区和分表技术
MySQL数据库的分区和分表技术
|
11月前
|
存储 数据处理 数据库
分表方案有哪些
分表方案有哪些
81 0
|
11月前
|
存储 NoSQL Java
数据系统分区设计 - 分区与二级索引
目前的分区方案都依赖KV数据模型。KV模型简单,都是通过K访问记录,自然可根据K确定分区,并将读写请求路由到负责该K的分区。
70 0
|
存储 NoSQL 关系型数据库
InfluxDB存储数据是否需要水平拆分表?
InfluxDB存储数据是否需要水平拆分表?
InfluxDB存储数据是否需要水平拆分表?
|
存储 SQL 数据管理
|
关系型数据库 MySQL 索引
mysql分表,分区的区别和联系
一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考mysql分区功能详细介绍,以及实例 二,mysql分表和分区有什么区别呢 1,实现方式上 a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。
6383 0
|
Web App开发 关系型数据库 测试技术
|
程序员 分布式数据库 数据库
|
算法 Java 数据库连接
|
内存技术 Linux