MySQL备份调度自动化实现思路

这是学习笔记的第 1775篇文章

昨天整理了下备份调度的思路 批量任务的并发调度和时间调度,整体来说已经自己已经思路很清晰了,所以今天就开始实现整个过程。

为了表决心,今天让同事给我匀了一批MySQL实例出来,在晚上做好充分测试之后直接发布到线上开始做时间调度的自动化配置,整体来说,达到了预期的效果。

整个过程涉及几个页面,我简单提取出来一个。

做调度的部分,分为两个部分,一个是任务调度,也就是任务的并行调度,另外一个是时间调度,比如我们可以设定一个起始时间,按照时间调度后的情况可对后续的任务设置相应的执行时间,整个过程可以都放在crontab里完成,也可以推送到celery完成。

要触发调度需要输入两个参数,一个是起始时间,另外一个是并行度。

调度后的基本效果如下:

这个过程涉及到两个算法,一个任务并行的调度算法,另外一个就是时间调度的算法,时间调度是在任务并行调度的基础上完成的。

时间调度的基本代码如下,思路是根据已有的分组和起始时间,来预估后续的任务的起始时间。

for j in range(len(array_group[i])):
    print ('test:', i, j, array_group[i][j])
    duration_seconds = mysql_xtrabackup_scheduler.objects.filter(id=array_group[i][j])[0].duration_seconds
    diff_seconds = 60
    if j == 0:
        end_time = new_time + datetime.timedelta(seconds=int(duration_seconds) + diff_seconds)
        print "new_time:", new_time, "end_time:", end_time, new_time.hour, new_time.minute, duration_seconds
    else:
        new_time = end_time
        end_time = end_time + datetime.timedelta(seconds=int(duration_seconds) + diff_seconds)
        print "new_time:", new_time, "end_time:", end_time, new_time.hour, new_time.minute, duration_seconds
打个比方,部分调度生成的日志如下,可以看到一个有序的数据可以在依次计算后续的执行时间。
('array_group', [[11100L, 3300L], [10400L, 3300L], [9600L, 3700L, 100L, 100L], [6600L, 5900L, 3000L]])
0 [11100L, 3300L]
1 [10400L, 3300L]
2 [9600L, 3700L, 100L, 100L]
3 [6600L, 5900L, 3000L]
0 [3L, 73L]
[3L, 73L]
('test:', 0, 0, 3L)
new_time: 2017-08-28 01:00:00 end_time: 2017-08-28 04:06:00 1 0 11100
('test:', 0, 1, 73L)
new_time: 2017-08-28 04:06:00 end_time: 2017-08-28 05:02:00 4 6 3300
1 [55L, 47L]
[55L, 47L]
('test:', 1, 0, 55L)
new_time: 2017-08-28 01:00:00 end_time: 2017-08-28 03:54:20 1 0 10400
('test:', 1, 1, 47L)
new_time: 2017-08-28 03:54:20 end_time: 2017-08-28 04:50:20 3 54 3300
2 [32L, 38L, 202L, 203L]
[32L, 38L, 202L, 203L]
('test:', 2, 0, 32L)
new_time: 2017-08-28 01:00:00 end_time: 2017-08-28 03:41:00 1 0 9600
('test:', 2, 1, 38L)
new_time: 2017-08-28 03:41:00 end_time: 2017-08-28 04:43:40 3 41 3700
('test:', 2, 2, 202L)
new_time: 2017-08-28 04:43:40 end_time: 2017-08-28 04:46:20 4 43 100
('test:', 2, 3, 203L)
new_time: 2017-08-28 04:46:20 end_time: 2017-08-28 04:49:00 4 46 100
3 [65L, 71L, 11L]
[65L, 71L, 11L]
('test:', 3, 0, 65L)
new_time: 2017-08-28 01:00:00 end_time: 2017-08-28 02:51:00 1 0 6600
('test:', 3, 1, 71L)
new_time: 2017-08-28 02:51:00 end_time: 2017-08-28 04:30:20 2 51 5900
('test:', 3, 2, 11L)
new_time: 2017-08-28 04:30:20 end_time: 2017-08-28 05:21:20 4 30 3000

这是一个放大的效果图,比如第1组的任务计划是1:00开始,执行时间是1110秒,则后续的任务时间范围会额外加1分钟,会从1:19开始;第2组的任务也是从1:00开始,执行了1040秒,额外加1分钟,则从1:18开始;第3组的任务也是从1:00开始,根据执行时间,有1:17,1:24,1:25 三个后续的子任务。

整体这样计算下来,crontab的任务执行时间就完全可以根据策略来定制了,定制之后,我们通过批量处理的方式推送到系统crontab中,整个过程就会完成任务的分发和修改,可以真正实现一键配置。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏韩伟的专栏

高性能服务器架构思路:缓冲清理策略(二)

虽然使用缓存思想似乎是一个很简单的事情,但是缓存机制却有一个核心的难点,就是——缓存清理。我们所说的缓存,都是保存一些数据,但是这些数据往往是会变化的,我们要针...

9K0
来自专栏aCloudDeveloper

vhost-user 简介

什么是 vhost-user 在 vhost 的方案中,由于 vhost 实现在内核中,guest 与 vhost 的通信,相较于原生的 virtio 方式性能...

4864
来自专栏微服务生态

缓存系列文章--热点key问题

我们通常使用 缓存 + 过期时间的策略来帮助我们加速接口的访问速度,减少了后端负载,同时保证功能的更新,一般情况下这种模式已经基本满足要求了。   但是有两个...

733
来自专栏北京马哥教育

sar 找出系统瓶颈的利器

12. sar 找出系统瓶颈的利器 sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然...

2978
来自专栏北京马哥教育

varnish缓存实现动静分离

一、简介 Web缓存是指一个Web资源(html,js,css,images...)存在与Web服务器和客户端(浏览器),缓存会根据进来的请求报文做出响应,后...

2985

使用 vmstat 监控系统性能

vmstat 是一种实时收集和报告有关系统内存,交换和处理器资源利用率数据的工具。它可用于确定有关性能的根本原因以及与内存使用相关的问题。

581
来自专栏程序猿DD

秒杀系统解决方案

感谢于霆霖的投稿,本文摘自:http://yutinglin.cn/2017/08/01/秒杀系统解决方案/ 我看了二十篇左右的秒杀系统设计及解决方案的文章,从...

2247
来自专栏web前端教室

学点http、tcp,几句话的事儿

今天群里有同学分享了一个文章,文中说面试的时候,来的人连http协议是啥都不知道,就这样还要16K, 18K的,怎么说的出口,反正文笔很酸爽。

854
来自专栏wannshan(javaer,RPC)

zookeepr--概览

zk 一个分布式应用协调服务 zk是一个分布式,开源的,分布式协调服务,他提供了一组简单的原生接口,分布式应用可以基于它实现,高水准的同步,集群,配置管理和命名...

3498
来自专栏后端技术探索

另一篇mysql防止库存超卖

今天王总又给我们上了一课,其实MySQL处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过;但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这...

561

扫码关注云+社区