热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XTOOLS【运维平台】之本地&远程服务器磁盘容量校验(三)

互联网爆炸时代,数据就是金钱,但过期数据如何有效定期压缩,为有效数据留下宝贵空间是很多业务遇到的问题。多数公司采用的方式如下:\x0a\x0ashell脚本以crontab的方式定


XTOOLS【运维平台】之本地&远程服务器磁盘容量校验(三)

目录

一、业务场景1.1 难点UI实现二、本地磁盘容量检验2.1 逻辑架构图2.2 代码逻辑2.3 伪代码2.4 难点三、远程磁盘容量检验3.1 逻辑架构图3.2 代码逻辑3.3 伪代码3.4 难点

一、业务场景

互联网爆炸时代,数据就是金钱,但过期数据如何有效定期压缩,为有效数据留下宝贵空间是很多业务遇到的问题。多数公司采用的方式如下:

  1. shell
    脚本以crontab
    的方式定期压缩/删除/异地备份等方式解决空间不足的问题

  2. 中间过渡服务器临时处理有效数据,定期将数据同步至大数据服务器

  3. DB和文本同时落地,压缩后定期更换新磁带,备份数据做冷备处理

但无论哪种数据,都会存在技术门槛较高
的问题,日积月累和人员不断迭代后容易出现的问题如下:

  1. shell
    脚本改动难度大,没人愿意承担升级改造风险,只能推倒重来或砍掉新需求

  2. 所有工作只能运维通过命令行的方式完成,初级运维无法快速上手

针对如上痛点,xtools平台提供了web化压缩功能,同时每次压缩前能够根据用户输入的目录检测目录对应挂载的磁盘
容量是否足够,避免压缩过程中
磁盘容量爆炸。

1.1 难点

  • 本地服务器通过shutil
    disk_usage
    模块可以轻松实现目录对应的挂载磁盘
    容量检测,远程服务器如何实现呢?

  • 如何以TB GB
    较友好的方式输出磁盘容量?

  • 如何对数学计算取整并以百分比
    的方式输出?

1.2 UI实现

二、本地磁盘容量检验

本地磁盘容量主要通过shutil
模块实现,需要技巧的地方主要是如何以human的方式输出结果

2.1 逻辑架构图

《本地磁盘容量检验.png》

2.2 代码逻辑

  1. 用户在页面输入压缩包要存放的目录

  2. shutil
    模块底层逻辑自动判别目录对应的挂载磁盘,并返回统一单位
    total、used、free
    容量大小

  3. 自定义磁盘容量使用阀值

  4. 计算磁盘已使用的容量,和自定义的阀值做比较

  5. 如果未达到则执行压缩进程,如达到或超过阀值,则返回警告warning

2.3 伪代码

# 以human的方式计算并输出磁盘容量
def gm_conversion(size, *args):
    power = 2 ** 10
    n = 0
    power_n = {0''1'KB'2'MB'3'GB'4'TB'5'PB'6'EB'}
    while size > power:
        size /= power
        n += 1
    return size, power_n[n]
# 自定义阀值,并根据比较结果返回True或False
def usage_greater_than_max(usage, _max):
    """
    :param usage: string. '70%'
    :param _max: eg. '80%'
    :return: True is disk space is low
    """

    avail = int(usage.replace('%'''))
    _max = int(_max.replace('%'''))
    return True if avail > _max else False
# 定义磁盘容量过低时的返回信息
def is_lower():
    """
    usage:
    :return:
    """

    info = {'warning''Disk space is lowwer then 20%'}
    return info
# 计算磁盘容量,格式化指定位数的百分比容量
def disk_space_check_local(path, *args):
    max_usage = '80%'
    total_b, used_b, free_b = shutil.disk_usage(path)
    total_h, total_unit = gm_conversion(total_b)
    used_b, used_unit = gm_conversion(used_b)
    free_b, free_unit = gm_conversion(free_b)
    print('total_h: {:6.2f} {}, used_b: {:6.2f} {}, free_b: {:6.2f} {}'.format(total_h, total_unit, used_b, used_unit,
                                                                               free_b, free_unit))
    usage = format(used_b / total_b, '.0%')
    # check disk space
    flag = usage_greater_than_max(usage, max_usage)
    # return total_h, total_unit, used_b, used_unit, free_b, free_unit
    return flag

2.4 难点

  1. 以human的方式计算并输出磁盘容量

  2. 计算磁盘容量,格式化指定位数的百分比容量

三、远程磁盘容量检验

远程服务器因为python
版本的潜在不同,且不支持远程方式执行shutil
模块的方式,所以着实头疼了一阵子,最终通过传递执行脚本至远程服务器并返回执行结果在Master机计算结果的方式解决了该问题。

3.1 逻辑架构图

《远程服务器磁盘容量检验.png》

3.2 代码逻辑

  1. 用户输出压缩包对应的存放目录

  2. 生成带参数的python
    脚本,通过Ansible scp
    模块将py脚本传输至远程服务器临时目录

  3. 通过Ansible AdHoc
    远程执行py脚本,并接受返回结果(total、used、free
    )

  4. Master
    机执行磁盘容量计算逻辑

  5. 自定义磁盘容量使用上限阀值

  6. 判断磁盘容量是否超过阀值

  7. 未超过,则执行压缩逻辑,超过返回WARNING
    并退出

3.3 伪代码

  • cat fetch_remote_diskusage.py

#!/bin/env python
# 收集远程服务器磁盘容量信息
import os
import collections
import sys
def disk_usage(path='./'):
    st = os.statvfs(path)
    free = st.f_bavail * st.f_frsize
    total = st.f_blocks * st.f_frsize
    used = (st.f_blocks - st.f_bfree) * st.f_frsize
    # _ntuple_diskusage = collections.namedtuple('usage', 'total used free')
    return {'total': total, 'used': used, 'free': free}
    # return _ntuple_diskusage(total, used, free)
    # return {'total': total, 'used': used, 'free': free}
try:
    input_path = sys.argv[0].strip()
    usage = disk_usage(input_path)
    print(usage)
except:
    print({'message''PLZ input path'})
    exit(400)

# 通过Ansible AdHoc传输脚本至远程服务器并执行结果
get_disk_usage = [
    {'action': {'module''copy''args''src=apps/common/fetch_remote_diskusage.py dest=/tmp/fetch_remote_diskusage.py'}, 'name''script_distribute'},
    {'action': {'module''shell''args''python /tmp/fetch_remote_diskusage.py ' + src_path }, 'name''get_disk_usage'},
]

3.4 难点

  1. 如何获取远程服务器磁盘容量

上期回顾:
XTOOLS【运维平台】之文件OR目录压缩(一)

XTOOLS【运维平台】之文件OR目录压缩(二)《本地压缩和远程压缩实现》

下期预告:
XTOOLS【运维平台】之任务定时处理(四)

【the end】


如果觉得有帮助,记得点击上方“运维部落“ → 点击右上角“...” → 点选"置顶公众号 "或“设为星标”

长按关注运维部落(linux178)↓





推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是一个愚蠢的问题,但我只是对此感到好奇.假设我在Pythonshell,我有一些我查询的数据库对象.我做:db.query(的queryString)该查询在0xffdf842c ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
author-avatar
手机用户2502923227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有