CMDB3 完善采集端代码(ssh方案的多线程采集), 异常处理, 服务端目录结构的设计(django的app), API数据分析比对入库

完善一下采集端代码

ssh方案的多线程采集

  • 线程和进程,协程的区别 (90% 问到)
  • 提高并发的话,使用多线程
  • python2 多进程有 多线程没有
  • python3 多进程有 多线程有
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

p = ThreadPoolExecutor(10)

def test(i):
    time.sleep(1)
    print(i)

for i in range(100):
    p.submit(test, i)

- 异常处理
> 增加代码的健壮性,增强代码的容错能力

import traceback

def test():
    try:
        int(‘dsadsa‘)
    except Exception as e:
        print(traceback.format_exc())   # 打印系统报错原文

    print(‘hello‘)

test()

服务端目录结构的设计 django的app

  • api : 负责接收数据, 并且对比入库的
  • backend: 前端数据的展示
  • repository: 负责数据表的设计

设计服务器数据表 (表和表之间关系)

设计表的大原则,建立模型类的根据是:根据客户端传过来的数据类型来去建立对应的表模型类,包括这些模型类中的字段,一定是根据客户端传过来的字段来去定

业务线或者产品线的概念?

腾讯公司有三条业务线或产品线:微信,QQ, 王者荣耀

如果认为是一对多的话,微信产品线可以跑在100台服务器上, 而每一台服务器上只能跑微信这个业务, 属于土豪公司

但是小公司的话,因为没钱,服务少,一条业务线跑在多台服务器上,一台服务器上也可以跑多个业务。此时关系就是多对多关系

API数据分析比对入库

Api/views.py

import json

from django.shortcuts import render,HttpResponse

# Create your views here.
from repository import models
def asset(request):
    if request.method == ‘POST‘:
        info = json.loads(request.body)
        # print(info)
        ### 判断此台服务器是否已经录入到数据库中了
        hostname = info[‘basic‘][‘data‘][‘hostname‘]  ### c1.com
        server_obj = models.Server.objects.filter(hostname=hostname).first()  ###obj
        if not server_obj:
            return HttpResponse(‘资产未录入!‘)

        #### 分析磁盘数据为例
        status = info[‘disk‘][‘status‘]

        if status != 10000:
            models.ErrorLog.objects.create(title=‘错误信息‘, content=info[‘disk‘][‘data‘], server_obj=server_obj)
            return HttpResponse(‘采集出错!‘)

        new_disk_info = info[‘disk‘][‘data‘]

        old_disk_info = models.Disk.objects.filter(server_obj=server_obj).all()

        # [
        #     (slot=0, pd_type=‘sas‘, capacity=256G, ...),
        #     (slot=1, pd_type=‘sat‘, capacity=278G, ...)
        #         .....
        # ]

        new_slot = set(new_disk_info.keys())
        old_slot = []

        for obj in old_disk_info:
            old_slot.append(obj.slot)

        old_slot = set(old_slot)
        print(new_slot)
        print(old_slot)

        ## 增加的是哪一些槽位的值:
        add_slot = new_slot.difference(old_slot)  # 取差集
        if add_slot:
            for slot in add_slot:
                ### {‘slot‘: ‘3‘, ‘pd_type‘: ‘SATA‘, ‘capacity‘: ‘476.939‘, ‘model‘: ‘S1AXNSAF912433K     Samsung SSD 840 PRO Series              DXM06B0Q‘},
                add_disk_info = new_disk_info[slot]
                add_disk_info[‘server_obj‘] = server_obj
                ## 可以增加的变更 {2,3,4,5} 数据记录到变更日志表中
                models.Disk.objects.create(**add_disk_info)

        ## 删除槽位数据
        del_slot = old_slot.difference(new_slot)

        if del_slot:
            models.Disk.objects.filter(server_obj=server_obj,slot__in=del_slot).delete()
            ## 将删除的槽位数据记录到变更日志表中

        # 比较数据是否变动
        up_slot = new_slot.intersection(old_slot)  # 取交集
        if up_slot:
            for slot in up_slot:
                ## {‘slot‘: ‘0‘, ‘pd_type‘: ‘SATA‘, ‘capacity‘: ‘279.396‘, ‘model‘: ‘SEAGATE ST300MM0006     LS08S0K2B5NV‘}
                new_disk_row = new_disk_info[slot]
                ## obj(slot:0, pd_type:sas, capacity:234,...)
                old_slot_row = models.Disk.objects.filter(slot=slot,server_obj=server_obj).first()

                for k,new_v in new_disk_row.items():
                    ‘‘‘
                    k: slot, pd_type, capacity, model...
                    new_v:  0, SATA,  279 , ...
                    ‘‘‘
                    old_v = getattr(old_slot_row,k)

                    if new_v != old_v:
                        ## 记录变更日志
                        setattr(old_slot_row,k,new_v)
                old_slot_row.save()

        return HttpResponse(‘ok‘)
    else:
        ### 主机名提前录入到数据库中
        ### 连接数据库,从数据库中获取主机名
        return [‘c1.com‘,‘c2.com‘,‘c3.com‘]

