21世纪了还愚公移山?数据库这么迁移更稳定!

背景

在系统的快速迭代过程中,业务系统往往部署在同一个物理库,没有做核心数据和非核心数据的物理隔离。随着数据量的扩大这种情况会带来稳定性的风险,如库的慢sql,磁盘,IO等等都会相互整体影响,从而影响核心系统的业务稳定性,因此需要将核心业务的业务表从原有库里抽取出来,单独到新库里。而核心数据的迁移,涉及到的一个关键难点:如何平稳及用户无感知的迁移数据,本文将结合闲鱼商品库迁移实践,向大家展示如何解决这个难题的.

闲鱼商品数据现状

闲鱼商品数据量XX亿级别以上,采用分表分库和读写分离的MYSQL数据库集群来支撑线上查询服务,如下图,通过TDDL[1]数据库中间件进行高效统一管理。可能有些同学会对分表分库相关概念不了解,这里先简单做些介绍。

01分表分库原理

本质是数据库的水平拆分问题,把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题,下图描述分表分库的核心原理:

当然分表分库也有负面影响,就是表结构变更及相关管理相比单表麻烦,有一定风险,具体如何决择,还是要根据实际情况来分析。

02分表分库下全局Sequence生成

分表分库解决在线服务容量和性能问题,但是也带来使用上的复杂度提升。灵活的配置路由规则和路由数据并提供简单易用的封装都是要考虑的,以便业务对此无感知。阿里开源中间件产品TDDL提供了解决方案,对应阿里云上产品为:DRDS[2]。

TDDL关键原理不多做介绍,但是在数据库迁移过程中主键冲突风险是故障重要风险点,这里简要介绍下TDDL的全局唯一主键生成原理。

如上图,TDDL Sequence是基于数据库更新+内存分配:每次操作批量分配id,分配id的数量就是sequence的内步长,而原有id值就加上外部长值,后续的分配直接就在内存里拿,这样的优势:简单高效 缺点:无法保证自增顺序。

另外数据迁移过程中,在新库中,为了保证跟原数据库主键非冲突,需要设置一个跃迁比较大的主键,防止出现两个库中的主键冲突,这是后续迁移中要注意的关键点之一。

数据迁移方案

通过前文的简单介绍,大家对闲鱼商品库现状有了初步了解,下面将给大家介绍一下闲鱼是如何做到稳定迁移商品库的。

01核心思路

数据迁移核心思路抽象起来其实很简单,即如何稳定平滑迁移数据,如下图所示:

但围绕这个过程细化下去,我们会遇到不少问题,如:
1、数据我们该如何迁移,是一次性?还是分阶段?
2、如何校验数据迁移过程的正确性?
3、我们业务改造有问题怎么办?如何尽早发现?如何回滚?
4、我们的新库性能如何?

带着这些问题,我们进一下细化梳理迁移方案。

02实现方案

如上图所示,整个方案分为几个部份:

1、系统改造,包括SQL改造,双写开关,新库sequence创建。

SQL改造:加载两套TDDL数据源,一套是给老库的,一套是给新库的,并且生成两套mybatis sql 模板。
双写开关:设置好写新库,写老库的开关,用于线上迁移过程中双写过程及遇到问题及时回滚。
sequence创建:迁移sequence表时,需要抬升新库的sequence表中的值,用于防止主键冲突,并且需要按照主键消耗量评估一个安全值,这是非常重要的一个细节,再次强调一下。

2、稳定性保障,迁库是大事,改造过程中,稳定性重中之重,主要有系统压测,线上流量回放,故障演练。

系统压测:主要针对新库进行性能测,防止新库有意外情况。
线上流量回放:Edsger W. Dijkstra说过如果调试程序是一种标准的可以铲除BUG的流程,那么,编程就是把他们放进来的流程。通过引入线上数据在测试环境回放,可以尽可能的发现问题,保证改造后的稳定性。
故障演练:通过注入一些人为故障,如写新库失败,新库逻辑有问题,及时的演练回滚策略。

3、数据迁移,主要利用阿里云数据传输服务DTS[3]的数据迁移能力,涉及到全量迁移、增量迁移、一致性校验及反向任务。

全量迁移:数据迁移首要目标如何将历史全量数据迁移到新库中,我们的做法是指定一个时间点,再根据这个时间点查找每张源表的最大及最小id,然后分别批量导到目标库中,如图:

*整个过程都是查询在线库的备库,因此不影响在线业务的数据库服务。

增量迁移:由于迁移过程中业务服务一直运行,因此全量迁移完全成,并且要将全量时间点后的数据追回来,这里核心原理是同步全量时间位点后binlog日志数据来保证数据一致性,需要注意的是增量时间需要前移一小断时间(如5分钟),其主要原因是全量迁移启动的那刻会有时间差,需要增量前移来保证数据最终一致性,如下图:

