运维开发里的数据动态获取和自动补录

在运维平台的设计中,目前有两套系统是并存,并行发展的,其中一部分原因是涉及的业务不同,关注点不同。所以在设计CMDB的部分时,最开始我是整合了已有的实现,把系统层的指标和数据都录进去了,即录入元信息需要录入数据库层面,系统层面,应用层面等等。

显然这不是一个好方法。如果内存是8G我录入错误,写成了80G有没有问题,在数据库运维平台这边是完全感知不到的,如果后续做了变更,我们也是无法感知的,与其这样,还不如不维护,系统层面的信息可以交由系统运维平台的CMDB即可,而数据库运维平台只需要关注数据库和业务信息即可,如果更进一步,数据库信息其实很多都可以自动发现或者探测得到,唯一需要我们确认的是数据库实例的应用信息。而反过来系统层面对于数据库的元信息有什么需求吗,其实也是有的,比如数据库MySQL的主从不应该部署在一个宿主机上,那么对于系统层面如何去鉴别这个信息呢,显然没有头绪,这就需要数据库层面接口信息来提供数据库的角色,如果数据库角色和服务器层面的信息绑定起来,其实这些信息就可以确认了。

所以在数据库运维平台中,我不刻意去维护系统的信息,而是主要通过API来来访问获取,当然为了提高性能,我会做一层过滤,我会把系统信息都收集一遍,放入本地的数据库表中,如果下一次访问的时候首先在数据库表中查找,如果找到,就直接返回,否则就重新申请获得。

然而看似优化的代码在运维平台中还是抛出了错误。

我看了下代码,大体如下:

vm_info_dict = virtual_machine_info.objects.get(ip=vm_ip_addr)
 print(vm_info_dict)
 if vm_info_dict != None:
    physical_server_ip = vm_info_dict.hostip
    device_info_dict = physical_server_info.objects.get(ip=physical_server_ip)
    phy_contain_vms = virtual_machine_info.objects.filter(hostip=physical_server_ip)
 else:
    token = gettoken('xxxxx', 'xxxxx')
    vm_info_dict=getresponse('https://xxxxx/API/v1/GetServerInfo/'+vm_ip_addr, token)
    physical_server_ip = vm_info_dict.get("hostip")
    print(physical_server_ip)
    device_info_dict=getresponse('https://xxxxxx/API/v1/GetDeviceInfo/'+physical_server_ip, token)

整体的思路就是通过Django API获取虚拟机信息,如果不存在就通过API去访问获取。

这个问题看起来比较奇怪,按照错误的思路,应该是在exception的异常捕获部门来处理,这么做确实是可以的,但是如果要扩展逻辑,异常处理的逻辑就会越来越重,感觉怪怪的。

所以反复测试,也算是明白了,使用get的方式去获取数据,如果获取不到就会抛错,个人感觉这个接口还是不太友好,可以换一种方式,比如filter来实现,因为从表结构能够定位到这是一个主键或者唯一性索引。

所以代码的部分根据count的方式来做了调整,然后在这个基础上又做了改进,即如果在本地的数据库中不存在,则访问接口得到数据库,把数据库下沉到本地,整个过程对于我们使用是透明的,也算是一种比较友好的交互方式。

vm_info_dict_exists = virtual_machine_info.objects.filter(ip=vm_ip_addr).count()
if vm_info_dict_exists >= 1:
    vm_info_dict = virtual_machine_info.objects.get(ip=vm_ip_addr)
    print(vm_info_dict)
    physical_server_ip = vm_info_dict.hostip
    device_info_dict = physical_server_info.objects.get(ip=physical_server_ip)
    phy_contain_vms = virtual_machine_info.objects.filter(hostip=physical_server_ip)
    return_dict["device_info_dict"] = device_info_dict
    return_dict["vm_info_dict"] = vm_info_dict
    return_dict["phy_contain_vms"] = phy_contain_vms
