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 页面自行配置。与固定模板不同之处在于参数之间的传递,固定模板因为由后台代码写死,预先知道每一个步骤需要哪些参数,通过程序传入即可。而自定义流程不能预先知道每一步之间参数如何传递,因此我们增加了一个参数池,用来存储所有输入以及输出的参数,后续任务只要定义了输入参数的名称,在参数池中都可以找到对应参数,找不到的情况,则说明任务流程配置不合理。
开发一个新的流程的成本非常低,流程大致如下:
确认迁移过程的大致操作及所需要的子任务(如果任务池没有所需要的,则需要按照样本实现新的子任务功能) 例:QMHA 新增一个读节点,所需流程如下 机器初始化实例——> 备份并还原源端数据 ——> 创建主从复制 ——> 检查主从复制延时 ——> 配置中心添加并上线新节点
平台编辑任务流程
确认任务是否高危操作,是否需要人为调度
参数填写
提交任务,或保存为模板,可供下次使用
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 技术沙龙 - 微信公众号 [ID:QunarTL]
转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论