一致性校验:通过全量及增量的迁移后,此时源库跟目标的数据理论上是一致的,但实际上应用在经过功能测试,线上流量回放等阶段,数据在这个过程中有可能会现不一致的情况,因此正式上线前,需要做数据一致性校验,其原理是分批查询源表(跟全量迁移的查询方式类似),再跟目标库进行比对,如图所示:

反向任务:迁移到新库后,会有一线离线业务对老库还有依赖,需要建立从新库到老库的回流任务,原理跟增量迁移一样,只是变更一下原库及目标库。

03迁库流程

到这里大家应该对迁库所涉及到点比较清楚了,但还有一个非常重要的事,即梳理整个迁库步骤非常关键,通常会有两种方案。

方案一:


1、DTS数据追平,即全量同步完成,开启增量同步,并且延迟在秒级以内。
2、上线前校验,主要有线上流量回放、压测、一致性校验,故障演练。
3、线上开双写,线上同时写新库及老库,这时需要关闭增量同步任务,防止无效覆盖。
4、线上校验,执行预先准备的测试脚本并结合一致性校验工具,同时将读流量慢慢切到新库,验证双写逻辑。
5、切换数据源,关闭双写并正式写入新库。
6、创建反向任务,数据回流老库。

方案二:

1、DTS数据追平,即全量同步完成,开启增量同步,并且延迟在秒级以内。
2、上线前校验,主要有线上流量回放、压测、一致性校验,故障演练。
3、线上切开关,写新库, 同时需要关闭增量同步任务,防止无效覆盖。
4、创建反向任务,数据回流老库。

方案优缺点对比:

 

总结起来方案1迁移流程相对复杂,对迁移的控制力度更细,适合业务复杂,底层改造比较多,想精细化控制迁移步骤的场景,方案2迁移相对简单,过程快速,适合业务流程相对简单,可控,想快速切换的场景,具体选选择哪个方案,同学们可以根据自身的业务情况做选择。

这里考虑到闲鱼商品业务复杂,底层改造较多,从稳定性的角度考虑,最终选择方案1。

方案1,最关键的是3、4、5步骤,因此需要预先做好回滚计划。

04回滚方案

回滚方案总原则是不丢数据。最有可能的发生点是双写期间新库出问题,导致线上服务异常,这时只要立即关闭写新库即可,另外就是切到新库后,新库出问题了(如性能问题),可以立即切回到老库,并通过反向任务,保持数据一致性,最后若没启用分布式事务,双写的时间越短越好,有可能会有数据不一致情况。

小结

通过周密的迁移方案设计,以及DTS强大的数据迁移工具的能力,闲鱼商品库顺利完成XX亿在线数据库服务迁移,独立的物理部署显著提升商品库在线服务的稳定性。然而不同业务系统的数据库情况可能会有差异,如单库向多库迁移,单表向多表迁移等,不过整体方案大致类似,希望本文迁库实践方案能给大家提供一个可行的参考。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 创建表空间、用户、权限_(plsql)

背景:企业内部oracle数据库日常oracle表空间、用户、权限操作 文章目录1. 使用dba用户登录plsql2. 创建表空间3. 创建用户4. 赋予用户权限5. 验证6. 完整脚本1. 使用dba用户登录plsql 2. 创建表空间 -- 创建表空间设置表空间大小 CREATE TABLESPACE fisknow DATAFI…

2019五个最棒的机器学习课程

凭借强大的统计学基础,机器学习正在成为最有趣,节奏最快的计算机科学领域之一,目前已经有无穷无尽的行业和应用正在使用机器学习使它们更高效和智能。 聊天机器人、垃圾邮件过滤、广告投放、搜索引擎和欺诈检测是机器学习模型正在实际应用于…

“天河二号”总工程师杜云飞谈星光超算应用平台设计

整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】12 月 21-22 日,OpenI/O 启智开发者大会在深圳召开。在大会上, 国家超级计算广州中心总工程师、“天河二号”总工程师杜云飞发表了题为《星光超算应用平台》的主题报告&…

蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库

什么是 SOFAJRaft? SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。 使用 SOFAJRaft 你可以专注于自己的业务领域,由 SOFAJRaft 负责处理所有与 Raft 相关的技…

如何在mysql查询结果集中得到记录行号_获取MySQL查询结果集中记录行号的方法...

如果需要在查询语句返回的列中包括一列以指示整个结果集中记录的行号,则ISO SQL: 2003标准建议的方法是提供ROW_NUMBER()/ RANK()函数. Oracle可以使用标准方法(版本8i或更高版本)或非标准ROWNUM. MS SQL Server在2005版中提供了ROW_NUMBER()函数. 但是在MySQL中似乎…

开发者必看!探秘阿里云Hi购季开发者分会场:海量学习资源0元起!

