← 返回 Day 78 正文

Day 78 · 图解

Day 078 — 爬虫部署与监控 · 图解

🏗️ 系统架构图

┌─────────────────────────────────────────────────────────────────┐
│                        Docker Compose 编排                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   ┌─────────────┐      ┌─────────────┐      ┌─────────────┐    │
│   │   Scrapyd   │      │    Redis    │      │   MongoDB   │    │
│   │   调度器    │─────▶│  去重/缓存  │─────▶│  数据存储   │    │
│   │  :6800      │      │  :6379      │      │  :27017     │    │
│   └──────┬──────┘      └─────────────┘      └─────────────┘    │
│          │                                                       │
│          ▼                                                       │
│   ┌─────────────┐      ┌─────────────┐      ┌─────────────┐    │
│   │  爬虫实例   │      │ Prometheus  │      │   Grafana   │    │
│   │   x N       │─────▶│  指标采集   │─────▶│  可视化面板 │    │
│   │  并行运行   │      │  :9100      │      │  :3000      │    │
│   └─────────────┘      └─────────────┘      └─────────────┘    │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

数据流向:
  目标网站 ──▶ Scrapyd ──▶ 爬虫实例 ──▶ Pipeline ──▶ MongoDB
                           │
                           ├──▶ Redis(URL去重)
                           └──▶ Prometheus(指标)──▶ Grafana(可视化)

📊 监控指标流转

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│   爬虫实例   │────▶│  指标收集器  │────▶│   Prometheus  │
│              │     │  (内存)      │     │   (时序数据库) │
└──────────────┘     └──────────────┘     └───────┬──────┘
                                                   │
                                                   ▼
                                            ┌──────────────┐
                                            │   Grafana    │
                                            │   可视化     │
                                            │   + 告警     │
                                            └──────────────┘

指标类型:
  Counter:   请求数、错误数(只增不减)
  Histogram: 响应时间分布
  Gauge:     当前并发数、队列长度

🔄 布隆过滤器原理

插入元素 "apple":
  Hash1("apple") = 3  ──▶ 位数组[3] = 1
  Hash2("apple") = 7  ──▶ 位数组[7] = 1
  Hash3("apple") = 11 ──▶ 位数组[11] = 1

位数组状态:[0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, ...]
                         ↑         ↑              ↑
                         3         7              11

查询 "apple":
  Hash1("apple") = 3  ──▶ 位数组[3] == 1 ✓
  Hash2("apple") = 7  ──▶ 位数组[7] == 1 ✓
  Hash3("apple") = 11 ──▶ 位数组[11] == 1 ✓
  全部为 1 → 可能存在(有小概率误判)

查询 "banana":
  Hash1("banana") = 5 ──▶ 位数组[5] == 0 ✗
  直接返回 False → 一定不存在(无误判)

⚡ 批量写入 vs 单条写入

单条写入:
  DB调用  DB调用  DB调用  DB调用  DB调用  DB调用 ...
  ──────  ──────  ──────  ──────  ──────  ──────
  10ms    10ms    10ms    10ms    10ms    10ms
  总计: 60ms (100条数据)

批量写入:
  缓冲  缓冲  缓冲  缓冲  ──▶ DB批量写入
  ───── ───── ───── ─────      ──────────
  0ms   0ms   0ms   0ms       15ms
  总计: 15ms (100条数据)

性能提升: 4x

🐳 Docker Compose 服务关系

                    ┌─────────────────────────┐
                    │     docker-compose.yml   │
                    └───────────┬─────────────┘
                                │
           ┌────────────────────┼────────────────────┐
           │                    │                     │
           ▼                    ▼                     ▼
    ┌─────────────┐     ┌─────────────┐      ┌─────────────┐
    │  scrapyd    │     │   redis     │      │  mongodb    │
    │  爬虫调度   │     │  缓存去重   │      │  数据存储   │
    │  端口:6800  │     │  端口:6379  │      │  端口:27017 │
    └──────┬──────┘     └──────┬──────┘      └──────┬──────┘
           │                    │                     │
           └────────────────────┼─────────────────────┘
                                │
                    ┌───────────┴───────────┐
                    │    共享网络           │
                    │  crawler-network      │
                    └───────────────────────┘

数据卷挂载:
  scrapyd → ./logs:/app/logs(日志持久化)
  redis → redis-data:/data(缓存持久化)
  mongodb → mongo-data:/data/db(数据持久化)