MySQL备份调度器的实现

对于MySQL方向的调度需求考虑了好久,总是感觉不够优雅,不够灵活。从我的感觉来看,如果设置成为crontab,其实管理起来是比较臃肿的。

当然这些可以通过批量管理来实现,或者说是改进,那么接下来的问题便是管理层面的一个问题了,如果管理这些任务,如果2点触发不够合适,那么几点触发合适,如果有100个任务需要分配和管理,调度就需要出手了,在调度层面的实现,如果暴露给系统层面来处理,其实它是很无助的,因为它也不知道该怎么合理的划分,如果按照个数显然是不合理的,有的数据库大,有的小,如果按照个数来划分,其实意义不大,从本质上没有解决切分的核心。

所以调度的逻辑从某种程度来说,需要自己来定制,celery可以实现调度的任务处理,但是它不知道任务间的处理逻辑。所以这个思路来落实,那么我们就需要些一个简单的调度算法。

当然开始说调度算法是枯燥的,我们都看不到结果,还要说一堆的逻辑,所以我们先看一个初步的效果,我们可以自由的指定并行度,然后会基于这个配置信息来进行计算,目前的维度是基于备份时间,备份文件大小和备份时间是成比例的关系,那么我们可以基于一个维度来进行计算。

分组之后,就会在每个备份任务配置后面打一个标签,它是属于哪个组的。一目了然,当然后续要做更多的改进,比如对时间进行细粒度的调度,其实做了分组,再做这个改进,也是行之有道。

一个初步的调度的结果如下,如果看到上面的图,不大确定备份任务是否足够平均,可以简单看一下下面的一个概览图,这是划分为了6个组。

0 [1892, 146, 54, 31, 29, 25]

1 [1500, 218, 204, 114, 59, 30, 27, 25]

2 [1171, 593, 190, 92, 45, 32, 29, 0]

3 [809, 607, 419, 167, 81, 43, 26]

4 [801, 696, 319, 176, 90, 45, 26]

5 [731, 718, 397, 167, 76, 33, 29, 25]

代码层面的实现如下,其实对于单纯的调度算法来说,需要做好数据的输入和输出转换,这个地方也是本次集成的重点和难点。

大体来说分为4个步骤:

1.定义一个数据结构来存放,备份ID和备份时间,另外一个数组存放备份时间的集合

2.基于备份集合来进行分组,就是我们的调度算法

3.基于分组后的结果进行分组匹配

4.对输出结果进行重新的过滤和修改

random_lrandom_list = []
        init_dict = {}
        for tmp in mysql_xtracbackup_rs:
            duration_seconds =(tmp.backup_finishtime-tmp.backup_starttime).seconds
            random_list.append(duration_seconds)
            init_dict[tmp.backup_id] = duration_seconds
        print(init_dict)

        random_list.sort(reverse=1)
        print(random_list)

        GRP_NO = int(grp_no)
        print("grp:",GRP_NO)
        array_group = [[0] * 1 for i in range(GRP_NO)]

        sum_value_array = []
        for i in range(GRP_NO):
            sum_value_array.append(i)

        for i in random_list[1:ARRAY_SIZE + 1]:
            print(i)

        array_sum_group = [0] * GRP_NO

        for index, val in enumerate(random_list[1:GRP_NO + 1]):
            array_group[index][0] = val
            array_sum_group[index] = val

        print(random_list)
        for index, val in enumerate(random_list[GRP_NO + 1:]):
            min_group_no = array_sum_group.index(min(array_sum_group))
            array_group[min_group_no].append(val)
            array_sum_group[min_group_no] += val

        print("array_group", array_group)
        print("array_sum_group", array_sum_group)
        return_dict["array_group"] = array_group
        return_dict["array_sum_group"] = array_sum_group


        for i in range(len(array_group)):
            print i,array_group[i]

        new_dict =[]
        for i in range(len(array_group)):
            for j in range(len(array_group[i])):
                for key in init_dict:
                    if init_dict[key] == array_group[i][j]:
                        print key,init_dict[key],array_group[i][j]
                        array_group[i][j]=key

        for i in range(len(array_group)):
            print i,array_group[i]
            for j in range(len(array_group[i])):
                MySQL_Xtracbackup_RS.objects.filter(backup_id=array_group[i][j]).update(
                    service_level=i+1,
                    )
    retureturn_dict["mysql_xtracbackup_rs"] = MySQL_Xtracbackup_RS.objects.filter(backup_starttime__range=(starttime, endtime))

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

原文发表时间:2018-07-04

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏进击的程序猿

Dynamo:Amazon的高可用性的键-值存储系统

Dynamo是一个分布式键值系统,最初用于支持购物车系统,强调的是提供一个“永远在线“的用户体验。

1092
来自专栏FreeBuf

使用Python以及C++简单绕过反爬虫机制

0x00 某些网站有反爬虫的机制 对于刚学习了几天python的我,对爬虫颇有兴趣,但是某些“想要的”网站上具有反爬虫机制,如果说使用延迟或者代理,这样的效率并...

25010
来自专栏magicsoar

python下的Box2d物理引擎的配置

/******************************* I come back! 由于已经大四了,正在找工作 导致了至今以来第二长的时间内没有更新博客...

3396
来自专栏PaddlePaddle

【FAQ】集群训练与预测相关问题汇总

导语 在使用指南的最后一部分,我们汇总了使用PaddlePaddle过程中的常见问题,本部分推文目录如下: 2.22:【FAQ】模型配置相关问题汇总 2.23:...

3547
来自专栏蓝天

向量时钟解决数据一致性

向量时钟,最早是用于分布式系统中进程间的时间同步。由于在分布式系统中没有一个直接的全局逻辑时钟。在一个由n个并发进程构成的系统中,每个事件的逻辑时钟均由一个n...

1081
来自专栏GreenLeaves

EF基础知识小记二

1、EF的常用使用场景 (1)、维护一个已经存在的数据库,VS提供了工具帮助我们把数据库中的表和视图等对象导入到实体框架.        [数据库=>模型(Da...

1957
来自专栏施炯的IoT开发专栏

Endnote for Windows Mobile

  想必园子里有好多朋友都写过paper吧,在阅读文献的时候,是不是觉得管理文献这个事情很麻烦。我正处于刚刚起步的阶段,英语写译老师Greatlion给我们推荐...

2036
来自专栏LET

谈谈3D Tiles(1):渲染调度

3836
来自专栏何俊林

使用TensorFlow进行训练识别视频图像中物体

本教程针对Windows10实现谷歌公布的TensorFlow Object Detection API视频物体识别系统,其他平台也可借鉴。

4692
来自专栏Java技术栈

2017一季度JAVA面试题锦集

1、如何实现分布式事务,你们公司是怎么解决的? 2、HashMap数据结构及实现原理,其链表是用来解决什么问题的 3、可以自定义java.lang.String...

4225

扫码关注云+社区

领取腾讯云代金券