# storage_statistics **Repository Path**: microbug/storage_statistics ## Basic Information - **Project Name**: storage_statistics - **Description**: 统一 Python 存储统计工具,支持本地和远程服务器的存储目录使用情况统计。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-28 - **Last Updated**: 2026-01-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 存储空间统计工具 统一 Python 存储统计工具,支持本地和远程服务器的存储目录使用情况统计。 ## 功能特性 - **统一架构**:整合本地和远程存储统计,替代多个 shell 脚本 - **动态线程分配**:根据目录数量自动调整线程数(10-60 范围) - **数据库驱动配置**:目录配置存储在数据库 `t_storage_management` 表中 - **递归目录统计**:支持远程服务器递归统计子目录,深度可配置(0-3 层或全部) - **多种统计模式**: - `du` 模式:目录大小统计(字节单位) - `df` 模式:分区已用空间统计(KB 单位) - **数据持久化**:自动将统计结果存储到 MySQL 数据库 - **邮件通知**:自动发送统计摘要邮件 ## 目录结构 ``` storage_usage_tools/ ├── scripts/ │ ├── storage_statistics.py # 主程序 │ ├── config.yaml.sample # 配置模板 │ ├── calculate_disk_usageV1.2.sh # 原本地统计脚本(已废弃) │ ├── calculate_zaibei.sh # 原远程统计脚本(已废弃) │ └── sendmail.sh # 原邮件脚本(已废弃) ``` ## 快速开始 ### 1. 复制配置模板 ```bash cd scripts cp config.yaml.sample config.yaml ``` ### 2. 编辑配置文件 根据实际环境修改 `config.yaml`: ```yaml # 数据库配置 database: host: "x.x.x.x" port: 3306 user: "xxx" password: "xxx" database: "xxx" table_prefix: "t_storage_" # SSH 服务器配置 ssh_servers: dongguan: user: "root" port: 22 key_file: "/root/.ssh/id_rsa" ``` ### 3. 配置数据库目录 在 `t_storage_management` 表中配置需要统计的目录: ```sql INSERT INTO t_storage_management (storage_identifier, directory, task_identifier, method, server_type, recursive_depth, description) VALUES ('/ZAIBEI/DG', '/data', 'PB', 'du', 'dongguan', 0, '东莞服务器数据目录'), ('/ROOT', '/', 'PB', 'df', 'local', 0, '本地根分区'); ``` ### 4. 运行统计 ```bash # 标准运行 python3 storage_statistics.py # 跳过邮件发送 python3 storage_statistics.py --skip-email # 跳过目录覆盖检查 python3 storage_statistics.py --skip-check # 详细输出 python3 storage_statistics.py --verbose ``` ## 配置参数说明 ### StorageDirectory 参数 | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `storage_identifier` | string | 必填 | 存储标识符,用于区分不同存储池 | | `directory` | string | 必填 | 目录路径 | | `method` | string | `du` | 统计方法:`du`(目录大小,字节) 或 `df`(分区已用空间,KB) | | `server_type` | string | `local` | 服务器类型:`local`(本地) 或 `ssh_servers` 中定义的服务器名称 | | `recursive_depth` | int | `0` | 递归统计深度:0-3 层或 -1(全部) | ### recursive_depth 说明 | 值 | 统计范围 | |----|----------| | `0` | 仅当前目录 | | `1` | 当前目录 + 1 层子目录 | | `2` | 当前目录 + 2 层子目录 | | `3` | 当前目录 + 3 层子目录 | | `N` (N>0) | 当前目录 + N 层子目录 | | `-1` | 所有层级的子目录(无限制) | ## 命令行参数 | 参数 | 说明 | |------|------| | `-c, --config` | 配置文件路径 | | `--skip-email` | 跳过邮件发送 | | `--skip-check` | 跳过目录覆盖检查 | | `--verbose` | 详细输出模式 | | `--use-db-config` | 从数据库读取目录配置(使用 t_storage_management 表) | ## 数据流程 ### 模式1:从配置文件读取目录配置 ```bash python3 storage_statistics.py ``` 1. 从 `config.yaml` 读取目录配置 2. 收集本地和远程存储统计 3. 将结果保存到 `t_storage_count` 表 4. 从 `t_storage_management` 读取预期目录检查覆盖情况 5. 发送邮件通知 ### 模式2:从数据库读取目录配置 ```bash python3 storage_statistics.py --use-db-config ``` 1. 从 `t_storage_management` 表读取目录配置(需要 `task_identifier = 'PB'`) 2. 收集本地和远程存储统计 3. 将结果保存到 `t_storage_count` 表 4. 再次从 `t_storage_management` 读取预期目录检查覆盖情况 5. 发送邮件通知 ## 技术架构 ### 核心组件 1. **ConfigManager** - 配置管理器 - 负责解析 YAML 配置文件 - 支持本地和远程目录配置分离 2. **ThreadCalculator** - 动态线程计算器 - 根据目录数量自动计算最优线程数 - 范围:10-60 线程 3. **LocalStorageCollector** - 本地存储收集器 - 使用 `du` 命令获取目录大小 - 使用 `df` 命令获取分区已用空间 4. **RemoteStorageCollector** - 远程存储收集器 - 通过 SSH 连接远程服务器 - 使用 `du + find` 组合进行递归目录统计 - 动态生成远程执行脚本 5. **DatabaseManager** - 数据库管理器 - MySQL 数据库连接管理 - 统计结果插入 - 目录覆盖检查 - 统计摘要查询 6. **EmailSender** - 邮件发送器 - SMTP 邮件发送 - 统计报告格式化 ### 数据库表结构 ```sql -- 存储空间统计数据表 t_storage_count CREATE TABLE t_storage_count ( id INT(11) NOT NULL AUTO_INCREMENT, job_time DATE NOT NULL, count_time DATE NOT NULL, storage_identifier VARCHAR(255) NOT NULL, directory VARCHAR(255) NOT NULL, storage_capacity BIGINT(20) NOT NULL, PRIMARY KEY (id), KEY idx_storage_identifier_directory (storage_identifier(191), directory(191)), KEY idx_storage_identifier_job_time (storage_identifier(191), job_time), KEY idx_job_time (job_time) ); -- 存储标识符配置表 t_storage_identifier CREATE TABLE t_storage_identifier ( id INT(11) NOT NULL AUTO_INCREMENT, storage_identifier VARCHAR(255) NOT NULL, total_storage_capacity BIGINT(20) NOT NULL, description VARCHAR(255) NOT NULL, threshold VARCHAR(255) DEFAULT NULL, isSendMail INT(11) DEFAULT '0', PRIMARY KEY (id) ); -- 存储管理配置表 t_storage_management CREATE TABLE t_storage_management ( id INT(11) NOT NULL AUTO_INCREMENT, storage_identifier VARCHAR(255) NOT NULL, directory VARCHAR(255) NOT NULL, task_identifier VARCHAR(255) NOT NULL, storage_occupy BIGINT(20) DEFAULT NULL, method VARCHAR(10) DEFAULT 'du', server_type VARCHAR(50) DEFAULT 'local', recursive_depth INT(11) DEFAULT 0, description TEXT, PRIMARY KEY (id) ); ``` ## 日志 程序日志默认输出到: - 标准输出(控制台) - `/var/log/storage_statistics.log` 日志格式: ``` 2024-01-01 10:00:00,000 - INFO - 配置文件加载成功 2024-01-01 10:00:01,000 - INFO - 加载了 15 个存储目录配置 ``` ## 依赖 ``` python >= 3.6 mysql-connector-python pyyaml ``` ## 性能优化 - **动态线程分配**:目录数量 < 50 时分配 10-35 线程,100-200 时分配 40-55 线程,200 以上最多 60 线程 - **超时控制**:本地 du/df 命令 5-10 分钟超时,SSH 命令 30 分钟超时 - **错误处理**:单个目录失败不影响整体统计 ## 注意事项 1. 确保 SSH 密钥已正确配置,能够无密码登录远程服务器 2. 确保运行用户对目标目录有读取权限 3. 数据库连接信息请妥善保管,避免明文泄露 4. 递归深度设为 -1 时可能产生大量输出,建议谨慎使用