跳转至

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
CRAMBAM 替代压缩比比 BAM 高 40-50%
BCFVCF 替代二进制,随机访问快
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)