else:
    token = gettoken('xxxx', 'xxxxxx')
    vm_info_dict = getresponse('https://xxxxxx/API/v1/GetServerInfo/' + vm_ip_addr, token)
    physical_server_ip = vm_info_dict.get("hostip")
    print(physical_server_ip)
    device_info_dict = getresponse('https://xxxxxxxAPI/v1/GetDeviceInfo/' + physical_server_ip, token)
    return_dict["device_info_dict"] = device_info_dict
    return_dict["vm_info_dict"] = vm_info_dict
    vm_info = virtual_machine_info()
    ......
    vm_info.memo = vm_info_dict.get("memo")

    vm_info.save()
    phy_exists = physical_server_info.objects.filter(ip=vm_info.hostip).count()
    if phy_exists == 0:
        phy_info = physical_server_info()
        phy_exists = physical_server_info.objects.filter(ip=vm_info.hostip).count()
        if phy_exists == 0:
            phy_info = physical_server_info()
            phy_info.update_date = device_info_dict.get("update_date")
           ......
            phy_info.memo = device_info_dict.get("memo")

            phy_info.save()
        phy_contain_vms = virtual_machine_info.objects.filter(hostip=vm_info.hostip)
        return_dict["phy_contain_vms"] = phy_contain_vms

后续准备对这些信息做更进一步的改进,能够实现元数据的增量刷新,即数据发生变化的时候我会调用接口刷新数据到本地,否则还是保持不变。

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

原文发表时间:2018-05-15

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

关系型数据库与NoSQL数据库场景说明

一个程序员很有必要熟悉或者精通一种数据库,MySQL无疑是首选。为什么使用MySQL呢,因为它是开源的,同时具备轻量、简单、稳定和高性能等特点,尤其是其学习成本...

3296
来自专栏杨建荣的学习笔记

MyCAT中的DDL

今天开发同学提了一个需求,是希望对某一个时间范围的表做DDL操作,看起来好像复杂度也不高。

1553
来自专栏更流畅、简洁的软件开发方式

利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率 续

续 上一篇引起了大家的讨论,看着讨论我是比较晕的,这也怪我没有说清楚,所以再补一个续把问题说清楚吧。 笔记本配置 CPU:Core 2 7250 2.0G ...

2229
来自专栏服务端技术杂谈

快的打车架构实践

1.客户端与服务端通信会遇到哪些问题? 2.怎样基于Storm和HBase打造实时监控平台? 3.怎样对Web系统进行分布式改造? 快的打车从2013年年底到2...

3514
来自专栏数据和云

insert into太慢?Roger 带你找真凶

李真旭(Roger) ACOUG 核心专家,Oracle ACE,云和恩墨技术专家 编辑手记:昨天谈到索引并不是万能的,事实上很多无用的索引给数据库带来很大的维...

4384
来自专栏运维小白

Linux基础(day66)

19.1 Linux监控平台介绍 Linux监控平台介绍 监控存在的原因 站点出了问题,没有人知道,等用户发现了,才提醒供应商;对公司影响很大 常见开源监控软...

26710
来自专栏北京马哥教育

推荐-zabbix原理篇(1)

snmp介绍 介绍zabbix 之前让我们先来熟悉一下什么是snmp? SNMP:Simple Network Management Protoclol 翻译一...

3715
来自专栏「3306 Pai」社区

构建MySQL自动化平台思路

这里做个小预告,可能下周或者下下周。我的好基友顺子要给大家讲讲MHA的故事。请期待~~

1902
来自专栏数据库新发现

Percona最新发布XtraBackup for MySQL 8.0

Percona在9月12日,终于宣布第一个测试用的XtraBackup for MySQL 8.0版本给大家试用:

1261
来自专栏IT技术精选文摘

MongoDB的优缺点及设计拙劣之处

对于使用MongoDB的新人来说,它是一个NoSQL的文档数据库。 文档包括一组键值对并且是MongoDB中的基本数据单元。 它绝对是现在最受欢迎的nosql数...

5299

扫码关注云+社区

领取腾讯云代金券