Chuyển đến nội dung chính

レッスン 12: データ ストレージ パターン - オブジェクト ストレージ、データ レイク、時系列

オブジェクト ストレージ (S3) のアーキテクチャと使用例。データレイク、データウェアハウス、レイクハウス。メトリクスと IoT 用の時系列データベース。検索エンジン (Elasticsearch)。実際にはポリグロットの持続性。

🏗️ アーキテクチャ — レッスン 12 レッスン 12: データ ストレージ パターン - オブジェクト ストレージ、データレイク、時系列

システムアーキテクチャ: ゼロからヒーローへ

パート 3: データベース アーキテクチャとデータ管理

xdev.asia

はじめに

すべてのデータがリレーショナル データベースに適しているわけではありません。写真、ビデオ、ログ、メトリクス、検索インデックス — それぞれの種類のデータには適切なストレージ エンジンが必要です。この記事では、特殊なストレージ システムについて説明します。


1. オブジェクトストレージ

1.1 オブジェクトストレージとは何ですか?

Traditional File System:          Object Storage:
  /home/                           ┌─────────────────────┐
    /images/                       │     Flat Namespace   │
      /2024/                       │                      │
        /01/                       │  key → object (blob) │
          photo.jpg                │  key → object (blob) │
                                   │  key → object (blob) │
  Hierarchical                     └─────────────────────┘
  Directories, inodes              Flat, HTTP API
  Mount required                   REST access

1.2 S3 互換アーキテクチャ

Client: PUT /bucket/images/photo.jpg
         │
         ▼
  ┌──────────────┐
  │  API Gateway  │  ← REST: GET, PUT, DELETE, LIST
  └──────┬───────┘
         ▼
  ┌──────────────┐
  │  Metadata    │  ← Key → location mapping
  │  Service     │  ← ACL, versioning, lifecycle
  └──────┬───────┘
         ▼
  ┌──────────────────────────────────┐
  │  Data Layer (Distributed)       │
  │  ┌──────┐ ┌──────┐ ┌──────┐    │
  │  │Node 1│ │Node 2│ │Node 3│    │ ← 3x replication
  │  └──────┘ └──────┘ └──────┘    │
  └──────────────────────────────────┘

1.3 使用例

使用例例
静的資産画像、CSS、JS → CDN 原点
バックアップデータベース ダンプ、ログ アーカイブ
データレイクストレージ分析用の生データ
メディアビデオ、オーディオ ファイル
ML アーティファクトモデル ファイル、トレーニング データセット

1.4 署名付き URL パターン

Vấn đề: User upload file 100MB qua API server → bottleneck

Giải pháp: Presigned URL - upload trực tiếp lên S3

  Client → API: "Tôi muốn upload avatar.jpg"
  API → S3: GeneratePresignedURL(PUT, bucket, key, 15min)
  API → Client: "Upload tại URL này (hết hạn 15 phút)"
  Client → S3: PUT trực tiếp (không qua API server)
  S3 → SNS/Lambda: Trigger post-processing
# Python - Generate presigned URL
import boto3

s3 = boto3.client('s3')
url = s3.generate_presigned_url(
    'put_object',
    Params={'Bucket': 'my-bucket', 'Key': 'uploads/avatar.jpg'},
    ExpiresIn=900  # 15 minutes
)

2. データレイク vs データ ウェアハウス vs レイクハウス

2.1 比較

Data Warehouse:           Data Lake:              Lakehouse:
┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐
│ Structured only  │   │ Raw everything   │   │ Best of both     │
│ Schema-on-WRITE  │   │ Schema-on-READ   │   │ Schema evolution │
│ SQL queries      │   │ Any processing   │   │ SQL + ML + Stream│
│ Expensive        │   │ Cheap storage    │   │ Open formats     │
│                  │   │                  │   │                  │
│ Redshift, BQ,    │   │ S3 + Spark,     │   │ Delta Lake,      │
│ Snowflake        │   │ HDFS            │   │ Apache Iceberg   │
└──────────────────┘   └──────────────────┘   └──────────────────┘

2.2 データレイクのアーキテクチャ

