写点什么

Qunar 数据库迁移程序

  • 2020 年 12 月 26 日
  • 本文字数:2845 字

    阅读完需:约 9 分钟

Qunar 数据库迁移程序

1. 概述


本文主要介绍 Qunar DBA 部门运维平台中的自动化迁移程序。自动化迁移程序,主要实现 DBA 日常工作中常见的运维操作,如:过保机器替换,集群架构升级,数据库版本升级等,并且支持流程可配置,可以满足各种定制化的运维场景。使用程序代替人为操作,实现操作的规范化,提升工作效率的同时,能够避免各种由于人为操作不当引发的故障。


2. 背景


  • DBA 工作繁重,日常操作繁琐


作为 DBA,真的很忙,每天都有很多事情要处理,备份和恢复、监控状态、集群搭建与扩容、数据迁移高可用和性能优化等,除此之外,还要面对开发的各种需求和疑问,有时候一个需求,一个问题甩过来,可能半天时间就没了,有时候还得扮演下救火队员的角色。因此,急需自动化程序来解放 DBA 的双手,让我们有精力去做一些更有意义的事情。


  • 新人入职培训成本高,周期长


新人入职,需要进行较长时间培训,了解公司架构、操作规范等,至少一个月时间才能够进行线上基本操作,一些复杂操作甚至需要更长时间的学习和理解,才有信心对生产环境进行变更。


  • 迁移操作流程复杂,人为操作具有不确定性,易引发故障


人是感性的动物,尽管我们制定了各种操作规范,当我们去按照文档操作时,特别是在个人状态不佳的时候,难免会出现纰漏。有时因为忘记改某个参数,忘记执行某条命令,可能就会引发线上故障。Qunar2019 由于人为操作导致的故障损失较大,而这些故障使用自动化程序都可以避免。


3. 自动化迁移实现


自动化,目的在于使用程序替代人为操作,因此我们最早先做了集群的安装部署,是用的最多的场景。部署不是单单几条命令就完事了,公司内部架构比较复杂,涉及到的组件多,包括:集群搭建(主从半同步、PXC 集群),哨兵集群,配置中心,zookeeper 等;所以流程比较复杂。我们按照规范文档,一个个步骤的实现,然后串联起来,形成一个完整的部署流程。每次部署通过平台添加任务接口,放到后台异步执行即可。


自动化部署开发完成后,新集群部署的问题解决了,按照这个思路,其他日常的操作同样也能实现,于是开始构思实现更多的场景。但是,在开发过程中,我们遇到了几个问题:


  • 数据迁移周期较长,需要开发介入,比如:重新发布程序,修改客户端连接方式等

  • 涉及到高危操作,主从切换、割接等,需要择机进行


这就导致了不能像部署一样,把操作步骤组合起来丢到后台执行就可以了。需要整个流程能够支持随时暂停和随时调度,我们把一个复杂流程拆分为多个独立的子任务,每个子任务能够单独调度执行,通过后台拼装子任务来定义各种迁移流程。按照这种方式,先后实现了几种在 Qunar 常用的迁移场景:过保机器替换、MMM 集群数据库版本升级、MMM 升级 PXC 集群等。


实现了一些常用的场景,但日常的迁移需求远远不止于此,稍微一变,后台定义的模板就无法满足需求,就得重新开发一个模板,非常不友好。所以为了满足更多的需求,我们实现了在 Web 端自定义迁移流程,每个操作人可以自行组合迁移子任务。


3.1 程序整体架构



3.1.1 任务池


独立的任务,可以理解为某一个运维操作,每个任务可以是一条简单命令,例如启动数据库、关闭数据库,也可能是一系列操作。但步骤拆分的越细,复用程度就会越高,可应用在更多的场景。使用 SaltStack 实现对服务器的远程操作


3.1.2 任务模板


后台定义模板


早期由各个子任务定制组合成的常用迁移流程,每次操作仅需要配置迁移参数即可,整个耗时过程无需值守。目前已实现了 Qunar DBA 常见的运维场景;比如:集群版本升级、架构升级、过保替换、部署、卸载等。


Qunar 目前使用情况如下:


  • MMM 版本升级:Qunar 内部有不少 MySQL5.5 的 MMM 老集群,均已完成升级,每套节省时间约 1 小时

  • 集群部署:人工需要 30 分钟,自动化程序约 3 分钟,目前已使用自动化部署集群超过 180 套

  • 过保机器替换:4 年内过保机器超过 400 台,使用自动化程序迁移过程无需人为值守,节省超过 90%的时间

  • 单实例备份迁移:主要适用集群的资源整合,机器之间数据库实例迁移、配置中心上下线操作等一键操作

  • 卸载集群:由于集群组件多,涉及操作步骤复杂,需要操作 zk、哨兵、git 等,自动化可一键完成

  • MMM 升级 PXC 架构:目前 Qunar DBA 正在全公司范围内推行数据库架构升级,即将废弃老的架构 MMM,用 PXC 集群替换。第二季度已完成内部超过 60%的 MMM 集群架构升级,共计 80 套,升级过程与业务解藕,支持服务滚动发布,无需割接、停服,仅涉及一次读写切换,对业务影响降低到秒级;纯升级时间由 3 小时变为 20 分钟,并且实现零故障升级


用户自定义模板


