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 条评论
登录 后参与评论

相关文章

来自专栏哲学驱动设计

WCF 中 TCP 与 HTTP 性能简单比较

在使用 WCF 时,为了更好地进行调试,我都选择了 HTTP 协议进行数据传输。最近项目对性能要求比较高,所以就换成了使用 TCP 协议。并对二者的性能进行了一...

2206
来自专栏网商云

腾讯云一台服务器多IP的超详细配置linux

新账号关联我们公司购买腾讯云产品,有优惠哦!联系电话:13430587834(微信同号)

4.1K12
来自专栏月色的自留地

mac电脑进行可见光通信实验要点

1066
来自专栏BeJavaGod

fastdfs 图片服务器 使用java端作为客户端上传图片

之前有说道搭建fastdfs作为图片服务器,但是没有说明如何真正在代码里调用,那么今天大致讲一下,如何使用java客户端进行上传 首先你得要有一个客户端,导入到...

4144
来自专栏FreeBuf

AWS攻防 | 利用DNS技术突破AWS隔离网络限制进行数据渗漏

AWS客户可以使用默认虚拟私有云(VPC)中的DNS架构,发往AWS管理设施的流量同样也会经过亚马逊域名服务器(AmazonProvidedDNS),但是,这种...

2655
来自专栏乐沙弥的世界

从0到1学习Oracle--备份与恢复-程国华-专题视频课程

版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。 https://blog.csdn.net/robinson_0612/article/d...

1142
来自专栏Golang语言社区

Web负载均衡

序: 对Web站点扩展一开始不宜过早,除非是基于高可用性和就近部署的考虑。但对于架构师而言,在架构设计之初就要有扩展的计划,关键是要清楚何时进行扩展。这...

3697
来自专栏大数据和云计算技术

MongoDB系列10:Change Streams构建实时同步数据流

本文是第10篇,主要讲述Change Streams构建实时同步数据流的实战经验,非常值得一看。

2552
来自专栏腾讯开源的专栏

别小看 Phx 这几位剑客!他们可是微信强大的支持后盾

三位武林高手:轻便简洁的 PhxRPC 框架,基于 Paxos 协议的多机状态拷贝类库 PhxPaxos 以及分布式数据库服务 PhxSQL 。下面,我们将深入...

2.4K3
来自专栏ytkah

织梦DEDECMS后台精简删除不需要的文件

如果是一开始就不想要的话,安装版plus目录下进行如下操作。 删除:guestbook文件夹【留言板,后面我们安装更合适的留言本插件】; 删除:task文件夹和...

5604

扫码关注云+社区