大数据存储系统与管理

对象存储技术实验

施展
武汉光电国家研究中心 & 计算机学院
华中科技大学
2025-09-16 (第3周周二) 至 10-07 (第6周周二,可能提前至09-28)
19:00~22:00 @ 南一楼116_1

授课教师

需要锻炼的背景能力

计算机专业基础技能

if not 学习过"缺失的一课",至少第6讲:
    if not 独立维护过Github或Gitee等开放Git仓库:
        随我进行课堂练习

计算机教育中缺失的一课官网B站

与本次课程相关的基础训练

  • 1/13: 课程概览与 shell
  • 1/14: Shell 工具和脚本
  • 1/22: 版本控制(Git)

需要掌握的背景概念

对象存储是什么?

从“文件柜”到“仓库”

  • 传统 块存储 → 像硬盘,按“扇区”存,速度快,但不懂文件

  • 传统 文件存储 → 像文件夹,懂目录树,可扩展性有限

  • 对象存储 → 像“带条码的快递箱”

    • 数据 = 对象(文件 + 元数据 + 全局 ID)
    • 扁平空间,无限桶,秒扩 PB
    • HTTP 协议一次搞定存/取/删
  • 参考:对象存储系统与尾延迟问题

为什么对象存储成了云时代的“默认硬盘”?

场景 传统文件痛点 对象存储解法
手机相册备份 小文件多,目录深,延迟高 扁平名空间,毫秒级 GET
AI 训练 千万样本,随机读取 前缀并行,带宽线性叠加
医疗影像 单文件 > 5 GB,合规保存 15 年 分片上传,多副本/EC,WORM
直播回放 流量突增 10 倍 边缘缓存 + 回源,自动扩容
大数据分析 格式杂,schema 常变 元数据随对象走,schema-on-read

本课程与对象存储的关系

  • Lab 1 亲手搭一个“迷你云” → 理解桶/对象/ACL
  • Lab 2 打流量 → 看到 P99 延迟随并发"翘尾"
  • Lab 3 建立预测模型 → 学会"先算再扩",而不是"先卡再加"

掌握对象存储 = 拿到云、AI、大数据的通用钥匙

学习内容

  • Lab 0 (09-16) 准备
    • 按照要求建立实验环境,熟悉基本工具环境
  • Lab 1 (09-23) 实践
    • 搭建使用对象存储系统,实践命令行与API基本功能
  • Lab 2 (09-30 --> 09-28) 分析
    • 观测对象存储基本功能,尝试分析经典性能问题
  • Lab 3 (10-07 --> 09-30) 预测
    • 采集观测典型性能指标,尝试建模进行预测

Lab 0 建立实验环境

实验报告(<学号>-lab.md)模板

姓名:XXX
班级:XXXX 班
学号:^U2023\d{5}$
日期:2025-10-dd

---

# 实验简介

…介绍实验软硬件环境,实验目的和主要实验内容条目…

# 实验内容

## 实验1:搭建对象存储

…实验过程,基本功能测试…

…(可选) 应用集成测试…

## 实验2:观测分析性能

…实验案例,实验负载生成,实验观测,数据分析…

**请注意:确保实验数据完整、可信,观测数据是系统的"指纹",不应有两人份测试数据相同**

## (可选)实验3:尝试建模预测

…求解实际问题,达成额外成就…

# 实验小结

…实验结论和收获…

Lab 1 搭建对象存储

实践基本功能

Operation SQL HTTP
Create INSERT PUT / POST
Read (Retrieve) SELECT GET
Update (Modify) UPDATE PUT / POST / PATCH
Delete (Destroy) DELETE DELETE

【扩展探索】应用集成

通过部署实际应用来了解对象存储在云乃至大模型应用中的角色

Lab 2 观测分析性能

实验测试工具

影响性能的主要因素

典型问题举例

  • 对象尺寸如何影响性能?
    • 对于熟悉的某类应用,根据其数据访问特性,怎样适配对象存储最合适?
  • 如何全面观测I/O延迟?
    • 平均值与统计分布
  • 如果客户端爆满将怎样?
    • 请求并发数如何同时影响延迟分布和吞吐率?如何保障服务质量?
  • 横向扩展系统 (Scaling Out) 效果如何?
    • 向系统中追加更多存储设备或服务器