Data Sources              Ingestion           Storage Layers
┌──────────┐             ┌─────────┐        ┌─────────────────┐
│ APIs     │────────────►│         │───────►│ Raw Zone        │
│ DBs      │────────────►│ Kafka/  │───────►│ (landing)       │
│ Logs     │────────────►│ Spark   │        ├─────────────────┤
│ IoT      │────────────►│ Airflow │───────►│ Cleaned Zone    │
│ Files    │────────────►│         │        │ (validated)     │
└──────────┘             └─────────┘        ├─────────────────┤
                                            │ Curated Zone    │
                                            │ (analytics-ready│
                                            └────────┬────────┘
                                                     │
                                            ┌────────▼────────┐
                                            │ Consumption     │
                                            │ BI, ML, Reports │
                                            └─────────────────┘

3. 時系列データベース

3.1 時系列データの特性

Đặc điểm:
  - Append-mostly (ít update, delete)
  - Time-ordered
  - High write throughput
  - Recent data truy vấn nhiều hơn
  - Aggregations: avg, sum, percentile theo time window

Ví dụ:
  Metrics: CPU usage mỗi 10s, 100 servers → 864K points/ngày
  IoT: 10K sensors, mỗi giây 1 reading → 864M points/ngày

3.2 最適化

1. Time-based partitioning:
   ┌──────────┐ ┌──────────┐ ┌──────────┐
   │ Jan 2024 │ │ Feb 2024 │ │ Mar 2024 │
   └──────────┘ └──────────┘ └──────────┘
   → Drop old partitions thay vì DELETE

2. Columnar storage:
   Row:    [time, cpu, mem, disk] [time, cpu, mem, disk] ...
   Column: [time, time, time...] [cpu, cpu, cpu...] [mem, mem, mem...]
   → Compression tốt hơn (cùng type data)
   → Aggregation nhanh hơn

3. Downsampling:
   Raw: 1 point/giây (86400/ngày)
   1h:  1 point/giờ (24/ngày)
   1d:  1 point/ngày
   → Giữ raw 7 ngày, 1h 30 ngày, 1d mãi mãi

3.3 一般的な TSDB

データベース建築利点
InfluxDBスタンドアロン/クラスター簡単なセットアップ、InfluxQL
タイムスケールDBPostgreSQL 拡張機能完全な SQL、ハイパーテーブル
プロメテウスプルベースのメトリクスK8s ネイティブ、PromQL
クリックハウスカラムナ型 OLAP非常に高速な集約
ビクトリアメトリクスプロメテウス互換ストレージ効率

3.4 PromQL の例

# CPU usage trung bình 5 phút
avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)

# Request rate per second (QPS)
rate(http_requests_total[5m])

# 99th percentile latency
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# Alert: CPU > 80% trong 5 phút
avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) < 0.2

4. 検索エンジン

4.1 Elasticsearch アーキテクチャ

Cluster
├── Node 1 (Master + Data)
│   ├── Index: products
│   │   ├── Shard 0 (Primary)
│   │   └── Shard 2 (Replica)
│   └── Index: logs
│       └── Shard 1 (Primary)
│
├── Node 2 (Data)
│   ├── Index: products
│   │   ├── Shard 1 (Primary)
│   │   └── Shard 0 (Replica)
│   └── Index: logs
│       └── Shard 0 (Primary)
│
└── Node 3 (Data)
    ├── Index: products
    │   └── Shard 2 (Primary)
    └── Index: logs
        └── Shard 1 (Replica)

4.2 転置インデックス

Documents:
  Doc 1: "Kiến trúc hệ thống phân tán"
  Doc 2: "Thiết kế hệ thống chat"
  Doc 3: "Kiến trúc microservices"

Inverted Index:
  "kiến trúc"  → [Doc 1, Doc 3]
  "hệ thống"   → [Doc 1, Doc 2]
  "phân tán"   → [Doc 1]
  "thiết kế"   → [Doc 2]
  "chat"       → [Doc 2]
  "microservices" → [Doc 3]

Query: "kiến trúc hệ thống"
  → "kiến trúc" ∩ "hệ thống" = [Doc 1]
  → Score: Doc 1 (match cả 2) > Doc 2, Doc 3

5. 多言語の永続性

5.1 電子商取引の例

┌─────────────────────────────────────────────────┐
│                 E-Commerce App                   │
├─────────┬──────────┬──────────┬────────┬────────┤
│ Users   │ Products │ Orders   │ Search │ Cache  │
│         │ Catalog  │          │        │        │
│PostgreSQL│ MongoDB │PostgreSQL│Elastic │ Redis  │
│         │          │          │Search  │        │
│Relational│Document │ACID txns │Full-text│Session│
│Schema   │Flexible  │Consistent│Scoring │Cart   │
│Joins    │Nested    │Foreign   │Facets  │Rate   │
│         │attrs     │keys      │        │Limit  │
└─────────┴──────────┴──────────┴────────┴────────┘
         │                                │
    ┌────▼────┐                    ┌──────▼──────┐
    │ S3      │                    │ InfluxDB    │
    │ Images  │                    │ Metrics     │
    │ Files   │                    │ Monitoring  │
    └─────────┘                    └─────────────┘

概要

ストレージの種類最適な用途例
RDBMS構造化、ACIDユーザー、注文、請求
ドキュメントDB柔軟なスキーマ製品カタログ、CMS
キーと値シンプル、速いキャッシュ、セッション
オブジェクトストレージファイル、BLOB画像、ビデオ、バックアップ
時系列メトリクス、IoTモニタリング、センサーデータ
検索エンジン全文検索製品検索、ログ
グラフデータベース人間関係ソーシャルネットワーク、詐欺
データレイク生の分析ML、BI、レポート

演習

  1. ストレージ設計: 医療システムのストレージ アーキテクチャを設計します: 患者記録 (HIPAA 準拠)、医療画像 (DICOM)、バイタル サイン モニタリング、処方箋検索。ユースケースごとにどのデータベースを選択すればよいでしょうか?

  2. 時系列: IoT システムには 50,000 個のセンサーがあり、各センサーは 5 秒ごとにデータを送信します。 1 年間に必要なストレージを計算します。保持ポリシーを設計します。

  3. 検索アーキテクチャ: 電子商取引には 1,000 万個の商品があります。検索システム設計は、全文検索、フィルター (価格、ブランド、カテゴリ)、ファセット ナビゲーション、自動提案をサポートします。