overmind系统上线三个月,累计执行任务800+,自动审核执行SQL超过5000条,效率提升相当明显,离“一杯咖啡,轻松运维”的目标又进了一步。

写在前边

overmind系统是我们自主研发的一个数据库运维系统,目前包含数据库管理、工单、SQL审核、SQL执行、SQL查询、密码表等功能,关于这些功能有写过一些文章介绍:

同时我们还自研了其他一些Devops相关的系统,这篇文章有介绍

自吹自擂

起初在写overmind时就有考虑到之后的扩展,不仅仅是作为SQL自动审核执行的平台,更希望能将其打造成一个数据库自动化运维的专业系统,SQL自动审核执行作为第一个功能被开发了出来。三个月的使用后overmind得到了大家的认可,并且切切实实帮助我们节约了时间,这也给予了我这个非专业开发、半吊子DBA莫大的鼓励和信心。

日常工作中经常会接到把数据库整库或单表从生产环境导入到测试环境或测试A导入到测试B等数据库、表之间的数据互导需求,这类操作没有太高技术含量还费时费力容易出错,最适合做到自动化的流程中,这便是overmind要实现的第二个功能:工单+自动化数据迁移。

为什么需要工单?目前的流程都是通过邮件的方式,需求邮件到DBA,DBA执行导数据的操作。自动化的流程理论来说应该从头至尾都无需人工参与,但涉及到数据安全问题,还是需要DBA确认,所以加了工单。同时工单具有状态自助追踪,减少沟通成本等优点,后续也方便统计工单量等指标,以便优化服务与流程。同时为了能够保证工单及时被处理,我们每一步都会增加邮件和IM的通知,给用户最及时的反馈。

数据迁移的工单流程很简单,用户提交工单,DBA进行审核,审核通过系统自动执行迁移操作,审核不通过流程结束。流程图图如下:

流程中没有加入项目leader等的多层审核方式,主要是因为

  1. 尽量跟之前的邮件流程保持一致,避免给用户制造麻烦
  2. 团队规模较小,数据敏感度DBA基本可以把控,同时会在通知邮件中加上相关的同事以知晓

迁移功能

数据库迁移主要是利用mysql的导入导出功能,核心的命令就一个

mysqldump -h 10.82.9.19 -P 3306 -uops -pcoffee --default-character-set=utf8 --single-transaction --databases dbname | mysql -h 192.168.106.91 -P 3306 -uops -pcoffee --default-character-set=utf8 dbname

以上命令是shell命令,在python下没有找到直接导入导出mysql数据的包,只能在python代码中调用shell命令,推荐使用subprocess模块,这个模块有着更加丰富的使用方法,方便获取最终的命令执行状态和输出结果,转换成完整的python类如下:

from subprocess import Popen, PIPE

class Cmd():
def __init__(self):
self.src_host = '10.82.9.19'
self.src_port = 3306
self.src_database = 'dbname' self.des_host = '192.168.106.91'
self.des_port = 3306
self.des_database = 'dbname' self.tables = 'all' self.username = 'ops'
self.password = 'coffee' def migration(self):
# 利用mysqldump命令备份
dump = "mysqldump -h %s -P %d -u%s -p%s --default-character-set=utf8 --single-transaction --databases %s" % (
self.src_host, self.src_port, self.username, self.password, self.src_database
) # 如果是对表的导出则加上表名,是个字符串'table1 table2 table3'
if self.tables != 'all':
dump += ' %s' % self.tables # 利用mysql命令导入
mysql = "mysql -h %s -P %d -u%s -p%s --default-character-set=utf8 %s" % (
self.des_host, self.des_port, self.username, self.password, self.des_database
) # 执行导出导入shell命令
process = Popen("%s | %s" % (dump, mysql), stderr=PIPE, shell=True)
process_stdout = process.communicate() # 判断shell命令执行结果状态
if (process.returncode == 0):
print('迁移成功!')
else:
print(process_stdout[1].decode('utf8').strip()) Cmd().migration()

这里采用了shell中的管道,管道用|符号分割两个命令,管道符前的命令正确输出作为管道符后命令的输入,好处是不需要生成单独的sql文件存放在磁盘上,也就不需要考虑文件删除,占用磁盘的问题,缺点是导出大的数据库时可能会造成OOM,这个要根据自身情况综合权衡。

导数据属于耗时操作,在web中应异步执行,这里采用了Celery来处理,这篇文章Django配置Celery执行异步任务和定时任务有详细介绍Django中Celery的使用

系统界面

工单列表页:普通用户只显示自己提交的工单,工单状态一目了然,还有实用的搜索功能

提交工单页:overmind维护了一份数据库列表,供系统里所有的功能使用,这里也不例外

工单审核页:审核页和详情页其实是同一个页面,只是根据工单不同的状态展示不同的元素

工单详情页:这里会详细记录这个工单的所有信息,提交、审核、执行的整个过程完整状态

