数据库实例迁移实践

news2024/12/23 19:09:57

背景

随着业务发展,数据库实例磁盘逐渐升高,告警频繁,且后续可能会对DDL产生影响(尤其是借助ghost等工具执行的DDL)。

该实例有多个库,则需要迁移其中的一个或几个单库到其他实例,为什么不做分库分表?一是没必要,数据增长没有那么快;二是改动大,影响范围大。
故采用库实例迁移的方式来缓解磁盘压力。

迁移前梳理

库本身的迁移好办,麻烦的是库下游的依赖迁移,比如DTS、大数据等依赖。所以在迁移前需要对待迁移库的流量做全面梳理,梳理完好库读写来源后再确立方案。

一个库的上下游依赖关系可以大致表示为:

一个库通常分布在多个实例,其中主库实例支持读写请求,下面的从库只接受读请求,如大数据抽数实例,为了不让大数据抽数影响业务数据读写,故抽出了一个实例。

服务读写库的方式通过一层数据库代理中间件,好处一是可以控制数据库连接,避免连接资源耗尽;二是可以使用唯一标识代替数据库用户名密码访问,更加安全;
三是在数据库实例切换时,可以在该代理修改唯一标识指向的实例达到快速切换的目的。 如果数据库使用用户名密码直连的方式访问,则迁移前梳理读写流量来源会更加麻烦,最好将服务读写请求收口到一处,做到单点变更。
此外,可能会有定时任务会在每次运行时新建数据库连接(比如Xxl-Job的glue模式),这个也要在前期梳理好,避免后续db实例切换时遗漏造成数据错乱。

为了实时监听数据变更,会有DTS等数据订阅中间件(实时同步),下游通过订阅该DTS来监听数据变更。


迁移可分为5个步骤:

  1. 存量数据迁移:存量数据批量迁移;
  2. 增量数据同步,新库订阅老库并开启一致性校验:同步在存量迁移期间变更的数据(update_time >= 存量迁移开始时间),之后新库订阅老库变更;
  3. 库下游依赖切换/迁移:首先切换或迁移下游依赖,如果下游依赖支持平滑切换数据库实例,则直接切换即可,否则得新建一套班子依赖新实例;
  4. 服务读写切换:服务读写从旧库切换到新库;
  5. 善后工作:旧库依赖清理,旧库清理等;

其中1,2两步中,有些公司已经有了成熟的工具,如果是手动开发代码来迁移,可以再此基础上增加灰度策略,本案例只讨论全量切场景,且数据库表均为平迁。

以上3,4两步的切换操作需要在业务低峰期操作,尽量减小切换带来的影响,切换后需要立即验证数据并稳定运行一段时间后执行下一步。

迁移前

拉上相关人员建群,群里同步信息,避免遗漏。

同时,在迁移前需要评估是否需要进行相关代码改造,便于后续平滑切换。

数据库连接统一配置 & 配置化连接

数据库连接的配置需要收口到可控的一处或几处:

且针对每一处收口,需要配置化连接,即配置变更立即变更数据库连接到新实例。
这种可以在数据库代理层做,没有也可以通过改造服务代码,通过监听配置中心数据库配置来变更数据库连接。

数据库停写开关 & DTS订阅配置化

在DTS切换时过程中,可能会存在重复消费的情况 。
订阅DTS的下游消费可能并不幂等,如果可以说服下游让其进行幂等改造最好,不行的话,则可以在针对DTS订阅的库表加上停写开关,在业务低峰期切换前,打开停写开关,等待DTS消费量归零后,执行切换,然后关闭停写开关。

DTS下游订阅,通常通过@PostConstruct注解实现注册消费者,该方式无法在配置变更后主动变更消费新DTS,只能重启。这样切换时间加长,需要仔细评估是否可行。

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

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

相关文章

【NPU 系列专栏 3.1 -- - NVIDIA 的 Orin 和 Altan 和 Thor 区别】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA Orin、Altan 和 ThorNVIDIA Orin 简介NVIDIA Orin 主要特点NVIDIA Orin 应用场景 NVIDIA Altan 简介NVIDIA Altan 主要特点NVIDIA Altan 应用场景 NVIDIA Thor 简介NVIDIA Thor 主要特点NVIDIA Thor 应用场景 与 Hopper …

CTF-NSSCTF题单[GKCTF2020]

[GKCTF 2020]CheckIN 这道题目考察:php7-gc-bypass漏洞 打开这道题目,开始以为考察反序列化,但实际并不是,这里直接用$_REQUEST传入了参数便可以利用了。这里出现了一个eval()函数,猜测考察命…

暑期C++ 缺省参数

有任何不懂的问题可以评论区留言,能力范围内都会一一回答 1.缺省参数的概念 缺省参数是是声明或定义参数时为函数的参数指定一个缺省值。在调用该函数值时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参 看了上面定义后&#…

CogVLMv2环境搭建推理测试

引子 之前写过一篇CogVLM的分享,感兴趣的移步CogVLM/CogAgent环境搭建&推理测试-CSDN博客,前一阵子,CogVLMv2横空出世,支持视频理解功能,OK,那就让我们开始吧。 一、模型介绍 CogVLM2 系列模型开源了…

