2020/04/25 03-Master端数据存储设计和实现

在这里插入图片描述

注册数据到了master,master需要进行管理,用户通过web页面提交的任务也需要管理起来,有用户就需要数据库,建user表,建权限表,web实现对用户的访问控制,一旦用户验证通过后,用户提交的数据必须通过数据库持久化记录下来,也就是用户几点几分登录了,发了什么任务交给什么机器,都需要保存下来。

现在要解决agent发来的reg注册信息如何解决,现在是agent自己看有没有id文件,没有就自己创建一个,然后发给master来注册

保存agent和task对象的状态
在这里插入图片描述
在这里插入图片描述

下面要设计agent类,用一个个实例来存储注册后的信息,agent要建立类,并且实例化,用户发过来的数据有id,hostname,时间戳,ip,用户注册的时间还是要记录一下的,可以用自己的时间,可以在这里做时间校验,时间差异大,就没资格成为agent,可以加一个时间校验,注册完,返回一个none
在这里插入图片描述
在客户端,cm关心这个ack,如果是none,相当于自己出了问题
在这里插入图片描述
在这里插入图片描述
官网里还可以放异常处理在这里插入图片描述
拿到字典之后,会拿到一个时间戳,然后进行时间校验,如果过失败就raise 一个exception,也可以约定好写一个类,放到common里,写一个异常类继承出来,自己写一个时间校验失败的异常类,抛出去,这样别人引用common里的这个异常类,就可以解开了
在这里插入图片描述
暂时不自己写异常类

在这里插入图片描述
注册时间可以有几种方案,客户端发来的时间,2.用服务器自己的时间,剩下的是self.id=id等,记录agent,如果写的好一点,应该在注册信息里加个状态,告诉是running还是失败,成功。
现在先使用最简单防范,初次注册

这里主要是如何将agent信息封装成一个类来,来记录这些信息
在这里插入图片描述
还可以提供一个字段outputs,每一个agent执行任务,如果像遍历所有的任务和结果,可以放在这个字典里。告诉你这个agent上曾经运行多少任务,每个任务的结果
在这里插入图片描述
在这里插入图片描述
这个agent和agent包里的agent是两回事情

在这里插入图片描述
这是来帮我们存储注册信息的

在这里插入图片描述
现在看task,每一个任务都不同,肯定有id,任务谁派发的,可以把脚本拿到(命令的列表,其实就是shell),有时候关心任务跑起来,真正执行完的时间,可以给一个时间的上限

在这里插入图片描述

还有就是选择哪台主机。其实就是列表,一个个id对应前面webserver传过来的id
在这里插入图片描述
这个是当前的小任务,必须发到几台机器上去执行,这是所有agent能选择的id的列表
在这里插入图片描述
还有必须有的状态,任务的状态转化非常重要,还有并发的上限数,不能1000台都要执行,就一下执行1000台,就是最大同时又几个agent可以跑,现在可以告诉对方,最大并发是多少

在这里插入图片描述
现在加入下发任务指派10个agent来执行,加入成功了9个,失败了1个就需要定义这个任务是否成功了,可以定义至少几台失败,至多几台失败,达到阈值就认为是失败,失败有失败的策略,可以重新下发任务再次尝试

在这里插入图片描述
还可以用几率来判断rate
在这里插入图片描述
设定一些阈值来判断是否成功,比如10个节点,有5个节点计算出来的达到了设定范围,不是所有计算会有一个准确值,有些计算是迭代的计算,是收链的计算,每一次得到的结果不一样。
如果10台,有6台算出的结果是符合要求的,此次任务成功,所以下发任务还可以带标准值,或者区间,是你想要的就return 0,不是就return其他的

在这里插入图片描述
这样前端webserver可以想象成一个页面,用户填一个脚本,选一个时间,可以选择机器,然后选择最大并发数,同时有几台可以执行
在这里插入图片描述
有并发数,和失败的计数,这样就差不多了
在这里插入图片描述
在这里插入图片描述
现在改个最大并发是1
在这里插入图片描述
可以用repr来进行展示
在这里插入图片描述

现在造出一个个任务,实例,就需要存储,需要做持久化。
master要管理所有的agent

在这里插入图片描述
message放在cm中,类似handler,所以它来存储不太合适

在这里插入图片描述
专门有个东西可以做持久化,可以写model类,storage,负责数据存储,需要把agents注册的agent的字典和tasks任务字典,存进去。
可以写方法,方法里做判断在注入

在这里插入图片描述
这里先修改,把三项传进去
在这里插入图片描述
现在没有考虑有一些agent被删掉了,这些废的agent怎么办,目前先考虑信息如何存储,现在这样注册一次就是新的agent,即使这个agentid已经在agents存在了,还是要覆盖的
在这里插入图片描述
可以把已经存在的id的值,更新一下就行了,这句话没有问题,只是同一个id覆盖了

在这里插入图片描述
可以进行判断一下,有就更新,没有就新增
在这里插入图片描述
在写message的时候,所有内容分开了,各自完成各自的事情

在这里插入图片描述
只要是存储都加入store,这里只暴露接口,通过rpc暴露接口调用,把信息发给store,至于信息存不存在于store
在这里插入图片描述
存下来就可以在storage里看到信息了
在这里插入图片描述

在这里插入图片描述
有时候没有注册,heartbeat也带了信息,但是怕最后真正去自己去构建的时候,heartbeat和现在的heartbeat设计不一样,如果只是带时间戳和id,就没什么好更新的,只能更新状态,是否掉线,heartbeat掉线了还要更新agent对象上的某一个
在这里插入图片描述

这里只是在store里存储什么信息,跟之前的heartbeat不一样,假设heartbeat信息只有id和时间戳,agent上加一个信息,就是最后一次报道时间

在这里插入图片描述
agent上加一个信息,就是最后一次报道时间lastupdatetime
在这里插入图片描述
heartbeat来了之后回调用storage,也就是现在改成reg的这个方法

在这里插入图片描述
每一次heartbeat都会去里面,找已经 有的,把最后一次更新的时间戳时间写进来

在这里插入图片描述
还需要再起一个线程,就要遍历里面的所有数值,遍历之后就拿当前时间进行比较

在这里插入图片描述
借助redis,就不怕过期,不仅要对heartbeat更新,还要再起一个线程对同一个进行遍历,如果出错,一边写一边读,就有可能冲突,就可以借助redis
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
heartbeat最后这样比较好,如果有其他信息修改,就单令再发修改,再写几个方法,这些方法只是偶尔做,注册也是注册几下,心跳比较多,也可以想办法单另出来。
在这里插入图片描述
心跳的业务只是做了一件事情,告诉你刚才来过,说明是ok的
在这里插入图片描述
在这里插入图片描述

这里都是调用store方法
在这里插入图片描述
message就负责消息处理,rpc调用接口的暴露
在这里插入图片描述
关于持久化和存储都交给store
在这里插入图片描述
这样就实现了agent动态注册

在这里插入图片描述
一个人做,就按照现在的方式,agent主要实现一部分功能,master主要实现一部分功能,把他们串起来,然后看前后打通之后,再对agent,master补充一些功能,这样平台就一点点累积起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值