`
echohfut
  • 浏览: 231072 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数据库分库分表规则

 
阅读更多

from: http://rdc.taobao.com/team/jm/archives/590

 

一般有几个目标:

1. 数据离散性,数据分布到多个库,多个表中

mod, round robin, dayofweek,dayofMonth

 

2. 避免热点数据在一个数据库库表上

 

3. 扩容时有大的数据迁移

 

以下的解决方案基于 整表搬迁但不会有表中行级数据迁移

 

【水平扩展scale-out方案模式一】

阶段一:一个库DB0之内分4个表,id%4

dbRule: “DB0"

tbRule: “t”  + (id % 4)

阶段二:增加db1库,t2和t3整表搬迁到db1

dbRule: “DB" + ((id%4)/2)

tbRule: “t”  + (id % 4)

阶段三:增加DB2和DB3库,t1整表搬迁到DB2,t3整表搬迁的DB3:

为了规则表达,通过内部名称映射或其他方式,我们将DB1和DB2的名称和位置互换得到下图

dbRule: “DB" + (id%4)

tbRule: “t”  + (id % 4)

 

 

如果更进一步数据库的设计和部署上能做到每个表一个硬盘,那么扩容的过程只要把原有机器的某一块硬盘拔下来,
插入到新的机器上,就完成整表搬迁了!可以大大缩短停机时间。

具体在mysql上可以以库为表。开始一个物理机上启动4个数据库实例,每次倍增机器,直接将库搬迁到新的机器上。
这样从始至终规则都不需要变化,一直都是:

dbRule: “DB” + (id % 4)
tbRule: “t”  + (id % 4)

 

不足是:

即逻辑上始终保持4库4表,每个表一个库。

从一个库到4个库的过程中,单表的数据量一直在增长。当单表的数据量超过一定范围时,可能会带来性能问题。比如索引的问题,历史数据清理的问题。
另外当开始预留的表个数用尽,到了4物理库每库1个表的阶段,再进行扩容的话,不可避免的要从表上下手。

 

 

【水平扩展scale-out方案模式二】

阶段一:一个数据库,两个表

分库规则dbRule: “DB0″
分表规则tbRule: “t” + (id % 2)

阶段二:当单库的数据量接近1千万,单表的数据量接近500万时,进行扩容(数据量只是举例,具体扩容量要根据数据库和实际压力状况决定):
增加一个数据库DB1,将DB0.t1整表迁移到新库DB1。
每个库各增加1个表,未来10M-20M的数据mod2分别写入这2个表:t0_1,t1_1:

分库规则dbRule:

“DB” + (id % 2)

分表规则tbRule:

    if(id < 1千万){
        return "t"+ (id % 2);   //1千万之前的数据,仍然放在t0和t1表。t1表从DB0搬迁到DB1库
    }else if(id < 2千万){
        return "t"+ (id % 2) +"_1"; //1千万之后的数据,各放到两个库的两个表中: t0_1,t1_1
    }else{
        throw new IllegalArgumentException("id outof range[20000000]:" + id);
    }

这样10M以后的新生数据会均匀分布在DB0和DB1; 插入更新和查询热点仍然能够在每个库中均匀分布。
每个库中同时有老数据和不断增长的新数据。每表的数据仍然控制在500万以下。

 

阶段三:当两个库的容量接近上限继续水平扩展时,进行如下操作:
新增加两个库:DB2和DB3. 以id % 4分库。余数0、1、2、3分别对应DB的下标. t0和t1不变,
将DB0.t0_1整表迁移到DB2; 将DB1.t1_1整表迁移到DB3
20M-40M的数据mod4分为4个表:t0_2,t1_2,t2_2,t3_2,分别放到4个库中:

 

分库规则dbRule:

  if(id < 2千万){
      //2千万之前的数据,4个表分别放到4个库
      if(id < 1千万){
          return "db"+  (id % 2);     //原t0表仍在db0, t1表仍在db1
      }else{
          return "db"+ ((id % 2) +2); //原t0_1表从db0搬迁到db2; t1_1表从db1搬迁到db3
      }
  }else if(id < 4千万){
      return "db"+ (id % 4);          //超过2千万的数据,平均分到4个库
  }else{
      throw new IllegalArgumentException("id out of range. id:"+id);
  }

 

分表规则tbRule:

  if(id < 2千万){        //2千万之前的数据,表规则和原先完全一样,参见阶段二
      if(id < 1千万){
          return "t"+ (id % 2);       //1千万之前的数据,仍然放在t0和t1表
      }else{
          return "t"+ (id % 2) +"_1"; //1千万之后的数据,仍然放在t0_1和t1_1表
      }
  }else if(id < 4千万){
      return "t"+ (id % 4)+"_2";      //超过2千万的数据分为4个表t0_2,t1_2,t2_2,t3_2
  }else{
      throw new IllegalArgumentException("id out of range. id:"+id);
  }

 

 

dbRule: “DB” + (id % 4)
tbRule: “t”  + (id % 4)

分享到:
评论

相关推荐

    多数据源+数据库分库分表

    分库分表采用sharding-jdbc 数据库连接池管理是alibaba的druid-spring-boot-starter 项目使用springboot搭建,junit测试,为了方便实现对数据库操作继承了mybatisplus,为了少些get、set 引入lombok

    数据库分库分表

    数据库分库分表是应对大数据量和高并发场景下的重要技术策略,旨在提高数据库系统的性能、可用性和可扩展性。随着互联网应用的发展,单个数据库往往难以承受日益增长的数据量和用户访问压力,这时就需要采用分库分表...

    Mycat数据库分库分表

    《Mycat数据库分库分表详解》 在大数据时代,单个数据库处理海量数据的能力逐渐捉襟见肘,这催生了数据库分库分表的需求。Mycat,作为一个开源的分布式数据库中间件,应运而生,为解决大数据场景下的高性能、高可用...

    数据库分库分表(sharding)的技术

    ### 数据库分库分表(Sharding)技术详解 #### 一、基本概念与原理 **数据库分库分表(Sharding)**是一种常见的数据库优化技术,主要用于解决大规模数据存储和高并发访问带来的性能瓶颈问题。它通过将单一数据库...

    Mycat 数据库分库分表中间件.pdf

    《Mycat数据库分库分表中间件》 在当今大数据时代,单个数据库系统往往无法满足高并发、海量数据的处理需求。为了解决这一问题,Mycat应运而生,它是一款开源的、基于Java开发的数据库中间件,专门用于实现数据库的...

    数据库分库分表解决方案汇总.docx

    数据库分库分表是应对大数据量和高并发场景下的常用技术策略,旨在提高数据库系统的性能和稳定性。当单个数据库的存储容量、连接数或处理能力达到极限时,通过数据切分可以有效地分散负载,缩短查询时间。主要分为...

    数据库分库分表架构实践.docx

    数据库分库分表架构实践是应对业务增长和性能瓶颈的关键策略。这一技术旨在通过将大型数据库分解为多个较小的部分,提升系统的可扩展性和性能。本文主要探讨了垂直分表、垂直分库、水平分表以及水平分库分表四种方法...

    mysql高可用分库分表.pdf

    为了提升MySQL数据库的性能和可用性,常采用的策略是数据库分库分表,其中可以分为垂直分库、垂直分表、水平分库、水平分表等方法。 垂直分表是针对数据库表中的列进行拆分,将一张大表拆成若干个结构更小的表,以...

    springmvc分库分表实际例子

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

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

    数据分库分表是指将原始数据库中的数据分散存储到多个不同的数据库或表中,以此达到提高数据处理能力的目的。分库分表主要有两种形式:水平分库分表和垂直分库分表。本文着重讨论的是水平分库分表,即不改变表结构的...

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

    数据库分库分表的几种方式主要包括垂直分库、垂直分表、水平分库和水平分表。垂直分库是按照业务的不同进行数据库的分割,每个数据库只包含部分业务的数据;垂直分表是将一个表按照字段划分成多个表,通常按照数据的...

    分库分表自动建库表小工具

    在IT行业中,数据库管理是至关重要的,特别是在大数据量的情况下,分库分表是一种常见的优化策略。这个名为"分库分表自动建库表小工具"的程序正为此目的而设计,它能帮助开发者自动化地创建分布式数据库架构。下面将...

    MySQL分库分表技术

    2. **负载均衡**:通过分库分表,可以将流量分散到多个数据库服务器上,避免单一节点过载,提高系统可用性。 3. **扩展性**:当系统需要扩展时,可以通过增加新的数据库实例来提高处理能力,而无需重构整个数据库...

    数据库+分库分表+sharding-jdbc

    数据库分库分表是应对大数据量、高并发访问场景下的重要解决方案,旨在提高数据库系统的性能和可扩展性。Sharding-JDBC是阿里巴巴开源的一款轻量级的Java框架,用于实现数据库的水平拆分,它是基于JDBC的中间件,...

    48_你们当时是如何把系统不停机迁移到分库分表的?.zip

    ”提示了本次讨论的主题,即如何在不中断服务的情况下,对数据库进行分库分表操作。这通常是一个复杂的过程,涉及到数据库架构的调整、数据迁移、双写策略以及回滚计划等关键环节。 描述中给出的链接指向了CSDN...

    mysql 数据库分库分表技术,主从复制技术-mysql_learn_demo.zip

    分库分表是将一个大型的数据库拆分为多个小型数据库或表格,以降低单个数据库的压力,提高系统的并发处理能力和整体性能。分库是按照业务逻辑将数据分散到不同的数据库中,而分表则是将一个大表分割成多个小表,...

    Oracle分库分表分区学习日志.docx

    数据库分库分表是解决数据库性能瓶颈的一种方法。当单表数据量达到 1000W 或 100G 后,查询性能下降严重时,需要考虑对数据进行切分。切分的目的减少数据库的负担,缩短查询时间。对数据的切分可以分为两种:垂直...

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

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

    php mysql分库分表实例

    分库分表是一种常见的数据库垂直切分和水平切分策略,用于解决单一数据库性能瓶颈问题。垂直切分是根据业务逻辑将数据分散到多个数据库中,通常依据表的相关性或访问频率来进行。而水平切分则是按照某个字段(如用户...

Global site tag (gtag.js) - Google Analytics