为支持更多迁移场景,支持通过 Web 页面自行配置。与固定模板不同之处在于参数之间的传递,固定模板因为由后台代码写死,预先知道每一个步骤需要哪些参数,通过程序传入即可。而自定义流程不能预先知道每一步之间参数如何传递,因此我们增加了一个参数池,用来存储所有输入以及输出的参数,后续任务只要定义了输入参数的名称,在参数池中都可以找到对应参数,找不到的情况,则说明任务流程配置不合理。


开发一个新的流程的成本非常低,流程大致如下:


  1. 确认迁移过程的大致操作及所需要的子任务(如果任务池没有所需要的,则需要按照样本实现新的子任务功能) 例:QMHA 新增一个读节点,所需流程如下 机器初始化实例——> 备份并还原源端数据 ——> 创建主从复制 ——> 检查主从复制延时 ——> 配置中心添加并上线新节点

  2. 平台编辑任务流程





  1. 确认任务是否高危操作,是否需要人为调度

  2. 参数填写





  1. 提交任务,或保存为模板,可供下次使用


3.1.3 迁移任务


迁移任务由 web 页面配置管理,任务详情中,包括:日志、快照(参数)、流程、管理。


  • 管理页面,支持随时暂停/手动调度/标记任务已执行等



  • 流程页面,记录每一步执行时间以及状态



  • 快照,记录迁移参数



  • 日志,实时打印执行信息



3.1.4 定时任务/手动调度


定时任务会每 10 秒查询一次任务表,取出满足执行条件的任务放入执行队列中,等待任务被调度执行;手动调度是由操作人在页面点击按钮,调用接口进行任务调度。


3.1.5 执行队列


使用 celery 任务队列,支持多线程,多个流程并发执行;只需将任务放入队列,程序自行调度,执行结果会反馈到具体执行的任务步骤中。



3.2 使用工具


开发工具:Python3.6 + Tornado + Celery 远程命令调用:SaltStack


4. 总结


自动化迁移程序,将冗长而复杂的迁移流程,通过拆分组合的方式,使用程序实现,对于 DBA 来说,仅需要配置任务的时间,无需登录机器进行复杂的操作,大大提升了运维效率,并且在很大程度上避免了人为故障的发生,真正实现了线上环境操作的规范化和自动化


Qunar DBA 部门正在推进架构升级,即将废弃老的 MMM 架构,使用 PXC 代替。目前已经使用自动化程序完成超过 60%的 MMM 集群架构升级。PXC 集群采用 namespace 的方式,对客户端屏蔽了数据库实例真实 ip 地址,这对后续数据库资源池管理提供了可行性,而自动化迁移程序的实现,也为后续资源池管理,实例迁移整合提供了基础工具。



头图:Unsplash

作者:雷孝龙 - 去哪儿网 DBA

原文Qunar 数据库迁移程序

来源:Qunar 技术沙龙 - 微信公众号 [ID:QunarTL]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020 年 12 月 26 日 19:41961
用户头像

发布了 64 篇内容, 共 74783 次阅读, 收获喜欢 126 次。

关注

评论

发布
暂无评论
发现更多内容

【架构设计模块八】:设计消息队列存储消息数据的 MySQL 表格

Ryoma

TCP/IP参考模型与标准协议

Regan Yue

TCP/IP 9月日更

架构训练营-模块八作业

hello

架构训练营

产品分析:如何给出解决方案?

石云升

产品经理 产品思维 9月日更

模块四作业

Geek_fc100d

「架构实战营」

高可用延迟队列设计与实现

万俊峰Kevin

微服务 延迟队列 microservice Go 语言 定时队列

手机测试岗位常见面试问题汇总(持续更新中)

IT蜗壳-Tango

9月日更

Nginx如何支持HTTPS,大厂Java高级多套面试专题整理集合

Java 程序员 后端

P8级别的顶级“并发编程”宝典,linux基础入门知识

Java 程序员 后端

过滤器、拦截器、监听器

hasWhere

架构实战营模块八作业

技术是伙伴

架构实战营

架构训练营模块八作业

喻高咏        

架构训练营

Elasticsearch 源码学习(1)源码编译调试

Se7en

JavaScript进阶(六)继承

Augus

JavaScript 9月日更

模块八作业

河马先生

架构实战营

Vue进阶(幺贰叁):v-for 实现一行展示 n 个元素

No Silver Bullet

Vue 9月日更

《转》搭建websocket消息推送服务

hasWhere

古董系统的并发安全改造

hasWhere

JVM启动参数学习笔记三

风翱

JVM 9月日更

P8级别的顶级“并发编程”宝典,面试完腾讯我才发现这些知识点竟然没掌握全

Java 程序员 后端

架构设计的一些思考

hasWhere

中秋晴朗夜,我们与星月相见

白洞计划

Vue进阶(幺贰肆):前端用户体验提升(一)

No Silver Bullet

用户体验 9月日更

技术圈的【多肉小达人】,一篇文章你就能做到

梦想橡皮擦

9月日更

【LeetCode】最后一个单词的长度Java题解

HQ数字卡

算法 LeetCode 9月日更

PDF超过6000页,2021最新Java面试题及答案

Java 程序员 后端

模块8作业

脉动

RabbitMQ的高级特性和消息补偿机制,字节跳动面试真题

Java 程序员 后端

缓存系统设计与实现

hasWhere

SpringMVC源码分析-HandlerAdapter(2)-RequestMappingHandlerAdapter的初始化

Brave

源码 springmvc 9月日更

nginx路径匹配踩坑

hasWhere

Qunar 数据库迁移程序_语言 & 开发_Qunar技术沙龙_InfoQ精选文章