第二章:日志系统架构——采集、存储与可视化
做市系统的日志,说白了就是系统的“黑匣子”。
我见过太多团队,日志写得乱七八糟,出问题的时候两眼一抹黑。今天咱们就把这套架构拆开揉碎了讲清楚。
2.1 日志采集层:Filebeat vs Logstash
采集层是整个日志系统的入口。我个人习惯把采集层比作“水管工”——你得先把各个源头的数据接进来,还不能漏水。
Filebeat 是轻量级采集器。它占用的资源极少,适合部署在每台交易服务器上。
核心特点:
- 基于Go语言开发,内存占用通常不到20MB
- 支持自动负载均衡,多节点采集不丢数据
- 内置背压机制——当下游处理不过来时,它会自动降速
我在项目中遇到过一个问题:某次行情爆发,日志量瞬间暴涨10倍。Filebeat 的背压机制救了我们的命——它没有把 Elasticsearch 冲垮,而是把数据暂存在本地队列里。
Logstash 则是重量级选手。它更像一个“数据加工厂”。
你想想看,原始日志里可能夹杂着时间戳、线程ID、交易对信息。Logstash 可以帮你做三件事:
- 解析——把非结构化的文本变成结构化字段
- 过滤——只保留你关心的日志级别(比如只保留ERROR和WARN)
- 增强——给每条日志打上地理标签、环境标签
我的建议: 生产环境用 Filebeat 做采集,Logstash 做集中处理。别把 Logstash 部署在每台机器上,太重了。
2.2 日志存储层:Elasticsearch
存储层是整个系统的“仓库”。Elasticsearch 为什么适合做日志存储?
说白了,就三个字:快、准、稳。
快——倒排索引结构,搜索毫秒级响应。准——全文检索,支持模糊匹配和精确查询。稳——分布式架构,节点挂了数据不丢。
嗯,这里要注意一个坑:索引模板。
我曾经犯过一个错误——没有预先定义索引模板。结果 Elasticsearch 自动推断字段类型,把交易金额当成了字符串。查询聚合的时候,数据全乱套了。
正确的做法是:
PUT _index_template/做市系统日志模板
{
"index_patterns": ["market-making-*"],
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"level": { "type": "keyword" },
"symbol": { "type": "keyword" },
"price": { "type": "double" },
"quantity": { "type": "long" },
"message": { "type": "text" }
}
}
}
}
这个模板告诉 ES:所有以 market-making- 开头的索引,都按这个规则来。价格是浮点数,数量是长整型,别给我瞎猜。
避坑指南: 我曾经把分片数设成 5,结果集群负载不均。后来改成 3 个分片,配合 routing 策略,查询性能提升了 40%。
2.3 日志可视化层:Kibana
可视化层是系统的“仪表盘”。Kibana 好不好用?说实话,上手简单,精通难。
我建议你重点掌握三个功能:
- Discover——实时搜索日志,排查问题最快的方式
- Dashboard——把多个图表拼在一起,形成监控大屏
- Alerting——设置告警规则,日志异常时自动通知
举个例子。做市系统最怕什么?订单延迟。
我在 Dashboard 里建了一个“订单延迟监控”面板:
| 指标 | 可视化方式 | 告警阈值 |
|---|---|---|
| 订单处理延迟(P99) | 折线图 | > 50ms |
| 错误日志数量 | 柱状图 | > 100次/分钟 |
| 撮合成功率 | 仪表盘 | < 99.9% |
| 网络延迟 | 热力图 | > 10ms |
为什么用 P99 而不是平均值?因为平均值会掩盖极端情况。你想想看,99% 的订单都在 10ms 内完成,但剩下 1% 的订单延迟了 5 秒——这 1% 可能就是你的大客户。
2.4 整体架构图
下面这张图,是我自己总结的做市系统日志架构。你照着搭,基本不会出大问题。
这张图里,数据从下往上流。每一层各司其职,互不干扰。我见过有些团队把 Logstash 和 ES 装在同一台机器上,结果内存抢来抢去,系统直接 OOM。
我的经验: 每层之间用消息队列(比如 Kafka)做缓冲。这样即使 ES 挂了,采集层的数据也不会丢。做市系统最怕的就是数据丢失——少一条日志,可能就少赚几百万。
2.5 性能调优要点
最后聊几个调优的关键点。这些是我踩过坑之后总结出来的:
- Filebeat 的 harvestor 数量——别开太多,默认 4096 够用。开多了反而浪费 CPU
- Logstash 的 pipeline 配置——workers 数量建议等于 CPU 核心数
- ES 的 refresh interval——默认 1 秒,做市系统可以改成 5 秒,写入性能提升 3 倍
- Kibana 的查询缓存——打开缓存,Dashboard 加载速度能快 80%
嗯,今天就先聊到这儿。这套架构搭好了,你的做市系统就有了“眼睛”。出了问题,看一眼日志就知道问题出在哪一层。