专栏首页Venyo 的专栏无需数据迁移的水平分库方案
原创

无需数据迁移的水平分库方案

在工作中,曾经做过一个项目,采用了哈希取模的方法进行水平分库,这种方法简单高效,但是在数据库规模有所变动的时候,需要做数据迁移。本文介绍一个自己拍脑袋想出来的一种简易的水平分库方案,以解决数据迁移的问题。

首先,我将数据库表中的字段分为三种类型:主键(通常是整型 id)、关键字段、非关键字段。关键字段指的是该字段在当前表结构中具有决定性意义,如图书借阅记录表中的 userId。

其次,主键必须包含分片信息,即分库的下标值,可通过对主键进行解析获得分库下标,直接定位到对应数据库。

然后,我们来讨论增删改查。

  1. 增:
    1. 增加包含关键字段的记录。对关键字段的值进行哈希,然后对当前数据库规模值取模(注意这里的当前,后面会解释时间点的意义),即:hash(key) % {count of db}(1),从而获取到该记录所应该落地的数据库下标。
    2. 增加不包含关键字段的记录。这种情况,可直接随机落地,注意分库信息一定要记录到主键中。
  2. 删:
    1. 根据主键删除特定记录。由于主键中记录了分库信息,因此可以快速定位到相应的分库。
    2. 根据关键字段删除特定记录。由于相同的关键字段值都会被路由到同一个数据库,因此使用公式(1)算出分库下标,即可定位到相应分库。
    3. 根据非关键字段删除特定记录。这种情况需要对所有数据库都执行相同语句。
  3. 改:同上。
  4. 查:同上。

以上说的情况是采用了哈希取模的方法进行水平分库,接下来要加入分片规模记录的概念(在个人项目中定义的接口为

IShardScaleRecord)。

分片规模记录保存了数据库规模的变动记录,具体如下:

{

{1531375099000, 1},// 2018/7/12 13:58:19 数据库规模为 1

{1531459618000, 2}// 2018/7/13 13:26:58 数据库规模为 2

}

加入了该记录以后,在数据库扩容并不做数据迁移的情况下,也无需全库操作。此时,我们再来讨论增删改查。

  1. 增:增加操作与之前并没有差别,需要注意的是当前这个时间点,在增加记录时 {count of db} 为最后一条分片规模记录的数据库规模大小。
  2. 删:
    1. 根据主键删除特定记录。由于主键中记录了分库信息,因此可以快速定位到相应的分库。
    2. 根据关键字段删除特定记录。这种情况需要分为三种情况。
      1. 指定了某个时间点。根据分片规模记录,获取到当前时间点的数据库规模代入公式(1)计算得到分库下标。
      2. 指定了某个时间段。根据分片规模记录,获取该时间段内的数据库规模列表,遍历该列表,使用公式(1)计算得到分库下标列表,同时对该列表中的分库进行删除操作。
      3. 未指定时间点(段)。遍历整个分片规模记录,使用公式(1)计算得到分库下标列表,同时对该列表中的分库进行删除操作。
    3. 根据非关键字段删除特定记录。这种情况需要对所有数据库都执行相同语句。
  3. 改:同上。
  4. 查:同上。

至此,本人拍脑袋瞎想的方案介绍完毕,欢迎各位大佬指导批评。

附上项目地址

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RBG颜色直方图

    package com.imageretrieval.features; import java.awt.Color; import com.imagere...

    Venyo
  • 旋转不变的感知哈希

    package com.imageretrieval.features; import com.imageretrieval.utils.ImageUtil;...

    Venyo
  • pHash的Java实现

    此算法中的DCT变换是从 http://blog.csdn.net/luoweifu/article/details/8214959抄过来的,因为这种需要大量的...

    Venyo
  • ShardingSphere 介绍与简单入门

    于是,我将 Apache ShardingSphere 产品介绍与开发入门通篇阅读了一遍。

    FoamValue
  • 为了给你们讲清楚数据库中间件有哪些,我也是拼了!

    卖羊肉串首先就得有羊肉,于是我就联系了很多养殖场,我又是一个比较负责任的人,为了保证羊肉的质量,我就去考察了一家又一家养殖场,同时我也是个“小气”的人,所以我考...

    Java技术江湖
  • laravel使用数据库测试注意事项

    相对于其它测试,数据库测试可以说是相对复杂繁琐的,因为数据库测试不可避免地会涉及到数据库的增删改查,而这些操作会影响数据库的数据,而我们测试最忌讳的就是修改了数...

    砸漏
  • 企业使用数据库的12种姿势

    数据库,作为IT系统的基础类软件,发挥着非常巨大的作用。那么企业在使用数据库时,有什么样的方式可以选择?不同方式又各有其什么特点呢?本文将从使用方式、适用场景、...

    宜信技术学院
  • 企业使用数据库的N种姿势

    数据库,作为IT系统的基础类软件,发挥着非常巨大的作用。那么企业在使用数据库时,可有什么样的方式可以选择?不同方式又各有其什么特点呢?本文将从使用方式、适用场景...

    用户5548425
  • C++ 与 php 的交互 之----- C++ 获取 网页文字内容,获取 php 的 echo 值。

    转载请声明出处! https://cloud.tencent.com/developer/user/1148436/activities       距离上次 ...

    林冠宏-指尖下的幽灵
  • 数据库的使用你可能忽略了这些

    数据库的管理是一个非常专业的事情,对数据库的调优、监控一般是由数据库工程师完成,但是开发人员也经常与数据库打交道,即使是简单的增删改查也是有很多窍门,这里,一起...

    itmifen

扫码关注云+社区

领取腾讯云代金券