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

  分库分表 是解决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分库分表,水平扩展还有很多问题这里没有涉及到,比如,

  如果最初分配的64个分表不够用了怎么办?这是最初决定分库分表是需要考虑的重要问题,因为hash容易,rehash难。

  这么多数据分散在不同的库表中,怎么分析和挖掘呢?

  怎么样的分库策略更适合你呢?

时间: 2024-12-31 21:55:25

分库分表策略的可实现架构的相关文章

170123、数据库分库分表策略的具体实现方案

相关文章: 1. 使用Spring AOP实现MySQL数据库读写分离案例分析 2.MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解 :http://blog.csdn.net/xlgen157387/article/details/51331244 3.MySQL主从复制的常见拓扑.原理分析以及如何提高主从复制的效率总结 :http://blog.csdn.net/xlgen157387/article/details/52451613 4.使用mysqlreplic

数据库分库分表策略的具体实现方案

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制,数据库分库与分表.这篇文章主要讲述数据库分库与分表 (1)业务拆分 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越来越低,并且对资源的消耗也变得越来越大,通过硬件提高系统性能的方式带来的成本也越来越高. 因此,在选型初期,一个

海量数据存储--分库分表策略详解 (转)

一.背景:     系统刚开始的时候,数据库都是单库单表结构.随着业务量的增加进行第一次数据库升级,根据业务垂直拆分数据库,这样多变成多个业务数据库,每个数据库里面还是单表结构.接下来,继续随着业务量的继续增加,单表已经很难承受数据量,就要进行分表,这个时候就是,多个业务库,每个业务库下对需要分表的表进行分表.再接下来,随着应用的增加,数据库IO,磁盘等等都抗不住了,就要把分表的表分到多个库,这样就形成了如下的结构. 重点:本文主要讨论的是分库分表的策略,也就是分库分表的规则或者说是算法. 二.

【数据库】分库分表策略

关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库.优化索引,做很多操作时性能仍下降严重.此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间. 数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位.整合.数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的

订单分库分表实践总结

订单分库分表实践总结 主库容量已接近服务器物理空间上限,同时也已经达到MySQL的处理上限,很快将无法再处理新增订单. 旧订单库面临的问题有: 1.超大容量问题 订单相关表都已经是超大表,最大表的数据量已经是几十亿,数据库处理能力已经到了极限: 单库包含多个超大表,占用的硬盘空间已经接近了服务器的硬盘极限,很快将无空间可用: 2.性能问题 单一服务器处理能力是有限的,单一订单库的TPS也有上限,不管如何优化,总会有达到上限,这限制了单位时间的订单处理能力,这个问题在大促时更加明显,如果不重构,订

程序员修神之路--做好分库分表其实很难之一(继续送书)

菜哥,领导让我开发新系统了 这么说领导对你还是挺信任的呀~ 必须的,为了设计好这个新系统,数据库设计我花了好多心思呢 做一个系统我觉得不应该从数据库入手,应该从设计业务模型开始,先不说这个,说说你的数据库设计的优势 为了高性能我首先设计了分库 分表策略,为以后打下基础 那你的数据量将来会很大吗?分库分表其实涉及到很多难题,你了解过吗? 我觉得分库分表很容易呀 是吗? 是否需要分 说到数据库分库分表,不能一味的追求,我们要明白为什么要进行分库分表才是最终目的.现在网上一些人鼓吹分库分表如何应对了多

分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好坏其实有失公允.本文通过对两种模式关键特性实现原理对比,希望可以尽可能客观.中立的阐明各自真实的优缺点以及适用场景. 一.NewSQL数据库先进在哪儿? 首先关于“中间件+关系数据库分库分表”算不算NewSQL分布式数据库问题,国外有篇论文pavlo-newsql-sigmodrec,如果根据该文中

分库分表之第五篇

分库分表之第五篇 9.案例 9.1.需求描述 9.2.数据库设计 9.3.环境说明 9.4.环境准备 9.4.1.mysql主从同步(windows) 9.4.2.初始化数据库 9.5.实现步骤 9.5.1搭建maven工程 9.5.2 分片配置 9.5.3 添加商品 9.5.4 查询商品 9.5.5 统计商品 10. 总结 9.案例 9.1.需求描述 电商平台商品列表展示,每个列表项中除了包含商品基本信息.商品描述信息之外,还包括了商品所属的店铺信息,如下 :本案例实现功能如下:1.添加商品2

SpringBoot使用sharding-jdbc分库分表

一.前言 一般来说,随着业务的发展数据库的数据量会越来越多,当单表数据超过上千万时执行一些查询sql语句就会遇到性能问题.一开始可以用主从复制读写分离来减轻db压力,但是后面还是要用分库分表把数据进行水平拆分和垂直拆分. 实现分库分表目前我知道的方式有两种,第一种是使用mycat中间件实现,第二种是使用sharding-jdbc实现.相比较而言,sharding-jdbc引入一个jar包即可使用更轻量级一些,它们之间的优缺点这里也不做比较,有兴趣的可以自己搜索相关资料. 不清楚分库分表原理的可以