2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段、3月04日-3月16日的新购满返5折抢购阶段、3月16日-3月31日的续费抽豪礼5折抢购阶段。 活动核心亮点:…

疫情严重,潜伏期也有传染性?科技公司在行动

整理 | 阿司匹林出品 | CSDN云计算新型冠状病毒的感染人数仍在不断增加。根据1月26日的最新数据,全国新型冠状病毒感染的肺炎确诊2005例,疑似2684例,死亡56例。据央视报道,国家卫生健康委员会主任马晓伟在国新办新闻发布会上表示&…

python方法定义..._解析Python类中的方法定义

最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客、文章研究到底是怎么一回事。因为有的文章所陈述与我在python3.5版本实际实验中有些出入,所以经过实践后总结出以下结论。对于Python类中,方法的定义…

阿里巴巴复杂搜索系统的可靠性优化之路

背景 搜索引擎是电商平台成交链路的核心环节,搜索引擎的高可用直接影响成交效率。闲鱼搜索引擎作为闲鱼关键系统,复杂度和系统体量都非常高,再加上闲鱼所有导购场景都依靠搜索赋能,搜索服务的稳定可靠成为了闲鱼大部分业务场景可…

Kubernetes 将何去何从?

戳蓝字“CSDN云计算”关注我们哦!作者 | Kevin Casey译者 | 弯月责编 | 唐小引封图 | CSDN 付费自图虫创意出品 | CSDN 云计算(ID:CSDNcloud)【导读】随着越来越多的人开始使用 Kubernetes,IT 领导者对新的一年有哪些期…

活体检测很复杂?仅使用opencv就能实现!(附源码)

什么是活体检测,为什么需要它? 随着时代的发展,人脸识别系统的应用也正变得比以往任何时候都更加普遍。从智能手机上的人脸识别解锁、到人脸识别打卡、门禁系统等,人脸识别系统正在各行各业得到应用。然而,人脸识别系…

Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可用区,已达到高可用或者同…

揭秘:蚂蚁金服bPaaS究竟是什么?

去年9月,蚂蚁金服在杭州云栖ATEC发布了分布式金融核心套件bPaaS( Business Platform As a Service ),对外开放自身沉淀的“产品合约”、“资产交换”、“资产核心”、“会计核算”、“计价” 等金融核心组件,而这款号称…

云计算的 2020:云原生崛起,重新定义软件!

戳蓝字“CSDN云计算”关注我们哦!作者 | Ashish Sukhadeve译者 | 弯月责编 | 唐小引封图 | CSDN 付费自图虫创意出品 | CSDN 云计算(ID:CSDNcloud)随着 2006 年末 AWS S3 数据存储的问世,云计算发展成为了 IT 行业的三…

用PL/SQL Develpoer工具完成导入和导出

文章目录一、用PL/SQL Develpoer工具完成导入导出1. 导出2. 导入3. 补充前言:首先,我们导入导出数据,肯定是要通过oracle自带的可运行程序来完成数据的导入导出工作,imp.exe 和exp.exe这两个可运行文件都放在oracle安装目录下的BI…

关于Paxos 幽灵复现问题的看法

由于郁白之前写的关于Multi-Paxos 的文章流传非常广, 原文提出了一个叫"幽灵复现" 的问题, 认为这个是一个很诡异的问题, 后续和很多人交流关于一致性协议的时候, 也经常会提起这个问题, 但是其实这个问题我认为就是常见的"第三态"问题加了一层包装而已. …

idea spring boot 修改 html,js 等不用重启即时生效

1、【File】-【Settings】-【Build,Execution,Deplyment】-【Compiler】,选中打勾 Build project automatically 2、 组合键:ShiftCtrlAlt/,选择 Registry ,选中打勾 compiler.automake.allow.when.app.running” 3、找到你要运…

阿里巴巴微服务开源项目盘点(持续更新)

大前端、微服务、数据库、更多精彩,尽在开发者分会场 【Apache Dubbo】 Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,是国内影响力最大、使用最广泛的开源服务框架之一,它提供了三大核心能力:面向接口的远程方法调用&…

100行Python代码理解深度学习关键概念:从头构建恶性肿瘤检测网络

在构建乳腺癌预测神经网络过程中,我们主要分为3大部分: 1.用Python从零开始创建一个神经网络,并使用梯度下降算法训练模型。 2.在该神经网络中使用威斯康星乳腺癌数据集,根据9种不同的特征,预测肿瘤是良性还是恶性的…

开发者在行动!中国防疫开源项目登上 GitHub TOP 榜

用开发者们的方式支援这场没有硝烟的战争!整理 | 唐小引出品 | CSDN(ID:CSDNnews)截止北京时间 1 月 28 日下午 15:47,全国确诊新型冠状病毒的数字已经到达了 4586 例,疑似高达 6973 例,医护人员…