数据库实例迁移实践

背景

随着业务发展,数据库实例磁盘逐渐升高,告警频繁,且后续可能会对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.xdnf.cn/news/1489089.html

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

相关文章

第G4周:CGAN|生成手势图像 | 可控制生成

本文为🔗365天深度学习训练营 中的学习记录博客 原作者:K同学啊 理论知识: 条件生成对抗网络(CGAN)是在生成对抗网络(GAN)的基础上进行了一些改进。对于原始GAN的生成器而言,其生成的…

探索 SPL-404 协议标准:NFT 与 DeFi 的融合

在快速发展的数字资产领域中,NFT 协议标准持续演变,改变了我们对数字所有权和互动方式的理解。从 Art 到 Gamefi 等等,NFT 已经演变成数字经济的重要组成部分,吸引了广泛关注。遵循 ERC404 协议,SPL404 概念在 Solana …

昇思25天学习打卡营第22天|CV-Vision Transformer图像分类

打卡 目录 打卡 ViT简介 模型结构 基于ViT实现ImageNet分类任务 环境准备与数据读取 模型解析 Transformer基本原理 Self-Attention模块 代码实现 Transformer Encoder 代码实现 ViT模型的输入 Patch Embedding代码处理输入 整体构建ViT 模型训练与推理 模型训…

金字塔监督在人脸反欺骗中的应用

介绍 论文地址:https://arxiv.org/pdf/2011.12032.pdf 近年来,人脸识别技术越来越普及。在智能手机解锁和进出机场时,理所当然地会用到它。人脸识别也有望被用于管理今年奥运会的相关人员。但与此同时,人们对人脸欺骗的关注度也…

【无标题】Git(仓库,分支,分支冲突)

Git 一种分布式版本控制系统,用于跟踪和管理代码的变更 一.Git的主要功能: 二.准备git机器 修改静态ip,主机名 三.git仓库的建立: 1.安装git [rootgit ~]# yum -y install git 2.创建一个…

【Linux】syscall sys_write流程摸索

这是通过tty进行摸索sys_write的流程。 在前面的博客里,我们可以看到基于内核C语言源代码日志打印,在打印的日志里边包含:日期,时间,当前文件所在代码目录,当前执行函数名,当前文件执行行号&am…

苦学Opencv的第十一天:图像的形态学操作

Python OpenCV从入门到精通学习日记:图像的形态学操作 前言 图像形态学是图像处理中的一个重要分支,主要关注图像中物体的形状和结构。通过形态学操作,我们可以对图像进行有效的分析和处理,例如图像的腐蚀与膨胀、开运算与闭运算…

nginx的学习(一):nginx的基本概念和反向代理

简介 nginx的基本概念,以及反向代理的配置 nginx 是一个高性能的http和反向代理web服务器及电子邮件(IMAP/POP3/SMTP)代理服务器。 相关的基本概念 正向代理 客户端配置代理服务器,通过代理服务器访问互联网。 反向代理 客…

【8月EI会议推荐】第四届区块链技术与信息安全国际会议

一、会议信息 大会官网:http://www.bctis.nhttp://www.icbdsme.org/ 官方邮箱:icbctis126.com 组委会联系人:杨老师 19911536763 支持单位:中原工学院、西安工程大学、齐鲁工业大学(山东省科学院)、澳门…

Xinstall揭秘:一键拉起服务如何助力App提升用户体验和下载转化率

在移动互联网时代,App的运营和推广显得尤为重要。而在这个过程中,如何提升用户体验和下载转化率成为了每个App运营者关注的焦点。今天,我们就来揭秘一下Xinstall的一键拉起服务,看看它是如何助力App提升用户体验和下载转化率的。 …

Java之多线程-同步代码块

线程同步 Java中提供了线程同步的机制,来解决上述的线程安全问题。 Java中实现线程同步,主要借助synchronized关键字实现。 线程同步方式: 同步代码块 同步方法 锁机制 1)同步代码块 格式: //Object类及其子类…

Flink笔记整理(五)

Flink笔记整理(五) 文章目录 Flink笔记整理(五)七、处理函数(最底层最常用最灵活)7.1基本处理函数(ProcessFunction)处理函数的功能和使用ProcessFunction解析 7.2按键分区处理函数&…

数据结构 Day2 链式存储

线性表的链式存储 解决顺序存储的缺点,插入和删除,动态存储问题。特点:线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占用的位置上…

JavaScript Let

ECMAScript 2015 ES2015 引入了两个重要的 JavaScript 新关键词:let 和 const。 这两个关键字在 JavaScript 中提供了块作用域(Block Scope)变量(和常量)。 在 ES2015 之前,JavaScript 只有两种类型的作…

【数据库】联合索引在b+树如何存储

什么是联合索引? 联合索引是一种数据库索引类型,它允许你基于表中两个或多个列的组合来创建索引。这种索引可以提高数据库查询的性能,特别是当查询条件涉及到这些列时。 如: create index id_name_age out users(name,age) 索引…

算法刷题day20|回溯:39. 组合总和、40. 组合总和 II、131. 分割回文串

39. 组合总和 回溯 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum target) {result.push…

C#、Net6、WebApi报表方案

目录 1 Pdf表单方案 1.1出现如下错误提示: 1.2 字体路径使用 2 Docx报表模板方案 2.1 pdf方案缺陷 2.2 解决方案 3 Spire.Doc报表方案 3.1 Docx方案缺陷 3.2 解决方案 4 插入复选框 5 WebApi文件流下载接口 6 软件获取方式 1 Pdf表单方案 使用【Adobe Acrobat P…

Python 爬虫入门(一):从零开始学爬虫 「详细介绍」

Python 爬虫入门&#xff08;一&#xff09;&#xff1a;从零开始学爬虫 「详细介绍」 前言1.爬虫概念1.1 什么是爬虫&#xff1f;1.2 爬虫的工作原理 2. HTTP 简述2.1 什么是 HTTP&#xff1f;2.2 HTTP 请求2.3 HTTP 响应2.4 常见的 HTTP 方法 3. 网页的组成3.1 HTML3.1.1 HTM…

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…