精华内容
下载资源
问答
  • mysql分库分表数据迁移
    2021-02-04 00:59:53

    1.停机迁移方案

    这是最简单的也是最low的迁移方案了,如果系统就算短期停机也没有关系或者造不成多大的影响,可以选用此方案。

    首先停掉机器,将系统全都停掉,不要再有新的数据进来,然后使用之前写好的程序,连接旧的数据库,将旧数据库里面的数据读出来,然后通过数据分发中间件写到分库分好的数据里面去。然后修改系统是数据库连接、分库分表配置,然后重新上线。

    2.双写不停机迁移方案

    双写迁移方案的核心在双写,首先要修改系统所有需要写库的地方,将虽有对数据的写操作不但要写入就库,也要同时写入新库。

    然后使用写好的数据迁移程序,去读取老数据库的数据写入到新的数据库里面去,写的时候要根据数据的最后更新时间去判断数据,如果读出来的数据新库没有直接写入,如果新库也有,查看最后更新时间,旧库的新就覆盖写入,如果新库的新就放弃这条数据。

    导完一轮数据之后,有可能数据还是存在不一致,那么就写个程序做一轮校验,对比老库和新库的每条数据,如果存在不一样的,就针对这些不一样的,再次去进行数据同步。反复循环,直到数据完全一致。

    接着当数据完全一致了,就ok了,基于仅仅使用分库分表的最新代码,重新部署一次,不就仅仅基于分库分表在操作了么,还没有几个小时的停机时间,很稳。所以现在基本玩儿数据迁移之类的,都是这么干了。

    更多相关内容
  • 一、背景MySQL作为最流行的关系型数据库产品之一,当数据规模增大遭遇性能瓶颈时,最容易想到的解决方案就是分库分表。无论是进行水平拆分还是垂直拆分,第一步必然需要数据迁移与同步。由此可以衍生出一系列数据...

    一、背景

    MySQL作为最流行的关系型数据库产品之一,当数据规模增大遭遇性能瓶颈时,最容易想到的解决方案就是分库分表。无论是进行水平拆分还是垂直拆分,第一步必然需要数据迁移与同步。由此可以衍生出一系列数据迁移过程中的需求:

    原本一张表迁移到单库多表(或多库多表),这是最基本的需求;

    原本单库多表(或多库多表)迁移到新的多库多表(因表设计不合理、数据规模增大等原因导致需要再次分库分表)

    新表与旧表的表结构可能不一致,如:类型表更(自增主键id由int改为bigint)、字段数量不一致(删减、增加)、字段名称变更等

    字段映射,如:旧表中的多个字段映射为新表的一个字段,或旧表中的一个字段映射为新表的多个字段

    增量数据的实时同步,以及当涉及表结构转换时增量部分(binlog)如何方便地实现同样的转换

    如何支持垂直拆分的数据迁移

    MySQL到NewSQL的迁移(如:TiDB、CockroachDB)

    异构数据源的实时迁移,如:MySQL到HBase、MongoDB(关于异构数据源的实时同步设计不在本文内容范围,后续将专题介绍)

    迁移前后的数据一致性校验

    二、设计

    为满足以上需求,下面将从全量迁移和增量同步两部分来说明MySQL数据迁移同步工具的设计与实现。

    2ecd3bb3ebfc2596593c714ba740a72f.png

    2.1 全量迁移

    mysqldump是MySQL官方自带的数据备份工具,也可以用于数据迁移,但不足之处是单线程处理,迁移大表时速度极慢,并且不支持写入分库分表。因此开源社区还开发了一个多线程的类似工具mydumper,性能有不少提升,但同样不支持写入分库分表,也不支持字段的转换。

    接下来介绍下快速分片并行读取MySQL表数据的做法:

    自动查找表的主键pk;

    查询主键的最大值及最小值:max(pk),min(pk);

    对主键范围分片,每个分片跨度1万(即最多读取1万行数据),由此即可将整张表的查询分成多个查询分片:

    第1个分片查询条件为pk >= min(pk) AND pk < min(pk)+10000

    第2个分片查询条件为pk>= min(pk)+10000 AND pk < min(pk)+20000

    第3个分片查询条件为pk >= min(pk)+20000 AND pk < min(pk)+30000

    以此类推。

    以上分片查询除了可以并行读取之外,另外一个优势是失败可恢复,某个分片查询失败并不影响整体查询的进度,只需失败重试即可。当然也可以将所有分片持久化,即使程序异常退出,重启后也可以恢复,避免重新查询全表数据。

    2.2 增量同步

    增量数据的读取基于MySQL的binlog主从复制。在全量迁移之前首先获取当前MySQL的位点信息(FileName、Position),以便全量数据迁移完成之后从该位点继续重放binlog。

    三、实现

    3.1 全量迁移

    2c3a199b02e238bbbda626b23a373755.png

    基于RxJava的观察者(或生产者消费者)模式实现链式最大化并行处理:多张表并行生成查询分片(Query Split),然后由Source并行执行查询分片从MySQL中读取数据,然后统一由Sink Selector根据分库分表的sharding字段及规则计算出每行数据所属的slot(即应该写入到哪张分表),当一个slot中的数据积累到一个batch size时会生成一个插入分片(Insert Split),最终由Sink并行地批量写入对应的目标表中。

    为了避免累积的数据过多造成GC压力,slot超过一定时间后即使没有累积到一个batch size也会生成Insert Split分发给Sink执行写入。此外还要考虑另外一个问题:当生产者生产过快导致消费者来不及处理时,将会导致事件堆积,严重时还会OOM,即所谓的背压(Backpressure)。幸好RxJava作为一个成熟的Reactive框架已经对背压处理有很好的支持,这也是为什么要基于RxJava来实现的重要原因之一。

    3.2 增量同步

    87401ac238bea05ca316d1f402414d34.png

    binlog的抽取使用了开源的Java类库mysql-binlog-connector-java,与Canal相比更加轻量,源码清晰易懂,不依赖其他第三方jar包,也没有那么多不需要的繁杂功能。

    为了实现对binlog的字段转换,采用了Apache开源的SQL引擎calcite来实现:将binlog的每行数据根据原表的表结构映射为一张内存表,然后由calcite执行SQL转换后输出结果。(PS:calcite当前已被多个开源项目采用,Hive用calcite优化查询,Flink的Streaming SQL基于calcite实现,Kylin的查询引擎也采用calcite)

    展开全文
  • MySQL分库分表数据迁移

                                              分库分表

    一.项目背景

    1. 现有业务数据架构

    2.现有资源配置

     

    3.现有业务TPS + QPS统计

    A:TPS :峰值:0.27K   

    B:QPS:峰值:6K

    4. 现有业务量统计

    日增

    日增索引占用空间

    年增

    备注

    单量

    60W

    60 * 365=21900W

    主表磁盘占用

    0.6 G

    5G

    0.6 * 365 = 200G

    二.现有业务遗留问题

    1.原订单主表的主键id 参与了第三方系统的业务

    A:id 在自身业务系统中没有业务属性,但该值参与了第三方系统的业务并作为了唯一标识。

       这为后续数据迁移带来影响,保证现有业务平滑过度。

     

       解决方案:生成全局唯一的业务id

    B:现有订单库中用户id使用Integer类型,长度过短,该值也参与了第三方系统的业务中。

       数据迁移后该值需要升为Long ,迁移导致的类型转换问题。

    C:系统底层现有订单库表读权限开放给了第三方业务系统,迁移后改查询权限关闭,订单需提供API暴露给第三方。

       问题:对接第三方查询逻辑

    三.迁移数据库资源服务架构设计

    1.数据库服务配置

    节点

    cpu

    mem

    disk

    备注

    RW

    8c

    32g

    10T

    XXXX * 服务器数量=XXXXX元/每月

    RO

    8c

    32g

    10T

    2.

     

    3. 现有订单数据库负载信息:

    cpu利用率

    磁盘使用

    接收客户端流量

    发送客户端 流量

    QPS

    TPS

    thread_running

    平均5%

    3608.282G

    平均2MB/s

    平均10MB/s

    最大7000/s 

    平均5000/s

    最大384/s 平均 250/s

    6

    4.分库分表策略

    4个实例 * 每个实例4个库 * 每个库32张表

    4 * 4 * 32 = 512 张表

    4.1. 客户端查询的路由键-userId 

    A:先根据userId 与4 取模,定位数据库

        再根据userID 与32 取模,定位表number 

    B:每个实例

    C:分库分表仅适用于带有路由键userID的客户端查询,除此之外的聚合查询( 基于其他业务维度的查询,跨时间的分页查询)均通过nosql-MongoDB的存储介质进行查询。

    四.分库分表迁移步骤

    1.数据多写

    A:写原老库 ,读原老库

    B:老库写成功后,同步写新分库;MQ同步给nosql 作为聚合查询数据基础

    2.老数据迁移到新库

    A:先从新库中的N张表中筛选出最早生成的订单ID,然后在老库中把该订单之前的所有数据同步到新库表。

    B:在迁移老数据过程中,新老库都会发生写操作,对于仍未写成功到新库的订单会写失败,所以需要记录在同步老数据过程中所有发生过的写操作,每条流水数据都需要保留时间戳,最后取最新时间戳的订单同步到新库中。

    C:迁移过程中写库操作有可能失败,同时也要记录失败的数据落盘存储,并进行数据补偿操作。为最大限度保证落盘成功尽量使用flume 持久化到文件中,当然写到MySQL也可以但仍要考虑失败的情况。

    D:校验新老库数据库完整性,准确性。

    3.读老库迁移到读新库

    A:新老数据对齐后则可以切换读操作的数据源了

    4. 写老库为主变成读写新库

    展开全文
  • 如果你想把上游多个 MySQL 数据库实例合并迁移到下游的同一个 TiDB 数据库中,且数据量较小,你可以...本文以一个简单的场景为例,示例中的两个数据源 MySQL 实例的分库分表数据迁移至下游 TiDB 集群。示意图如下。数

    如果你想把上游多个 MySQL 数据库实例合并迁移到下游的同一个 TiDB 数据库中,且数据量较小,你可以使用 DM 工具进行分库分表的合并迁移。本文所称“小数据量”通常指 TiB 级别以下。本文举例介绍了合并迁移的操作步骤、注意事项、故障排查等。本文档适用于:

    • TiB 级以内的分库分表数据合并迁移
    • 基于 MySQL binlog 的增量、持续分库分表合并迁移

    若要迁移分表总和 1 TiB 以上的数据,则 DM 工具耗时较长,可参考从大数据量分库分表 MySQL 合并迁移数据到 TiDB

    本文以一个简单的场景为例,示例中的两个数据源 MySQL 实例的分库和分表数据迁移至下游 TiDB 集群。示意图如下。

    数据源 MySQL 实例 1 和 实例 2 均使用以下表结构,计划将 store_01 和 store_02 中 sale 开头的表合并导入下游 store.sale 表

    SchemaTables
    store_01sale_01, sale_02
    store_02sale_01, sale_02

    迁移目标库的结构如下:

    SchemaTables
    storesale

    前提条件

    分表数据冲突检查

    迁移中如果涉及合库合表,来自多张分表的数据可能引发主键或唯一索引的数据冲突。因此在迁移之前,需要检查各分表数据的业务特点。详情请参考跨分表数据在主键或唯一索引冲突处理

    在本示例中:sale_01 和 sale_02 具有相同的表结构如下:

     
    

    CREATE TABLE `sale_01` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `sid` bigint(20) NOT NULL, `pid` bigint(20) NOT NULL, `comment` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `sid` (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1

    其中id列为主键,sid列为分片键,具有全局唯一性。id列具有自增属性,多个分表范围重复会引发数据冲突。sid可以保证全局满足唯一索引,因此可以按照参考去掉自增主键的主键属性中介绍的操作绕过id列。在下游创建sale表时移除id列的唯一键属性

     
    

    CREATE TABLE `sale` ( `id` bigint(20) NOT NULL, `sid` bigint(20) NOT NULL, `pid` bigint(20) NOT NULL, `comment` varchar(255) DEFAULT NULL, INDEX (`id`), UNIQUE KEY `sid` (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1

    第 1 步: 创建数据源

    新建source1.yaml文件, 写入以下内容:

     
    

    # 唯一命名,不可重复。 source-id: "mysql-01" # DM-worker 是否使用全局事务标识符 (GTID) 拉取 binlog。使用前提是上游 MySQL 已开启 GTID 模式。若上游存在主从自动切换,则必须使用 GTID 模式。 enable-gtid: true from: host: "${host}" # 例如:172.16.10.81 user: "root" password: "${password}" # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用 port: 3306

    在终端中执行下面的命令,使用tiup dmctl将数据源配置加载到 DM 集群中:

     
    

    tiup dmctl --master-addr ${advertise-addr} operate-source create source1.yaml

    该命令中的参数描述如下:

    参数描述
    --master-addrdmctl 要连接的集群的任意 DM-master 节点的 {advertise-addr},例如:172.16.10.71:8261
    operate-source create向 DM 集群加载数据源

    重复以上操作直至所有数据源均添加完成。

    第 2 步: 创建迁移任务

    新建task1.yaml文件, 写入以下内容:

     
    

    name: "shard_merge" # 任务模式,可设为 # full:只进行全量数据迁移 # incremental: binlog 实时同步 # all: 全量 + binlog 迁移 task-mode: all # 分库分表合并任务则需要配置 shard-mode。默认使用悲观协调模式 "pessimistic",在深入了解乐观协调模式的原理和使用限制后,也可以设置为乐观协调模式 "optimistic" # 详细信息可参考:https://docs.pingcap.com/zh/tidb/dev/feature-shard-merge/ shard-mode: "pessimistic" meta-schema: "dm_meta" # 将在下游数据库创建 schema 用于存放元数据 ignore-checking-items: ["auto_increment_ID"] # 本示例中上游存在自增主键,因此需要忽略掉该检查项 target-database: host: "${host}" # 例如:192.168.0.1 port: 4000 user: "root" password: "${password}" # 支持但不推荐使用明文密码,建议使用 dmctl encrypt 对明文密码进行加密后使用 mysql-instances: - source-id: "mysql-01" # 数据源 ID,即 source1.yaml 中的 source-id route-rules: ["sale-route-rule"] # 应用于该数据源的 table route 规则 filter-rules: ["store-filter-rule", "sale-filter-rule"] # 应用于该数据源的 binlog event filter 规则 block-allow-list: "log-bak-ignored" # 应用于该数据源的 Block & Allow Lists 规则 - source-id: "mysql-02" route-rules: ["sale-route-rule"] filter-rules: ["store-filter-rule", "sale-filter-rule"] block-allow-list: "log-bak-ignored" # 分表合并配置 routes: sale-route-rule: schema-pattern: "store_*" table-pattern: "sale_*" target-schema: "store" target-table: "sale" # 过滤部分 DDL 事件 filters: sale-filter-rule: schema-pattern: "store_*" table-pattern: "sale_*" events: ["truncate table", "drop table", "delete"] action: Ignore store-filter-rule: schema-pattern: "store_*" events: ["drop database"] action: Ignore # 黑白名单 block-allow-list: log-bak-ignored: do-dbs: ["store_*"]

    以上内容为执行迁移的最小任务配置。关于任务的更多配置项,可以参考DM 任务完整配置文件介绍

    若想了解配置文件中routesfilters等更多用法,请参考:

    第 3 步: 启动任务

    在你启动数据迁移任务之前,建议使用check-task命令检查配置是否符合 DM 的配置要求,以降低后期报错的概率。

     
    

    tiup dmctl --master-addr ${advertise-addr} check-task task.yaml

    使用 tiup dmctl 执行以下命令启动数据迁移任务。

     
    

    tiup dmctl --master-addr ${advertise-addr} start-task task.yaml

    该命令中的参数描述如下:

    参数描述
    --master-addrdmctl 要连接的集群的任意 DM-master 节点的 {advertise-addr},例如:172.16.10.71:8261
    start-task命令用于创建数据迁移任务

    如果任务启动失败,可根据返回结果的提示进行配置变更后执行 start-task task.yaml 命令重新启动任务。遇到问题请参考 故障及处理方法 以及 常见问题

    第 4 步: 查看任务状态

    如需了解 DM 集群中是否存在正在运行的迁移任务及任务状态等信息,可使用tiup dmctl执行query-status命令进行查询:

     
    

    tiup dmctl --master-addr ${advertise-addr} query-status ${task-name}

    关于查询结果的详细解读,请参考查询状态

    第 5 步: 监控任务与查看日志(可选)

    你可以通过 Grafana 或者日志查看迁移任务的历史状态以及各种内部运行指标。

    • 通过 Grafana 查看

      如果使用 TiUP 部署 DM 集群时,正确部署了 Prometheus、Alertmanager 与 Grafana,则使用部署时填写的 IP 及 端口进入 Grafana,选择 DM 的 dashboard 查看 DM 相关监控项。

    • 通过日志查看

      DM 在运行过程中,DM-worker, DM-master 及 dmctl 都会通过日志输出相关信息,其中包含迁移任务的相关信息。各组件的日志目录如下:

      • DM-master 日志目录:通过 DM-master 进程参数--log-file设置。如果使用 TiUP 部署 DM,则日志目录默认位于/dm-deploy/dm-master-8261/log/
      • DM-worker 日志目录:通过 DM-worker 进程参数--log-file设置。如果使用 TiUP 部署 DM,则日志目录默认位于/dm-deploy/dm-worker-8262/log/

       

    展开全文
  • 前奏 因为在分表的时候我们需要知道我们的是...2、最终能通过一定的算法,自动化这些分表迁移数据的工作。 在这里我们来实现 '1' 手动指定, 以下可能比较枯燥都是代码了, 一般只要看主逻辑有一个思路,代码自己玩...
  • 分库分表数据迁移

    千次阅读 2022-03-23 20:31:55
    分库就是将数据库中的数据分散到不同的数据库上。 下面这些操作都涉及到了分库: 你将数据库中的用户表和用户订单表分别放在两个不同的数据库。 由于用户表数据量太大,你对用户表进行了水平切分,然后将切分后的...
  • 分库分表,数据迁移
  • 如果分表数据总规模特别大(例如大于 1 TiB),并且...如果分库分表合并迁移在 1 TiB 以内,请参考从小数据量分库分表 MySQL 合并迁移数据到 TiDB,支持全量和增量且更为简单。使用 TiDB Lightning 快速合并导入的原理
  • 目录一、分库分表后数据如何迁移概述二、停机停服数据迁移的概述三、双写数据迁移的概述 一、分库分表后数据如何迁移概述 针对单库表中的数据我们如何迁移到新的分库分表上,最先想到的方案应该就是发公告停机停服...
  • 概念:分库,就是把数据拆分到不同的 MySQL 库中去分表:在数据量不变的情况下,把数据拆分到同一个库的多张表里面分库分表:数据库数量和表数量都发生变更使用场景为什么进行分库分表分库分表的目的分库分表有...
  • 数据存储演进思路一:单单表 单单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db中的user表中查到。 数据存储演进思路二:单多表 随着用户数量的增加,user表的...
  • 分库分表其实是很常见的操作,单表搞不定当然要多表搞起,有些表已经做了分表操作,业务量上来了发现还需要分更多的表,比如原业务表分了128张表,现在估算需要1024张表,相当于将原业务表继续扩大8倍。那么问题就...
  • MySQL分库分表会带来哪些问题? 分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO、硬件资源、连接数的瓶颈,同时也带来了一些问题。下面将描述这些技术挑战以及对应的解决思路。 分库分表能有效的...
  • 简单介绍了分库分表的概念以及相关问题。
  • 如何实现MYSQL分库分表

    千次阅读 2022-07-07 20:37:46
    如何实现MYSQL分库分表
  • Python乱炖推荐搜索后浪动森玩家送书数据分析一、数据库瓶颈不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库...
  • 实际应用中MySQL分库分表实践总结原理 互联网系统需要处理大量用户的请求。比如微信日活用户破10亿,海量的用户每天产生海量的数量;美团外卖,每天都是几千万的订单,那这些系统的用户表、订单表、交易流...
  • 由于业务需要,需要对Mysql数据库进行分库分表,故而最近一直在整理分库分表的相关知识,现手上的工作也告一段落了,抽空将自己最近的学习结果转化为博文,分享给大家,本博文打算做成一个系列的,首先是分库分表的...
  • MySQL分库分表原理

    2021-08-26 23:09:58
    文章目录1、为什么要分库分表02、分库分表03、不停机分库分表数据迁移4、分库分表实现 1、为什么要分库分表 分库分表目的:解决高并发,和数据量大的问题。 1、高并发情况下,会造成IO读写频繁,自然就会造成读写...
  • 中大型项目中,一旦遇到数据量比较大,小伙伴应该都知道就应该对数据进行拆分了。有垂直和水平两种。 垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。...当然也可以分库,再分表
  • MySQL分库分表对于许多的开发者来讲这个只是听说地自己从来没做过MySQL分库分表的安案了其实小编也只做过mysql分表的例子没做过分库的案例了,今天我们来看一篇关于MySQL分库分表的例子吧,具体如下所示。MySQL分库...
  • 从容量、性能、可用性和运维成本上难以满足海量数据的场景。 性能方面,数据量超过一定阈值,B+树索引慎独增加导致磁盘访问的IO次数增加,进而导致查询性能的下降。 容量方面,单机能存储的数据量有限 可用性方面,...
  • MYSQL分库分表

    千次阅读 2022-03-28 00:36:37
    分库分表 关系型数据库本身⽐较容易成为系统瓶颈,单机存储容量、连接数、处理能⼒都有限。当单表的数据量 达到2000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严 重。此时就要...
  • Mysql分库分表

    千次阅读 2021-01-26 23:03:57
    一、数据库瓶颈不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库...分库和垂直分表。第二种:网络IO瓶颈,请求...
  • 超详细的mysql分库分表方案

    千次阅读 多人点赞 2020-12-07 17:39:04
    今天就跟大家讨论下那些年MySQL使用过的分表分库的方案,分表分库后的问题以及解决方案,希望对您有新的收获哦。 MySQL表大小限制** ** MySQL一般安装部署在Linux操作系统上(例如CentOS 7.4),默认都是InnoDB存储...
  • 5 MySQL分库分表动态扩容缩容 6 Mysql读写分离 7 MySQL分库分表id主键处理 8Mysql集群部署实现主从复制读写分离分表分库 1 问题分析: 1.1 背景 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,860
精华内容 5,944
关键字:

mysql分库分表数据迁移

mysql 订阅