写在最后

  1. 好的需求来源于日常的工作,重复的工作都可以自动化
  2. 关于数据库运维或者overmind有什么想法或建议欢迎交流

如果你觉得文章对你有帮助,请转发分享给更多的人。如果你觉得读的不尽兴,推荐阅读以下文章:

Devops-运维效率之数据迁移自动化的更多相关文章

  1. 运维脚本-elasticsearch数据迁移python3脚本

    elasticsearch数据迁移python3脚本 #!/usr/bin/python3 #elsearch 数据迁移脚本 #迁移工具路径 import time,os #下面命令是用到了一个go语 ...

  2. DEVOPS 运维开发系列

    DEVOPS 运维开发系列四:ITIL事态管理流程.事态监控系统设计以及基于Devops的效率提升实践 - watermelonbig的专栏 - CSDN博客https://blog.csdn.net ...

  3. 安全运维中基线检查的自动化之ansible工具巧用

    i春秋作家:yanzm 原文来自:安全运维中基线检查的自动化之ansible工具巧用 前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都 ...

  4. 提高运维效率(二)桌面显示IP

    运维人员远控电脑询问IP时,总要告诉用户找ip的步骤,岂不很烦? 以下方法直观地把ip地址显示在桌面上,再做个入职培训,即可提高运维效率. 1.  下载bginfo.exe软件,放到域控下的netlo ...

  5. 提高Linux运维效率的命令行常用快捷键

    提高Linux运维效率的命令行常用快捷键 tab 命令或路径等的补全键,Linux最有用快捷键 Ctrl+a 光标回到命令行首 Ctrl+e 光标回到命令行尾 Ctrl+k 剪切(删除)光标处到行尾的 ...

  6. 提高Linux运维效率的30个命令行常用快捷键

    提高Linux运维效率的30个命令行常用快捷键 表4-1  30个常用快捷键 快捷键 功能说明 最有用快捷键 tab 命令或路径等的补全键,Linux最有用快捷键* 移动光标快捷键 Ctrl+a 光标 ...

  7. Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)

    之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...

  8. MySQL,Oracle,PostgreSQL通过web方式管理维护, 提高开发及运维效率

    在开发及项目运维中,对数据库的操作大家目前都是使用客户端工具进行操作,例如MySQL的客户端工具navicat,Oracle的客户端工具 PL/SQL Developer, MSSQL的客户端工具查询 ...

  9. MySQL,Oracle,PostgreSQL,mongoDB 通过web方式管理维护, 提高开发及运维效率

    在开发及项目运维中,对数据库的操作大家目前都是使用客户端工具进行操作,例如MySQL的客户端工具navicat,Oracle的客户端工具 PL/SQL Developer, MSSQL的客户端工具查询 ...

随机推荐

  1. vista下开机启动 简单绕过UAC的方法(自己使用runas参数重新启动自己,有点意思)

    背景      vista下,如果不开启UAC,那就没有我下面要说的问题了,呵呵.下面说的都是在vista开启UAC的前提下说的,win7也适用.      在vista下,系统开启了UAC,如果你的 ...

  2. java集合框架collection(3)Set、List和Map

    Set.List和Map是java collection中最常用的三种数据结构. Set是集合,不允许有重复的元素,List是动态数组实现的列表,有序可重复,Map是key-value的键值对,用于快 ...

  3. IOS 数据存储(NSKeyedArchiver 归档篇)

    什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...

  4. 记录 nginx和php安装完后的URL重写,访问空白和隐藏index.php文件的操作方法

    sudo cd /etc/nginx/; sudo vi fastcgi_params; 1.URL重写 如果你的url参数不是用?xxx传递,而是自定义的,比如用/xx/xx/xx的方式传递,那么在 ...

  5. Codeforces Round #567 (Div. 2)A

    A. Chunga-Changa 题目链接:http://codeforces.com/contest/1181/problem/A 题目 Soon after the Chunga-Changa i ...

  6. 搭建CentOS 7本地源仓库

    CentOS 7离线包及其依赖 推荐使用yumdownloader --resolve --destdir=path python-pip,--resolve下载所有依赖,--destdir指定软件包 ...

  7. JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

  8. Java多线程(2)线程锁

    多线程访问同一个资源进行读写操作,就很容易出一些问题(比如我们常见的读者写者,生产者消费者模型)所以我们会选择对他们设置信号量或者加锁,来限制同一个时刻只有一个线程对某个对象进行操作. 多线程是一个蛮 ...

  9. Jsoup配合 htmlunit 爬取异步加载的网页

    加入 jsoup 和 htmlunit 的依赖 <dependency> <groupId>org.jsoup</groupId> <artifactId&g ...

  10. Codeforces Gym101170J:Jupiter Orbiter(最大流)

    题目链接 题意 有n次事件,q个队列,s个传感器.每个传感器接到一个队列,每个队列有一个容量. 接下来执行n次事件,每次事件都会有一个最大发送数据量d.和s个数据a,代表这次给每个s填入a的数据量. ...