`

分库分表策略的可实现架构

阅读更多

 

分库分表是解决mysql水平扩展的主要手段。网上有关策略的讨论很多,主要是hash扩展、按时间扩展、按范围扩展等等。但真正想实施分库分表的朋友们往往觉得“策略听来终觉浅,觉知此事要代码”,因此本文的主要目的是给朋友们提供一个可实现架构。

JDBCTemplate和Hibernate

大家都知道Hibernate是ORM(对象-关系数据库 mapping)意义上的第一个真正的“统治级”产品。JDBCTemplate则是对Spring对jdbc的简单封装,相对于Hibernate,工程师需要自己写sql,而不是像Hibernate那样直接操作对象解决数据库持久化的问题。因为暴露了sql,JDBCTemplate当然也不利于跨数据库(毕竟每个数据库的实现产品的sql也不竟相同)。但现在大多数互联网企业都倾向于使用JDBCTemplate,而不是Hibernate。个人认为主要原因就是性能问题,

 

1,为获取更好性能,往往根据不同数据库采用特有的优化方式,即使是DAO层全部用Hibernate实现,迁移数据库也不是轻松的工作。

2,使用Hibernate处理关联关系往往将大量数据信息加载到业务系统内存,而不是在数据库系统中处理,只是将最终结果返回。这样破坏了生产系统和DB的解耦,导致DB优化困难,以及生产系统的不安全。

3,分库分表对于Hibernate来说显得比较复杂

 

可以说第三个原因是主要的。本文会围绕JDBCTemplate来实现分库分表,如果你还在使用Hibernate,建议逐渐切换到JDCBTemplate。

 

分库分表策略

分库分表策略,简单来说就是根据要被持久化的数据,分配一个库或者表来读/写。因此DBSplitStrategy接口定义如下,

 

interface DBSplitStrategy {
	String getDBName(long id); // 获取库名
	String getTableSuffix(long id); // 获取表名
	JdbcTemplate getIdxJdbcTemplate(long id); // 获取db jt
	JdbcTemplate getIdxJdbcTemplate(String dbname); // 根据库名获取 db jt
	JdbcTemplate getIdxJdbcTemplateByTable(String table); // 根据表名获取db jt
}

 接口定义是围绕最基本的:key -> 逻辑库名/表名 -> 物理库名/表名

 

实现类



 以最常见的HashSplit为例,首先我们需要几个基本的配置项:(1)基本库名,也可以叫库名前缀;(2)分库总数;(3)分表总数;(4)分库对应的物理地址,即JDBCTemplate定义

Spring 配置
<bean id="dataService" class="DBSplitStrategy">
<property name="DBNameBase" value="session_" />
<property name="splitDBCount" value="16" />
<property name="splitTbCount" value="64" />
<property name="dmJts">
<map>
<entry key="session_1" value-ref="jts1"></entry>
<entry key="session_2" value-ref="jts2"></entry>

...

有了以上配置,代码工作只需要把输入的关键词安装策略转换成逻辑库名、表名即可,伪代码如下,

 

public String getTableName(long id) {
   long hash = getHash4split(id, splitCount);
   return tbNameBase + String.valueOf(hash / shareDBCount + 1);
}

public String getDBName(long id) {
   long hash = getHash4split(id, splitCount);
   return dbNameBase + ( hash % shareDBCount + 1);
}

 这段代码里有个有趣的逻辑,如果你的业务主键从 1 一直增长,那么分库分表的结果就是:库1,表0;库2,表0;库3,表0;..... 库1,表2;库2,表2;... 

 

总结

Mysql分库分表,水平扩展还有很多问题这里没有涉及到,比如,

 

  1. 如果最初分配的64个分表不够用了怎么办?这是最初决定分库分表是需要考虑的重要问题,因为hash容易,rehash难。
  2. 这么多数据分散在不同的库表中,怎么分析和挖掘呢?
  3. 怎么样的分库策略更适合你呢?

 

 

本文纯属原创,欢迎引用,请注明本博地址:http://maoyidao.iteye.com/

  • 大小: 6.2 KB
1
2
分享到:
评论
1 楼 noblemoon 2014-03-17  
非常不错,学习了!

相关推荐

    MySQL 分库分表的实现原理及演示案例

    MySQL分库分表是一种数据库架构优化技术,其目的是为了提高大型数据库系统的性能和可扩展性。在面对大规模数据和高并发访问时,单库单表往往难以满足需求,分库分表就成为了必要之选。分库分表技术可以将数据分散...

    数据分库分表之二叉树分库分表

    二叉树分库分表作为一种有效的数据分库分表策略,能够在保证数据一致性的同时,实现系统的高效扩展。尽管存在一些局限性,但在实际应用场景中仍有着广泛的应用前景。对于需要处理大量数据的企业而言,合理设计并实施...

    springmvc分库分表实际例子

    在IT行业中,数据库扩展是解决高并发、大数据量场景下的常见策略,而“分库分表”正是其中一种有效的手段。本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在...

    MySQL分库分表技术

    **三、分库分表策略** 1. **哈希分片**:根据数据的某个字段(通常是主键)进行哈希运算,然后根据哈希值对分片数取模,确定数据存储的位置。 2. **范围分片**:根据数据的某个字段(如时间戳)的范围进行划分,...

    Java+Springboot+mybatis+sharding jdbc 实现分库分表

    ShardingJDBC作为一个轻量级的Java库,能够在不修改现有数据库架构和业务代码的情况下,仅通过配置即可实现分库分表。它具备良好的兼容性,可以与任何Java应用无缝集成,包括但不限于Spring、MyBatis等。在本项目中...

    47_来来来!咱们聊一下你们公司是怎么玩儿分库分表的?.zip

    为了解决这些问题,业界提出了分库分表策略,通过分布式数据库的方式提高系统吞吐量和并发处理能力。 2. **数据库如何拆分**: - **垂直拆分**:依据业务逻辑,将关联性较弱的表分离到不同的数据库中,减少数据...

    数据库分库分表

    因此,在实施分库分表时,需要综合考虑业务需求、数据规模、系统架构以及团队的技术能力,选择合适的分库分表策略,并配合相应的中间件(如MyCat、ShardingSphere等)来简化开发和维护工作。 总的来说,数据库分库...

    php mysql分库分表实例

    "php mysql分库分表实例"这个主题就是针对这样的需求,它涉及到如何利用PHP编程语言来实现MySQL数据库的分库分表操作,以提高系统的性能和可扩展性。 分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决...

    分库分表代码实现和讲解

    在大数据量的场景下,传统的单数据库架构可能会面临性能瓶颈,这时就需要采用分库分表策略来提升系统处理能力。本教程将详细讲解如何使用PHP实现MySQL的分库分表,帮助你理解并掌握这一核心技能。 首先,我们来探讨...

    分库分表,多数据源的切换

    分库分表是数据库水平扩展的一种常见策略,旨在提高数据库系统的性能和可扩展性。本篇文章将详细探讨分库分表的原理、实现方式以及如何利用开源框架Sharding-JDBC进行实践。 分库分表,顾名思义,就是将一个大的...

    spring+mybatis+sharding-jdbc 1.3.1实现分库分表案例(可直接运行)

    在现代企业级应用中,随着数据量的增长,单表存储可能会遇到性能瓶颈,这时就需要引入分库分表策略来优化数据库架构。本案例基于Spring、MyBatis和Sharding-JDBC 1.3.1版本,提供了一个可以直接运行的分库分表实现,...

    SpringCobar分库分表

    接下来,我们将讨论如何实施分库分表策略: 1. **分片策略**:选择合适的分片策略至关重要。常见的分片策略有哈希分片、范围分片、列表分片等。例如,可以根据用户ID的哈希值进行分片,确保相同ID的用户数据始终落...

    shardingsphere 分库分表中文帮助文档

    - 需要在不同的模块之间采用不同的分库分表策略。 - 对于旧系统改造,部分模块使用 Shardingsphere-JDBC,新开发的部分使用 Shardingsphere-Proxy。 #### 2. 快速入门 ##### 2.1 Shardingsphere-JDBC **步骤 1...

    基于分布式的数据库分库与分表策略研究.pdf

    数据库代理服务器在收到插入操作的SQL语句后,会根据任务分配表原则进行分库分表操作,同时生成路由表,便于后续数据的更新、删除等操作的快速定位。 在实际操作中,数据库插入操作时,客户端首先发送插入语句给...

    对分库分表的一些想法

    总的来说,对分库分表的理解和应用需要结合业务需求、系统架构以及技术选型多方面考虑。在实践中,我们需要权衡性能、可维护性、成本等因素,选择最适合的方案,以实现高效且可靠的数据库扩展。对于开发者而言,深入...

    Mysql分库分表11111111111

    ### MySQL分库分表策略详解 #### 一、场景与系统分析 在互联网技术日新月异的今天,数据量的快速增长对数据库系统的性能提出了更高要求。为了应对这些挑战,许多企业选择实施分库分表策略。分库分表是指将原来单一...

    4-Sharding-JDBC分库分表.pdf

    分库分表的概念、垂直拆分与水平拆分、分片策略和分片算法是Sharding-JDBC中核心的知识点,下面将对这些概念进行详细的解释。 ### 分库分表概念 分库分表是为了解决随着业务数据量的不断增长,单库单表模式面临的...

    Mycat读写分离、主从切换、分库分表的操作记录- 线上操作手册

    Mycat是一个功能强大且灵活的数据库中间件,通过实现读写分离、主从切换、分库分表等功能,有效解决了大型系统中的数据库瓶颈问题。其不仅简化了数据库管理和维护流程,还提升了整个系统的性能和可靠性。对于那些...

    分库分表入门级-lzg

    阿里巴巴在面对海量数据时采用分库分表策略,以应对高QPS、带宽压力和数据库连接数限制。例如,通过时间算法分库分表,可以按天/月/年划分数据,简化查询定位。在扩展时,可以通过调整计算规则来平滑地增加新的库表...

Global site tag (gtag.js) - Google Analytics