当前位置: 首页 > news >正文

记录一次云原生线上服务数据迁移全过程

文章目录

  • 背景
  • 迁移方案调研
  • 迁移过程
    • 服务监控脚本定时任务暂停
    • 本地副本服务启动,在线服务下线
    • MySQL 数据迁移
    • Mongo 数据迁移
    • 切换新数据库 ip 本地服务启动
    • 数据库连接验证
    • 服务打包部署
    • 服务重启
    • 前端恢复正常
    • 监控脚本定时任务启动
    • 旧服务器器容器关闭
  • 迁移总结

背景

校园 e 站,一群大学生在毕业前夕,为打破信息差而开发的一个校园论坛。一个从零到一全靠一群大学生的满腔热忱而打造的一个前后端分离以小程序为最终展示载体的一个微服务架构体系的 App。并发量的初始定位为 w 级,使用到多级缓存、数据分库等等前沿技术,当然这也是本次就是数据迁移的根本原因所在,架构过于庞大,用户较少,资源空等率高,所以决定将服务缩容,降低运营成本。
image.png
整体架构如上所示,本次需要迁移的数据重点为,Mongo 以及 MySQL 持久层数据。

迁移方案调研

因为持久层数据本身是通过 docker-compose进行容器编排加docker volume脚本启动,所以调研到的方案大体可分为以下几种:

  1. 在磁盘级别进行 volume迁移
  2. 以旧数据库为主库,新数据库为从库,进行主从同步
  3. 在应用层面使用应用本身的备份恢复功能进行数据迁移

三种方案的优缺点

方案优点缺点
磁盘暂时想不到,可能是看起来很牛技术要求高,容易出现兼容性问题
主从停机时间短需要改动两次服务启动脚本(主从搭建时,从库切主库)
备份恢复操作简单,风险低停机时间较长

在综合考虑下,选择了方案三进行备份恢复。
原因也很简单,生产级别一般都是选择风险最低且操作简单的方式,因为不管你有多牛,也没办法保证迁移过程不会出现一点问题~

迁移过程

服务监控脚本定时任务暂停

本地副本服务启动,在线服务下线

MySQL 数据迁移

遇到的第一个问题是,导出的文件压缩前 38M zip 压缩后依然 3.9 M,远大于 phpmyadmin 允许上传的 2M ,此时有两个方案:一是调大数据导入的文件大小限制,二是减少数据量。按道理正常使用数据,不应该那么大,毕竟用户量不大,且主要数据存在 mongo 中,在查询了之后发现,有一个请求时间监控的表数据量达到 50W
image.png
执行 sql 将数据压缩,

-- 数据平均
insert into controller_time(controller, time_cost, success) SELECT controller, AVG(time_cost) as time_cost, successFROM controller_time where id < 563003GROUP BY controller, success
;-- 删除旧数据
delete from controller_time where id < 563003;

controller_time 数据压缩后导出文件 4.5M 压缩后 359K,导入新数据库约十秒。

Mongo 数据迁移

进入 新机器 容器内,到 /usr/bin目录调用,容器已有的 mongo命令
image.png
image.png

  • 将远程 mongo(旧的数据库)数据备份到新机器容器内
mongodump -h <remote_ip>:<remote_port> -d <database>  -u<user_name> -p<user_password> --authenticationDatabase admin -
o /home/mongodb/

image.png

  • 数据恢复到新 mongo
mongorestore  -u  <local_user_name>  -p <user_password> --port 27017  --authenticationDatabase admin -d <database>   
/home/mongodb/

image.png

  • 数据恢复结果

image.png

切换新数据库 ip 本地服务启动

image.png

数据库连接验证

image.png

服务打包部署

mvn clean install package

image.png

服务重启

image.png

前端恢复正常

image.png

监控脚本定时任务启动

旧服务器器容器关闭

image.png

迁移总结

总涉及用户 6592 个用户,其中已通过校园认证的用户 3943 ,全部数据迁移完毕,服务恢复于 13:47 总耗时约 17 分钟。
image.png

相关文章:

  • 【electron】外语函数接口 FFI
  • 前端开发tips
  • 〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆
  • 使用postman做接口测试
  • 30 张图解 HTTP 常见的面试题
  • 华为OD机试真题-攀登者1-2023年OD统一考试(C卷)
  • 提示(Prompt)工程中提示词的开发优化基础概念学习总结
  • C# List类常用操作 之 查找
  • HarmonyOS鸿蒙应用开发——HTTP网络访问与封装
  • C/C++语言的安全编码规范
  • ssh安装和Gitee(码云)源码拉取
  • 设计模式篇---代理模式
  • Kafka 最佳实践:构建可靠、高性能的分布式消息系统
  • 基于JAVA+SpringBoot+Vue的前后端分离的医院信息智能化HIS系统
  • linux下查看文件当下的所有文件的大小和查找大文件
  • 【技术性】Search知识
  • Docker容器管理
  • extjs4学习之配置
  • golang 发送GET和POST示例
  • javascript 哈希表
  • Javascript基础之Array数组API
  • js算法-归并排序(merge_sort)
  • maya建模与骨骼动画快速实现人工鱼
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PAT A1120
  • Rancher-k8s加速安装文档
  • text-decoration与color属性
  • vue总结
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 阿里云应用高可用服务公测发布
  • 包装类对象
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 警报:线上事故之CountDownLatch的威力
  • 浅谈web中前端模板引擎的使用
  • 学习笔记TF060:图像语音结合,看图说话
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT(TCP网络编程-服务端)
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (23)Linux的软硬连接
  • (4)事件处理——(7)简单事件(Simple events)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (二)windows配置JDK环境
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (三) diretfbrc详解
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ./和../以及/和~之间的区别
  • .NET 给NuGet包添加Readme
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布