21

Qunar 数据库迁移程序

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ%3D%3D&%3Bmid=2649265429&%3Bidx=1&%3Bsn=16f2502b80e65dc030d2b98e8ae9707f
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击蓝字

关注我们

作者简介

qQNfIn2.jpg!mobile

雷孝龙

去哪儿网DBA

2019年8月加入去哪儿网,拥有丰富的数据库运维和优化经验,现负责公司的MySQL/Redis运维工作,及自动化方案的实施和落地。

1. 概述

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

2. 背景

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

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

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

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

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

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

3. 自动化迁移实现

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

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

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

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

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

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

3.1 程序整体架构

67n6viE.png!mobile

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. 平台编辑任务流程

    2y6zyu7.png!mobile

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

  4. 参数填写

    IvuyIrv.png!mobile

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

3.1.3 迁移任务

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

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

B7bYzuq.png!mobile

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

7ZBZvyb.png!mobile

  • 快照,记录迁移参数

FZjQJbI.png!mobile

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

Zze6Zvq.png!mobile

3.1.4 定时任务/手动调度

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

3.1.5 执行队列

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

j2INFb.png!mobile

3.2 使用工具

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

4. 总结

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

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

BZFRriZ.jpg!mobile

6jemIbu.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK