# 分桶

## 问题： 物联网场景下的海量数据处理 - 飞机监控数据

```json
{ 
"_id" : "20160101050000:CA2790", 
"icao" : "CA2790", 
"callsign" : "CA2790", 
"ts" : ISODate("2016-01-01T05:00:00.000+0000"), 
"events" : {
    "a" : 31418, 
    "b" : 173, 
    "p" : [115, -134], 
    "s" : 91, 
    "v" : 80
    }
}
```

## 520亿条，10TB - 海量数据

- 10万架飞机
- 1年的数据
- 每分钟一条

|                      | 每分钟1条 |      |
| -------------------- | --------- | ---- |
| 文档条数             | 52.6`B`   |      |
|                      |           |      |
| 索引大小             | 6364`GB`  |      |
| `_id index`          | 1468`GB`  |      |
| `{ts:1, deviceId:1}` | 4895`GB`  |      |
|                      |           |      |
| 文档平均大小         | 92`Bytes` |      |
| 数据大小             | 4503`GB`  |      |

## 解决方案：分桶设计

```json
{ 
    "_id" : "20160101050000:WG9943", 
    "icao" : "WG9943", 
    "ts" : ISODate("2016-01-01T05:00:00.000+0000"), 
    "events" : [
        {
            "a" : 24293, "b" : 319, "p" : [41, 70], "s" : 56, 
            "t" : ISODate("2016-01-01T05:00:00.000+0000“)
        }, 
        {
            "a" : 33663, "b" : 134, "p" : [-38, -30], "s" : 385, 
            "t" : ISODate("2016-01-01T05:00:01.000+0000“)
        }, 
        ...
	] 
}
# 一个文档：一架飞机一个小时的数据，60个events就是一个小时的数据
```

- 可视化表现 24 小时的飞行数据

| 1440次读                     | 每分钟1个文档 | 每小时一个文档 |
| -------------------- | ------------- | -------------- |
| 文档条数             | 52.6`B`       | 876`M`         |
|                      |               |                |
| 索引大小             | 6364`GB`      | 106`GB`        |
| `_id index`          | 1468`GB`      | 24.5`GB`       |
| `{ts:1, deviceId:1}` | 4895`GB`      | 81.6`GB`       |
|                      |               |                |
| 文档平均大小         | 92`Bytes`     | 758`Bytes`     |
| 数据大小             | 4503`GB`      | 618`GB`        |

## 模式小结：分桶

| 场景     | 痛点                       | 建模的方案及优点                                 |
| -------- | -------------------------- | ---------------------------------------------------- |
| 时序数据 | 数据点采集频繁，数据量太多 | 利用文档内嵌数据，将一个时间段的数据聚合到一个文档里 |
| 物联网   |                            | 大量减少文档数量                                     |
| 智慧城市 |                            | 大量减少索引所占用空间                               |
| 智慧交通 |                            |                                                      |