原文地址:https://www.cnblogs.com/ludingchao/p/12592059.html

时间: 2024-10-27 10:01:00

CMDB3 完善采集端代码(ssh方案的多线程采集), 异常处理, 服务端目录结构的设计(django的app), API数据分析比对入库的相关文章

ssh配置客户端免密钥到服务端

所有操作在client端就ok了. 大致思路如下:在client端,生成公私钥匙对,将公钥上传到服务器上指定的用户(比如说A)的~/.ssh/下 修改下文件,目录权限就ok了,这样你就能能从client向服务端免密钥了, 如果你还想服务端,向客户端免密钥,反过来,就可以了. 譬如,客户端client想免密钥到服务器端的用户A client ip:192.168.200.157 server ip:192.168.200.156 1.ssh-keygen //生成公钥和私钥,一路按回车键就好了 生

Android服务端开发1-使用Eclipse搭建Java Web服务端

本篇博客介绍如何使用Eclipse来创建一个Java Web程序,为后面讲通过Android客户端跟服务端进行交互打下基础,关于服务端可以选用的程序很多,主流的搭配是Android客户端+PHP服务端,我们也可以使用Android客户端+Java EE服务端这样的搭配,就看公司是以哪种方式提供了. 创建一个Java Web程序,没有特别复杂的流程,我们先准备一下原材料: 1. Eclipse(注:这个不是ADT Bundle,最好到官网下载针对开发Java EE的IDE,如果可以的话,选中MyE

Linux SSH服务端配置文件设置

一 SSH概述 SSH 由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台.SSH在正确使用时可弥补网络中的漏洞.SSH客户端适用于多种平台.几乎所有UNIX平台-包括HP-UX.Linux.AIX.Solaris.Digital UN

React服务端渲染总结

欢迎吐槽 : ) 本demo地址( 前端库React+mobx+ReactRouter ):https://github.com/Penggggg/react-ssr.本文为笔者自学总结,有错误的地方恳请各位指出 O(∩_∩)O          序:前言.原因与思路.注意事项与问题.详解.       一.前言 为什么需要服务端渲染?什么情况下进行服务端渲染?笔者认为,当我们要求渲染时间尽量快.页面响应速度快时(优点),才会采用服务器渲染,并且应该“按需”对页面进行渲染 ——“首次加载/首屏”

微信支付服务端开发

前言 最近应公司业务需求,把微信支付完成了,当然已经顺利上线.但是开发的过程是也是踩了很多坑,下面我就先说说开发流程,以及在开发中遇到的大大小小的坑. 开发流程 首先,看一下微信开方平台关于支付的一个时序图,如下: 微信支付时序图https://pay.weixin.qq.com/wiki/doc/api/app/app.php 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付. 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口.参见[统一

【问底】夏俊:深入站点服务端技术(一)——站点并发的问题

url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-03-16%2F2824221&type=3&count=&appkey=&title=%E6%9C%AC%E6%96%87%E6%9D%A5%E8%87%AA%E6%8B%A5%E6%9C%89%E5%8D%81%E5%B9%B4IT%E4%BB%8E%E4%B8%9A%E7%BB%8F%E9%AA%8C%E3%80%81%E6%93%85%E9%95%BF%E7%BD%91%E

Java服务端用CORS方法解决浏览器跨域问题

跨域问题简单来说,就是浏览器访问a.com时,a.com中的javascript,想要访问b.com的资源. 浏览器从安全角度考虑限制了这种行为.所以访问失败了. 解决方案主要有两种: 1.JSONP 2.CORS JSONP JSONP方案是将数据放在服务端的javascript脚本中,请求这个javascript.由于浏览器不限制javascript的跨域访问,因此服务端只要把数据放在这个伪javascript中就可以了.需要服务端定义好存有JSON数据的javascript脚本. CORS

Linux下的TCP/IP编程----进程及多进程服务端

在之前的学习中我们的服务端同一时间只能为一个客户端提供服务,即使是将accept()函数包含在循环中,也只能是为多个客户端依次提供服务,并没有并发服务的能力,这显然是不合理的.通过多进程的使用,我们可以很便捷的实现服务端的多进程,这样就可以同时为多个客户端提供服务. 首先我们要理解程序,进程,进程ID,僵尸进程,线程的概念. 程序:广泛的说就是为了达到某一目的二规定的途径,在编程中具体的就是为了实现某一功能而编写的代码实体,是静态的. 进程:程序的一次动态执行就是一个进程,它是占用了一定内存空间

【问底】夏俊:深入网站服务端技术(一)——网站并发的问题

摘要:本文来自拥有十年IT从业经验.擅长网站架构设计.Web前端技术以及Java企业级开发的夏俊,此文也是<关于大型网站技术演进的思考>系列文章的最新出炉内容,首发于CSDN,各位技术人员不容错过. 注:本文首发于CSDN,转载请标明出处. [编者按] 本文来自拥有十年IT从业经验.擅长网站架构设计.Web前端技术以及Java企业级开发的夏俊,此文也是<关于大型网站技术演进的思考>系列文章的最新出炉内容,首发于CSDN,各位技术人员不容错过. 以下为正文: 一. 引子 <关于