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(数据持久化)