4. 数据库选型与数据存储:时序数据库与关系型数据库的混合使用
做量化交易,数据就是命根子。这话一点都不夸张。
我见过不少团队,策略写得漂漂亮亮,一到实盘就崩在数据层。要么查询太慢,要么存储爆炸,要么数据对不上。说白了,就是数据库没选对。
今天咱们聊聊这个核心问题:时序数据库(InfluxDB / ClickHouse)和关系型数据库(PostgreSQL)怎么搭配着用。
4.1 为什么不能只用一种数据库?
你想想看,量化交易的数据其实分两类。
一类是高频行情数据。比如Level-2快照、逐笔成交、Tick级数据。这些数据的特点是:写入量大、时间戳密集、几乎不修改。我曾在项目中一天写入超过200亿条Tick数据,用PostgreSQL直接写崩了——索引重建花了整整6个小时。
另一类是业务与元数据。比如订单记录、持仓信息、策略参数、用户账户。这些数据的特点是:结构复杂、需要事务支持、经常更新。
所以,没有一种数据库能同时完美搞定这两类需求。混合使用才是正解。
核心原则:
- 时序数据 → 时序数据库(InfluxDB / ClickHouse)
- 业务数据 → 关系型数据库(PostgreSQL)
- 两者通过时间戳和ID关联
4.2 时序数据库选型:InfluxDB vs ClickHouse
这两个我都深度用过。说实话,没有绝对的好坏,看场景。
| 对比维度 | InfluxDB | ClickHouse |
|---|---|---|
| 写入性能 | 极高,单机百万点/秒 | 极高,批量写入更优 |
| 查询灵活性 | 有限,主要针对时序 | 强,支持标准SQL |
| 存储压缩比 | 中等(5-10倍) | 优秀(10-20倍) |
| 运维复杂度 | 简单,开箱即用 | 中等,需要调优 |
| 典型场景 | 实时监控、短周期分析 | 历史回测、大规模分析 |
我个人习惯这样选:
- 如果只是存Tick数据做实时监控,用InfluxDB。部署简单,查询语法也直观。
- 如果需要做复杂的回测分析、跨品种关联查询,用ClickHouse。它的SQL支持太香了。
一个小技巧:
我曾经在项目中同时用了两者。InfluxDB负责实时写入和最近7天的热数据查询,ClickHouse负责冷数据归档和历史回测。中间通过一个定时任务做数据同步。效果非常好,写入延迟控制在毫秒级,历史查询也快。
4.3 关系型数据库:PostgreSQL 的定位
PostgreSQL在我这儿的角色很明确:业务核心。
订单状态、持仓快照、策略配置、风控规则——这些数据必须保证强一致性。时序数据库做不到这一点。
举个例子:
-- 订单表,需要事务保证
BEGIN;
INSERT INTO orders (order_id, symbol, side, price, volume, status, created_at)
VALUES ('ORD202401010001', 'BTCUSDT', 'BUY', 42000.5, 0.1, 'NEW', NOW());
UPDATE account_balance
SET frozen_balance = frozen_balance + 4200.05
WHERE user_id = 1001;
COMMIT;
这种场景,PostgreSQL的ACID特性是刚需。我见过有人把订单数据往ClickHouse里塞,结果并发更新时数据乱套了——嗯,那场面挺尴尬的。
4.4 混合架构实战:数据流怎么走?
下面这张图是我在实盘项目中常用的架构。我把它画成了SVG,方便你理解。
这个架构的核心思路是:写入时分流,查询时聚合。
- 行情数据进来后,写入层根据数据类型和时效性,决定写入哪个数据库。
- 查询层封装了统一接口,上层应用不需要关心数据到底存在哪里。
- 风控系统主要读PostgreSQL,策略引擎主要读ClickHouse,监控面板主要读InfluxDB。
4.5 避坑指南:我踩过的几个坑
坑一:时序数据库的写入限流
我曾经在InfluxDB上没做写入限流,结果行情爆发时写入量暴增,直接把数据库打挂了。后来加了写入队列和限流机制,才稳住。
坑二:ClickHouse的更新操作
ClickHouse不是为频繁更新设计的。我见过有人用它存订单状态,结果每次更新都要重建分区,性能惨不忍睹。记住:ClickHouse只适合写一次、读多次的场景。
坑三:PostgreSQL的时序数据膨胀
有人把Tick数据直接往PostgreSQL里塞,一个月后表体积超过500GB,查询慢到怀疑人生。正确的做法是:PostgreSQL只保留最近几天的热数据,历史数据定期归档到ClickHouse。
4.6 数据同步与一致性
混合架构最大的挑战是数据一致性。我常用的方案是:
- 最终一致性:时序数据允许短暂不一致,通过定时任务补偿。
- 事务边界清晰:业务数据(订单、持仓)只在PostgreSQL中操作,不跨库事务。
- 数据校验:每天凌晨跑一次对账任务,确保三个库的数据能对上。
我的经验:
别追求强一致性。在量化交易里,行情数据晚几毫秒完全能接受。但订单状态必须实时准确。所以,分清主次,该松的松,该紧的紧。
4.7 总结一下
数据库选型没有银弹。InfluxDB、ClickHouse、PostgreSQL各有各的脾气。
- InfluxDB:适合实时监控,轻量灵活。
- ClickHouse:适合历史分析,查询强大。
- PostgreSQL:适合业务核心,稳如老狗。
混合使用不是炫技,是实战逼出来的选择。你想想看,一个系统里既要处理每秒百万级的Tick写入,又要保证订单数据的强一致性,单一数据库怎么可能扛得住?
嗯,今天就聊到这儿。记住:选对工具,事半功倍。
公众号:蓝海资料掘金营,微信deep3321