基于Vision Transformer的mini_ImageNet图片分类实战

【图书推荐】《PyTorch深度学习与计算机视觉实践》-CSDN博客 PyTorch计算机视觉之Vision Transformer 整体结构-CSDN博客 mini_ImageNet数据集简介与下载 mini_ImageNet数据集节选自ImageNet数据集。ImageNet是一个非常有名的大型视觉数据集,它的建立旨在促进视觉…

旗晟机器人仪器仪表识别AI智慧算法

在当今迅猛发展的工业4.0时代,智能制造和自动化运维已然成为工业发展至关重要的核心驱动力。其中智能巡检运维系统扮演着举足轻重的角色。工业场景上不仅要对人员行为监督进行监督,对仪器仪表识别分析更是不可缺少的一个环节。那么我们说说旗晟仪器仪表识…

AI模型大比拼:Claude 3系列 vs GPT-4系列最新模型综合评测

AI模型大比拼:Claude 3系列 vs GPT-4系列最新模型综合评测 引言 人工智能技术的迅猛发展带来了多款强大的语言模型。本文将对六款领先的AI模型进行全面比较:Claude 3.5 Sonnet、Claude 3 Opus、Claude 3 Haiku、GPT-4、GPT-4o和GPT-4o Mini。我们将从性能…

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下) 大家好 我是寸铁👊 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&…

智能家居全在手机端进行控制,未来已来!

未来触手可及:智能家居,手机端的全控时代 艾斯视觉的观点是:在不远的将来,家,这个温馨的港湾,将不再只是我们休憩的场所,而是科技与智慧的结晶。想象一下,只需轻触手机屏幕&#xf…

如何实现CPU最大处理效率

如何实现CPU最大处理效率 CPU,或称为中央处理器,是计算机中负责执行指令和处理数据的核心部件。它的工作原理可简单概括为"取指、译码、执行、存储"四个步骤,也称为计算机的指令周期。 取指(Fetch):在取指阶段,CPU从内存中获取下一条要执行的指令,并存放在指…

回顾网络路,心率就过速

笔者上网写作已满16年,其间加盟过国内互联网的知名网站自媒体至少在40至50家之多,但由于有的被已被勒令停刊了(如《天涯论坛》),有的则因其改版而只保留了极少数擅于唱颂的写手(如《强国论坛》)…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-1

目录 HR企业入驻 HR企业入驻 - 认证流程解析 HR企业入驻 - 查询企业是否存在 HR企业入驻 - 上传企业logo与营业执照 HR企业入驻 - 新企业(数据字典与行业tree结构解析) 行业tree 行业tree - 创建节点 行业tree - 查询一级分类 行业tree - 查询子分…

计算存储背景与发展

随着云计算、企业级应用以及物联网领域的飞速发展,当前的数据处理需求正以前所未有的规模增长,以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大,并对主机计算资源(如内存和CPU)造成极大负担,进…

Redis的使用场景——热点数据缓存

热点数据缓存 Redis的使用场景——热点数据的缓存 1.1 什么是缓存 为了把一些经常访问的数据,放入缓存中以减少对数据库的访问效率,从而减少数据库的压力,提高程序的性能。【在内存中存储】 1.2 缓存的原理 查询缓存中是否存在对应的数据如…

05 capture软件创建元器件库(以STM32为例)

05 创建元器件库_以STM32为例 一、新建原理图库文件二、新建器件三、开始创建元器件 一些IC类元件,需要自己创建元器件库。 先看视频,然后自己创建STM32F103C8T6的LQFP48的元器件。 STM32F103C8T6是目前为止,自己用的最多的芯片。 先要有数据…

nodejs安装及环境配置建材商城管理系统App

✌网站介绍:✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围:Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容:免费功能设计、免费提供开题答辩P…

文件包涵条件竞争(ctfshow82)

Web82 利用 session.upload_progress 包含文件漏洞 <!DOCTYPE html> <html> <body> <form action"https://09558c1b-9569-4abd-bf78-86c4a6cb6608.challenge.ctf.show//" method"POST" enctype"multipart/form-data"> …

C语言的发展过程介绍

引言 C语言&#xff0c;由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;在20世纪70年代初期于贝尔实验室开发&#xff0c;是计算机科学史上最具影响力的编程语言之一。本文将概述C语言的发展历程&#xff0c;并提供一些代码示例来展示其演变。 起源&#xff1a;UNIX和C语言…

自动化测试--WebDriver API

1. 元素定位方法 通过 ID 定位&#xff1a;如果元素具有唯一的 ID 属性&#xff0c;可以使用 findElement(By.id("elementId")) 方法来定位元素。通过 Name 定位&#xff1a;使用 findElement(By.name("elementName")) 来查找具有指定名称的元素。通过 Cl…

重生之“我打数据结构,真的假的?”--5.堆(无习题)

1.堆的概念与结构 如果有⼀个关键码的集合 &#xff0c;把它的所有元素按完全⼆叉树的顺序存储⽅ 式存储&#xff0c;在⼀个⼀维数组中&#xff0c;并满⾜&#xff1a; &#xff08; 且 &#xff09;&#xff0c; i 0、1、2... &#xff0c;则称为⼩堆(或⼤堆)。将根结点最⼤的…