541_设计基因组数据存储系统
一句话说明
基因组数据存储系统需要应对 PB 级数据量、多格式文件、高并发读取和严格访问控制的挑战。
核心知识点
数据规模
- 一个人的 WGS 数据约 90GB(FASTQ)
- 10 万样本 → 约 9PB 原始数据
- 加上中间文件(BAM/VCF)约 3-5 倍
- 总计约 30-45PB
存储分层策略(冷热数据)
热数据(频繁访问)→ SSD/NVMe + 内存缓存
- 正在分析的样本
- 近期上传数据
温数据(偶尔访问)→ HDD RAID / Ceph
- 已完成分析,可能再用
- 3-6个月内数据
冷数据(归档)→ 对象存储 S3 Glacier / 磁带库
- 超过6个月未访问
- 仅保留原始数据和最终结果
文件格式优化
| 格式 | 场景 | 优化点 |
|---|
| FASTQ.gz | 原始数据存储 | 压缩比 3:1 |
| CRAM | BAM 替代 | 压缩比比 BAM 高 40-50% |
| BCF | VCF 替代 | 二进制,随机访问快 |
| Parquet | 表格元数据 | 列式存储,查询快 |
| Zarr | 大矩阵数据 | 支持分块读取 |
实战代码/设计图/模板
系统架构图
[客户端/分析节点]
│
[元数据服务(PostgreSQL)]
存:文件路径、样本信息、访问权限
[存储网关层]
├── 热层:Ceph/GPFS(高速并行文件系统)
├── 温层:HDFS / MinIO(对象存储)
└── 冷层:S3 Glacier / 磁带(归档)
[自动分层策略引擎]
- 监控访问频率
- 自动迁移到合适存储层
- 触发数据预热(冷→热)
[数据保护层]
- RAID 6 / Erasure Coding(纠删码)
- 跨机房复制(异地备份)
- 版本控制(防误删)
CRAM 格式使用
# BAM 转 CRAM(更省空间)
samtools view -C \
-T /ref/hg38.fa \ # 需要参考基因组
-o output.cram \
input.bam
# 验证完整性
samtools flagstat output.cram
# 建立索引
samtools index output.cram
# CRAM 转回 BAM(需要参考基因组)
samtools view -b \
-T /ref/hg38.fa \
-o output.bam \
input.cram
元数据数据库设计
-- 样本表
CREATE TABLE samples (
sample_id VARCHAR(50) PRIMARY KEY,
project_id VARCHAR(50) NOT NULL,
patient_id VARCHAR(50),
tissue_type VARCHAR(100),
created_at TIMESTAMP DEFAULT NOW()
);
-- 文件表
CREATE TABLE files (
file_id BIGSERIAL PRIMARY KEY,
sample_id VARCHAR(50) REFERENCES samples(sample_id),
file_type VARCHAR(20), -- FASTQ/BAM/VCF等
file_path TEXT NOT NULL, -- 存储路径
file_size BIGINT, -- 字节数
md5sum CHAR(32), -- 完整性校验
storage_tier VARCHAR(10), -- HOT/WARM/COLD
last_access TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 访问日志
CREATE TABLE access_logs (
log_id BIGSERIAL PRIMARY KEY,
file_id BIGINT REFERENCES files(file_id),
user_id VARCHAR(50),
action VARCHAR(20), -- READ/WRITE/DELETE
accessed_at TIMESTAMP DEFAULT NOW()
);
数据完整性校验
# 生成文件MD5(上传时)
md5sum sample1_R1.fastq.gz > sample1_R1.fastq.gz.md5
# 验证(下载后)
md5sum -c sample1_R1.fastq.gz.md5
# FASTQ 文件行数验证(每条reads占4行)
zcat sample.fastq.gz | wc -l | awk '{print $1/4, "reads"}'
面试常问点
| 问题 | 参考答案 |
|---|
| 如何防止数据丢失? | Erasure Coding、多副本、异地备份 |
| 如何支持随机访问大文件? | BAI/CRAI索引、HTSlib随机读 |
| 如何控制存储成本? | 数据分层、自动归档、重复数据删除 |
| 如何实现多机构数据共享? | 联邦存储、GA4GH DRS协议 |
| 数据删除合规如何处理? | 软删除+审计日志,符合GDPR |
速查表
存储成本参考(2024):
本地 SSD:$200-500/TB
本地 HDD:$20-50/TB
S3标准层:$23/TB/月
S3 Glacier:$4/TB/月
磁带归档:$1-2/TB/月(一次性)
常用生信文件大小参考:
hg38 参考基因组:3.2GB(FASTA)
hg38 BWA索引:~7GB
100M reads FASTQ:~15GB(压缩后)
WES 30x BAM:~15GB
WGS 30x CRAM:~25GB(vs BAM ~60GB)