尾延迟问题

Lab 3 尝试建模预测

  • 一个应用,结合其参数
    • 预测总体尾延迟分布,确定与其访存行为适配的对冲百分位
  • 一段负载,结合其请求序列
    • 预测未来一段时间的IOPS,确定是否在未来使用对冲
      • 高IOPS尽量避免,低IOPS积极发起
  • 一段负载,结合其参数序列
    • 预测未来一段时间的尾延迟分布,用于指导灵活对冲的百分位阈值
  • 系统指标预测模型范例: 数据科学挑战赛:内存故障预测

【扩展探索】baseline

使用s3bench向MinIO发起不同参数请求采集延迟数据,建立回归模型预测尾延迟

  • 预装MinIO单节点
  • s3bench已编译
  • Python3(pandas, scikit-learn, matplotlib)
启动MinIO
minio server /data --console-address ":9001"
创建测试桶
mc alias set myminio http://localhost:9000 minioadmin minioadmin
mc mb myminio/test
运行s3bench采集数据
# 参数扫描:对象大小1KB-1MB,并发1-32
for size in 1024 16384 65536 1048576; do
  for clients in 1 2 4 8 16 32; do
    s3bench -accessKey minioadmin -secretKey minioadmin \
            -bucket test -endpoint http://localhost:9000 \
            -numClients $clients -numSamples 1000 -objectSize $size \
            -verbose >> raw.txt
  done
done
解析延迟数据
import re, pandas as pd
def parse_s3bench(path):
    records = []
    with open(path) as f:
        for m in re.finditer(r'NumClients:\s*(\d+).*?ObjectSize:\s*(\d+).*?P50:\s*([\d.]+)ms.*?P99:\s*([\d.]+)ms', f.read(), re.S):
            records.append({
                'clients': int(m.group(1)),
                'size': int(m.group(2)),
                'p50': float(m.group(3)),
                'p99': float(m.group(4))
            })
    return pd.DataFrame(records)

df = parse_s3bench('raw.txt')
df.to_csv('latency.csv', index=False)
回归模型拟合
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt

X = df[['clients', 'size']].values
y = df['p99'].values

model = LinearRegression().fit(X, y)
print('R²:', r2_score(y, model.predict(X)))

# 可视化
plt.scatter(df['clients'], y, label='P99真实')
plt.scatter(df['clients'], model.predict(X), label='P99预测')
plt.xlabel('并发数'); plt.ylabel('延迟(ms)'); plt.legend(); plt.show()
预测新负载
import numpy as np
def predict_p99(clients, size):
    return model.predict([[clients, size]])[0]

print("12并发 256KB对象 预测P99:", predict_p99(12, 256*1024), "ms")
进一步探索
  • 尝试随机森林/XGBoost提升精度
  • 加入CPU/内存特征
  • 实时仪表盘展示预测曲线
  • 延迟实际上是个分布,怎样预测分布?

评分构成

组成部分组成部分 基础★基础★ 1★★进阶_1★★ 2★★★困难_2★★★
ServerServer Minio Server mock-s3 Ceph
ClientClient Minio Client osm/s3cmd/aws-{cli|shell} boto3/awssdk
Benchmark3Benchmark_3 预置负载范例 选题观察分析 编制实验程序研究
评分标准 每项25分 每项30分 每项35分
  1. 提供有限课堂帮助实验参考库内提供在线资源传送门。
  2. 超过本资料库所提供导引之外部分请自己探索
  3. s3bench/benchio/warp/ossperf……

实验方案示例1:Minio Server (25) + boto3 (35) + 延迟分布随并发数的变化趋势分析 (35)=95分
实验方案示例2:mock-s3 (30) + osm (30) + run-s3bench.cmd (25)=85分

作业提交

在微助教中提交实验报告

提醒:课堂学习也会要求交一份作业,请上传进微助教。

提交日期

第7周周五:2025-10-17

提交内容

课堂部分,华老师会在微助教给出报告要求。

实验部分,按照前述要求用Markdown编写,上传微助教账号,完成作业。

再次强调:观测数据是系统的"指纹",不应雷同

往年作业参考

模范作业