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

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


背景

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

整体架构如上所示,本次需要迁移的数据重点为,Mongo 以及 MySQL 持久层数据。

迁移方案调研

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

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

三种方案的优缺点

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

在综合考虑下,选择了方案三进行备份恢复。

原因也很简单,生产级别一般都是选择风险最低且操作简单的方式,因为不管你有多牛,也没办法保证迁移过程不会出现一点问题~

迁移过程

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

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

MySQL 数据迁移

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

执行 sql 将数据压缩,

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

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

Mongo 数据迁移

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

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

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

  • 数据恢复结果

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

数据库连接验证

服务打包部署

mvn clean install package

服务重启

前端恢复正常

监控脚本定时任务启动

旧服务器器容器关闭

迁移总结

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

相关文章
|
7月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
150 0
|
7月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】使用k8s创建nginx服务—通过ingress类型暴露
【云原生】使用k8s创建nginx服务—通过ingress类型暴露
|
8天前
|
Cloud Native 关系型数据库 MySQL
云原生数据仓库产品使用合集之如何使用ADB MySQL湖仓版声纹特征提取服务
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
2天前
|
Cloud Native Java 关系型数据库
【阿里云云原生专栏】构建云原生应用:基于Spring Boot与阿里云服务的全栈指南
【5月更文挑战第21天】构建云原生应用是企业数字化转型的关键,本文提供了一份基于Spring Boot和阿里云的全栈指南。涵盖从阿里云账号注册、ECS与Docker搭建,到Spring Boot项目创建、业务代码编写和部署。此外,还介绍了如何集成阿里云OSS存储、RDS数据库服务以及ACK容器服务,助力打造高效、可扩展和易管理的云原生应用。
110 3
|
2天前
|
Cloud Native 数据管理 关系型数据库
【阿里云云原生专栏】云原生数据管理:阿里云数据库服务的分布式实践
【5月更文挑战第21天】阿里云数据库服务在云原生时代展现优势,应对分布式数据管理挑战。PolarDB等服务保证高可用和弹性,通过多副本机制和分布式事务确保数据一致性和可靠性。示例代码展示了在阿里云数据库上进行分布式事务操作。此外,丰富的监控工具协助用户管理数据库性能,支持企业的数字化转型和业务增长。
169 1
|
3天前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
138 3
|
8天前
|
Cloud Native Java 开发工具
云原生 阿里云分布式文件系统 对象存储OSS 服务配置
【1月更文挑战第8天】云原生 阿里云分布式文件系统 对象存储OSS 服务配置
|
8天前
|
Kubernetes Cloud Native 持续交付
探索云原生架构的未来:如何优化资源管理和服务部署
【5月更文挑战第6天】 随着云计算的快速发展,云原生技术已成为企业数字化转型的关键驱动力。此篇文章深入探讨了云原生架构的核心组件及其在资源管理和服务部署方面的优化策略。通过分析容器化、微服务及自动化管理的实践案例,本文旨在为读者提供一套系统的方法论,以利用云原生技术实现更高效、灵活且可靠的IT基础设施。
33 2
|
8天前
|
Kubernetes Cloud Native 微服务
作者推荐|剖析云原生服务框架中服务发现机制的核心原理与实现机制
作者推荐|剖析云原生服务框架中服务发现机制的核心原理与实现机制
51 0
|
8天前
|
自然语言处理 运维 Cloud Native
云原生技术专题 | 探索云原生化的服务架构体系的技术风向,攻克云原生化微服务架构的痛点和特性
云原生技术专题 | 探索云原生化的服务架构体系的技术风向,攻克云原生化微服务架构的痛点和特性
56 0

热门文章

最新文章