`
tianlijia202
  • 浏览: 75253 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

种可以避免数据迁移的分库分表scale-out扩容方式

阅读更多
转自:http://rdc.taobao.com/team/jm/archives/590

一种可以避免数据迁移的分库分表scale-out扩容方式

目前绝大多数应用采取的两种分库分表规则

mod方式
dayofweek系列日期方式(所有星期1的数据在一个库/表,或所有?月份的数据在一个库表)
这两种方式有个本质的特点,就是离散性加周期性。

例如以一个表的主键对3取余数的方式分库或分表:



那么随着数据量的增大,每个表或库的数据量都是各自增长。当一个表或库的数据量增长到了一个极限,要加库或加表的时候,
介于这种分库分表算法的离散性,必需要做数据迁移才能完成。例如从3个扩展到5个的时候:



需要将原先以mod3分类的数据,重新以mod5分类,不可避免的带来数据迁移。每个表的数据都要被重新分配到多个新的表
相似的例子比如从dayofweek分的7个库/表,要扩张为以dayofmonth分的31张库/表,同样需要进行数据迁移。

数据迁移带来的问题是

业务至少要两次发布
要专门写工具来导数据。由于各业务之间的差别,很难做出统一的工具。目前几乎都是每个业务写一套
要解决增量、全量、时间点,数据不一致等问题
如何在数据量扩张到现有库表极限,加库加表时避免数据迁移呢?
通常的数据增长往往是随着时间的推移增长的。随着业务的开展,时间的推移,数据量不断增加。(不随着时间增长的情况,
例如某天突然需要从另一个系统导入大量数据,这种情况完全可以由dba依据现有的分库分表规则来导入,因此不考虑这种问题。)

考虑到数据增长的特点,如果我们以代表时间增长的字段,按递增的范围分库,则可以避免数据迁移
例如,如果id是随着时间推移而增长的全局sequence,则可以以id的范围来分库:(全局sequence可以用tddl现在的方式也可以用ZooKeeper实现)
id在 0–100万在第一个库中,100-200万在第二个中,200-300万在第3个中 (用M代表百万数据)



或者以时间字段为例,比如一个字段表示记录的创建时间,以此字段的时间段分库gmt_create_time in range



这样的方式下,在数据量再增加达到前几个库/表的上限时,则继续水平增加库表,原先的数据就不需要迁移了
但是这样的方式会带来一个热点问题:当前的数据量达到某个库表的范围时,所有的插入操作,都集中在这个库/表了。

所以在满足基本业务功能的前提下,分库分表方案应该尽量避免的两个问题:

1. 数据迁移
2. 热点

如何既能避免数据迁移又能避免插入更新的热点问题呢?
结合离散分库/分表和连续分库/分表的优点,如果一定要写热点和新数据均匀分配在每个库,同时又保证易于水平扩展,可以考虑这样的模式:

【水平扩展scale-out方案模式一】
阶段一:一个库DB0之内分4个表,id%4 :



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



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



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

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



这样3个阶段的扩展方案中,每次次扩容只需要做一次停机发布,不需要做数据迁移。停机发布中只需要做整表搬迁。
这个相对于每个表中的数据重新分配来说,不管是开发做,还是DBA做都会简单很多。

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

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

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

即逻辑上始终保持4库4表,每个表一个库。这种做法也是目前店铺线图片空间采用的做法。

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

【水平扩展scale-out方案模式二】
阶段一:一个数据库,两个表,rule0 = id % 2

分库规则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);
  }
随着时间的推移,当第一阶段的t0/t1,第二阶段的t0_1/t1_1逐渐成为历史数据,不再使用时,可以直接truncate掉整个表。省去了历史数据迁移的麻烦。

上述3个阶段的分库分表规则在TDDL2.x中已经全部支持,具体请咨询TDDL团队。

【水平扩展scale-out方案模式三】
非倍数扩展:如果从上文的阶段二到阶段三不希望一下增加两个库呢?尝试如下方案:

迁移前:


新增库为DB2,t0、t1都放在DB0,
t0_1整表迁移到DB1
t1_1整表迁移到DB2

迁移后:


这时DB0退化为旧数据的读库和更新库。新增数据的热点均匀分布在DB1和DB2
4无法整除3,因此如果从4表2库扩展到3个库,不做行级别的迁移而又保证热点均匀分布看似无法完成。

当然如果不限制每库只有两个表,也可以如下实现:



小于10M的t0和t1都放到DB0,以mod2分为两个表,原数据不变
10M-20M的,以mod2分为两个表t0_1、t1_1,原数据不变,分别搬迁到DB1,和DB2
20M以上的以mod3平均分配到3个DB库的t_0、t_2、t_3表中
这样DB1包含最老的两个表,和最新的1/3数据。DB1和DB2都分表包含次新的两个旧表t0_1、t1_1和最新的1/3数据。
新旧数据读写都可达到均匀分布。

总而言之:
两种规则映射(函数):

离散映射:如mod或dayofweek, 这种类型的映射能够很好的解决热点问题,但带来了数据迁移和历史数据问题。
连续映射;如按id或gmt_create_time的连续范围做映射。这种类型的映射可以避免数据迁移,但又带来热点问题。
离散映射和连续映射这两种相辅相成的映射规则,正好解决热点和迁移这一对相互矛盾的问题。
我们之前只运用了离散映射,引入连续映射规则后,两者结合,精心设计,
应该可以设计出满足避免热点和减少迁移之间任意权衡取舍的规则。

基于以上考量,分库分表规则的设计和配置,长远说来必须满足以下要求

可以动态推送修改
规则可以分层级叠加,旧规则可以在新规则下继续使用,新规则是旧规则在更宽尺度上的拓展,以此支持新旧规则的兼容,避免数据迁移
用mod方式时,最好选2的指数级倍分库分表,这样方便以后切割。
分享到:
评论

相关推荐

    2024年测风激光雷达行业分析报告.pptx

    行业报告

    mapreduce综合应用案例 - 招聘数据清洗.docx

    招聘数据清洗是一个典型的大数据处理任务,可以通过MapReduce来实现高效且可扩展的数据清洗过程。下面是一个简单的招聘数据清洗的MapReduce应用案例: 输入数据准备:将招聘数据集划分为若干个块,每个块包含多条记录。 Map阶段: 每个Map任务负责处理一个数据块。 Map函数解析输入记录,提取关键字段,如职位名称、公司名称、薪资等。 对于每条记录,如果关键字段缺失或格式不正确,可以忽略或标记为错误数据。 输出中间键值对,其中键为职位名称,值为包含相关信息的自定义对象或字符串。 Reduce阶段: 所有Map任务的输出会根据职位名称进行分组。 Reduce函数对每个职位名称的数据进行处理,可以进行去重、合并、计数等操作。 根据需求,可以进一步筛选、过滤数据,如只保留特定行业或薪资范围的职位。 输出最终结果,可以保存为文件或存储到数据库中。 通过以上MapReduce应用,可以高效地清洗大规模的招聘数据,并提供结构化、准确的数据用于后续的分析和决策。此外,由于MapReduce具有良好的容错性和可扩展性,可以处理海量数据并在分布式环境中实现高性能的数据清洗任务。

    Springboot+vue学生管理系统源码

    Springboot+vue学生管理系统源码 idea导入后端项目,设置好依赖,运行SystemApplication.java 使用vscode或者hbuilderx等工具打开前端项目,运行即可 另外前端vue页打包成静态资源放到后端里面了,即便不运行前端vue项目也是可以的 如果需要修改,则使用npm run bulid重新打包,生成的前端代码,放到后端代码的resources的static目录下

    学习数据结构和算法.zip

    大学生数据结构学习笔记和资料大全!

    机器视觉课程概要及重点分析

    适用于大学生的课程设计,报告等,包含图像处理等许多基础知识

    xp系统安装.net框架包括镜像和.net4.0安装包

    xp系统安装.net框架包括镜像和.net4.0安装包

    Java项目-基于Springboot+Vue的铁路订票管理系统的设计与实现(源码+万字LW+部署视频+代码讲解视频+全套软件)

    【基于Springboot+Vue的铁路订票管理系统的设计与实现】高分通过项目,已获导师指导。 本项目是一套基于Springboot+Vue的铁路订票管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。也可作为课程设计、期末大作业 包含:项目源码、数据库脚本、开发说明文档、部署视频、代码讲解视频、全套软件等,该项目可以直接作为毕设使用。 项目都经过严格调试,确保可以运行! 项目详情: https://blog.csdn.net/u011832806/article/details/139635957

    GoogleCloud2024年数据和AI趋势报告+生成式AI+数据治理

    1. 生成式 AI 的影响 生成式 AI 革命及其对各行各业的颠覆性影响。 数据作为 AI 核心的重要性,以及如何利用数据激活生成式 AI。 企业成功利用生成式 AI 的关键要素:数据质量、安全、负责任的数据使用原则。 2. 五大趋势概览 趋势 1:生成式 AI 将在组织内加快数据洞见的交付 数据洞见民主化趋势,非技术用户使用生成式 AI 获取洞见。 现代 BI 工具与生成式 AI 的结合,提升数据素养和决策能力。 趋势 2:数据和 AI 的角色将变得模糊 数据角色界限模糊,数据分析师和数据科学家职责交叉。 生成式 AI 弥合技能差距,提升数据团队效率。 趋势 3:强有力的数据治理机制是实现 AI 创新的关键 暗数据问题,数据质量和治理的重要性。 趋势 4:运营数据将激发生成式 AI 的潜力 企业对与生成式 AI 集成的数据库的期望。 矢量搜索和矢量数据库在生成式 AI 中的应用。 趋势 5:2024 将是数据平台改造突飞猛进的一年 组织对旧数据库 AI 支持状况的不满意。 旧数据库的问题:技术落后、用户体验不佳、成本高昂。 3. Google Cloud 的帮助

    unity贪吃蛇大作战项目游戏源代码

    unity贪吃蛇大作战项目游戏源代码,源码演示视频地址:https://www.bilibili.com/video/BV1u1421C7cn/;unity贪吃蛇大作战项目游戏源代码,源码演示视频地址:https://www.bilibili.com/video/BV1u1421C7cn/;unity贪吃蛇大作战项目游戏源代码,源码演示视频地址:https://www.bilibili.com/video/BV1u1421C7cn/;unity贪吃蛇大作战项目游戏源代码,源码演示视频地址:https://www.bilibili.com/video/BV1u1421C7cn/;unity贪吃蛇大作战项目游戏源代码,源码演示视频地址:https://www.bilibili.com/video/BV1u1421C7cn/;unity贪吃蛇大作战项目游戏源代码,源码演示视频地址:https://www.bilibili.com/video/BV1u1421C7cn/;

    数据库管理工具:dbeaver-ce-23.0.1-linux.gtk.aarch64-nojdk.tar.gz

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    python的字符界面程序

    这个文件资源包含一系列用 Python 编写的字符界面程序,每个程序文件对应一个独立的功能模块。 这些程序的编写难度从简单到中等不等,大多数程序实现单一功能,适合初学者和中级 Python 开发者编写和学习。它们的应用场景涵盖教育、数据处理、安全监控和用户界面美化等多个领域。这些程序可以作为学习 Python 基础知识和进阶技能的良好示例,也可以作为实际项目的基础模块进行扩展和应用。 九九乘法表:生成并打印九九乘法表,用于数学学习和练习。 斐波那契数列:生成并打印指定长度的斐波那契数列。 文本分词:对输入的文本进行分词处理,常用于自然语言处理任务。 简单密码校验 :对输入的密码进行基本校验,如长度、字符类型等。 简单密码加密:对输入的密码进行简单加密,如使用哈希算法。 打印彩色字符:在终端中打印带有颜色的字符,用于美化输出。 读取大文本文件;读取并处理大文本文件。 监测安全指标:监测系统或应用的安全指标,并输出相应报告。 显示进度条:在终端中显示操作进度条,提供用户反馈。 命令行程序:实现一个简单的命令行工具,接收用户输入并执行相应操作。

    MATRIX KEY 4*4触摸按键模块

    VK36N16I芯片 STM32F103驱动代码

    JAVA毕业设计之基于SpringBoot+Vue的乡政府管理系统(springboot+mysql)完整源码.zip

    基于SpringBoot+Vue的乡政府管理系统是一个现代化的Web应用程序,它使用了当今流行的技术栈来实现高效的后端服务和交互式的前端界面。以下是该系统使用的主要技术和功能介绍: 技术栈: SpringBoot:一个快速开发的框架,用于构建独立的、生产级别的Spring应用程序。它简化了配置过程,提供了大量默认配置,使得项目启动和运行更加便捷。 Vue.js:一个渐进式的JavaScript框架,用于构建用户界面。它易于上手,同时能够与其它库或已有项目整合,为开发者提供灵活性。 MySQL:一个关系型数据库管理系统,用于存储和管理数据。它支持标准的SQL语言,并且具有高性能、稳定性和易用性的特点。 功能模块: 用户管理:包括用户注册、登录、权限控制等功能,确保系统的安全性和用户的身份验证。 信息发布:允许管理员发布公告、通知等信息,以便及时传达给相关人员。 文件管理:提供文件上传、下载、删除等功能,方便管理和共享文档资料。 数据统计:对系统中的数据进行统计和分析,生成报表和图表,帮助决策者做出明智的决策。 任务管理:支持任务的创建、分配、跟踪和完成情况的记录,提高工作的效率和协作性。 留言板:提供一个平台供用户之间进行交流和讨论,促进信息共享和问题解决。 日志记录:记录系统的运行情况和用户的操作行为,便于问题的排查和安全审计。 数据备份与恢复:定期备份数据并能够在需要时进行恢复,保障数据的完整性和可靠性。 系统设置:允许管理员对系统的各项参数进行配置和管理,以满足不同场景的需求。 以上是该乡政府管理系统的主要技术和功能介绍。通过这些技术和功能的整合,该系统能够提供高效、安全、便捷的管理服务,满足乡政府的日常工作需求。

    EOM_Drive_Top.v

    EOM_Drive_Top.v

    数据库管理工具:dbeaver-ce-23.0.4-amd64.deb

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    在C语言面试资格的一些建议

    在C语言面试资格的一些建议

    数据库管理工具:dbeaver-ce-23.1.0-amd64.deb

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    D637真有效值测量电路——Multisim仿真.zip

    D637真有效值测量电路——Multisim仿真

    数据库管理工具:dbeaver-ce-23.2.1-amd64.deb

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    Java项目-基于SSM+JSP的校园外卖配送系统的设计与实现(源码+万字LW+部署视频+代码讲解视频+全套软件)

    【基于SSM+JSP的校园外卖配送系统的设计与实现】高分通过项目,已获导师指导。 本项目是一套基于SSM+JSP的校园外卖配送系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。也可作为课程设计、期末大作业 包含:项目源码、数据库脚本、开发说明文档、部署视频、代码讲解视频、全套软件等,该项目可以直接作为毕设使用。 项目都经过严格调试,确保可以运行! 项目详情: https://blog.csdn.net/u011832806/article/details/139523404

Global site tag (gtag.js) - Google Analytics