有个团队把自建 Graylog 装在一台 32 核 64GB 内存、4TB NVMe 的服务器上。上线前有人提议"内存这么富裕,JVM 堆给大点索引查询都快",于是把 Elasticsearch 的 -Xmx 调到了 48GB。结果很反直觉:写入没变化,同样的检索从几百毫秒涨到好几秒,高峰期还出现十几秒的节点停顿。他们排查网络、磁盘、处理流水线,最后发现问题在那个"给大点"的决定——堆吃掉 48GB 之后,操作系统只剩不到 16GB 做页缓存,Lucene 读段大量落到物理读;同时堆越过 32GB 那条线,压缩指针失效,同样对象占更多空间,48GB 堆实际装不下比 31GB 多得多少少的东西。改回 31GB,查询立刻恢复。
把整篇的账一句话说完:Graylog 这套东西的成本,百分之八九十在它背后的 Elasticsearch / OpenSearch 索引层。Server 只是接收、解析、路由、告警的一层应用,MongoDB 只是存配置的小仓库,真正吃磁盘、内存与 CPU 的是那层倒排索引。而日志负载的形状很特殊:写多读少,写入是持续水流,读取偶发但一发起就可能横跨几十天、把磁盘 IO 打满。所以规划这类平台唯一要算清的问题就是:每天进来多少 GB、留多少天、因此需要几台什么样的机器。下面四项是全文的地基:MongoDB 不存日志,几百 MB 到一两 GB 的量级给大磁盘纯属浪费;容量是连乘的,日增量 × 膨胀系数(经验值 1.1–1.6)×(1+副本数)× 留存天数,再乘 1.2–1.3 水位余量;堆取物理内存的一半与 31GB 中较小值,剩下的全留给页缓存;分片控制在 20–50GB 量级(经验值)并按天滚动,因为删一个索引只是文件系统操作,在大索引里按条件删文档则是段合并级别的重写。
Graylog 的完整链路只有三层,资源画像完全不同:Server 是 CPU 型的,数据节点是磁盘加内存型的,MongoDB 是几乎可以忽略型的。把这三层搞混,是多数装机方案一开始就错的原因——常见做法是三样东西装一台机器、配一块巨大的数据盘,然后应用层和数据库跟着资源波动一起抖。
Graylog Server 是 Java 写的,负责接收消息、走处理流水线做解析与富化、按流路由到索引集、执行告警与聚合、提供界面与接口。它不持久化日志正文,日志最终由它批量写进后端数据节点。这一层的开销主要落在 CPU:正则抽取、Grok 匹配、流水线规则的条件判断,都是按"每条消息 × 每个规则"付费的操作。相比数据节点,它对磁盘几乎没要求,中小规模下几 GB 到十几 GB 的堆通常够用,取决于每秒事件数与规则复杂度。
数据节点也就是 Elasticsearch 或 OpenSearch,这里是日志正文唯一的落地位置,也是全部成本的中心:把文档切成倒排索引并存下原文与列式结构,决定磁盘占用;把频繁访问的数据常驻页缓存,决定查询有多快;段合并、副本恢复、快照这类后台任务吃的是磁盘带宽与 CPU。所以数据节点的正确形态是"大磁盘 + 中等内存 + 中等 CPU",而不是堆拉满的大内存机器。
最后是 MongoDB,必须单独说清楚:它存的是配置,不是日志。里面放的是用户与权限、输入定义、抽取器与流水线规则、流配置、仪表盘布局、告警定义与历史,日志正文一个字节都不进 Mongo。由此得到几条部署判断:磁盘给 20–50GB、放在普通固态盘上足够;它挂掉的后果是"界面打不开、告警不跑",而不是"历史日志查不到"——数据还在节点上,修起来几分钟的事;稍微正式的部署建议配副本集,但副本集同样不需要大磁盘。把预算从 Mongo 那块盘挪到数据节点的磁盘上,是这套架构里性价比最高的挪法。
三层能不能合并?小规模可以但要想清楚代价。日增量在几 GB 以内、检索需求弱的团队三合一能省事省钱,代价是互相抢内存抢 IO、排障路径纠缠。一旦日增量超过十几 GB 或开始有并发检索压力,就应先把数据节点拆出去,再往后把 Server 独立出来做双实例加负载均衡;顺序跟着压力来源走:先看数据节点的磁盘与 IO,再看 Server 的 CPU。
日志从业务机器到数据节点要经过一个"入口",生产里最常见的是四类:Beats、Syslog、GELF,以及以 Kafka 为代表的消息队列作为传输层。决定它们会不会丢日志的关键变量是同一个:有没有确认机制、有没有落盘的本地状态。
Beats(最常用的是 Filebeat)是目前最稳妥的一类,它在发送端维护本地状态文件记录每个文件读到的位置,只有收到下游确认才往前推进,进程重启、网络短中断都不丢。它的风险不在传输而在采集侧:容器环境下 stdout 日志轮转策略过于激进时,文件被删后 inode 变了,状态文件里那条记录就成了孤儿,轮转丢弃的内容永久丢失;采集目录被写满同样会静默丢。所以配 Beats 必须同步配好轮转策略、目录磁盘监控与发送端缓冲。
Syslog 历史最久也最容易踩坑,风险几乎全部来自 UDP:没有任何确认机制,端口缓冲溢出、进程来不及读,都是静默丢弃,事后既察觉不了也补不回来。它只在完全可控、丢几条无所谓的局域网场景里可接受;重要日志必须走 TCP Syslog(最好带 TLS),代价是每条连接都要维护状态,突发时积压队列可能被打满。另一个固有问题是多行日志(异常堆栈那类)会被按行拆开,需要在采集侧或流水线里做行合并。
GELF 是 Graylog 自己的扩展日志格式,支持 UDP 与 TCP 两种承载。UDP 模式下有分块机制:超过 MTU 的消息被切成多块发送,接收端在几秒量级的超时窗口内等齐再组装,丢任意一块整条消息就报废,而且连残缺的都看不到。它适合应用与本机房 Graylog 之间、网络稳定的场景,跨公网跨地域不要用;让业务进程直发 GELF 等于在业务线程里嵌一段网络 IO,下游慢会反向拖住业务,除非用了异步方式。
第四类是把消息队列放进链路中间,它改变的不是吞吐而是形状:把"下游能不能马上吃下去"和"上游能不能继续发"彻底解耦。业务侧投进 topic 就算完成,Graylog 按自己节奏批量消费,跟不上就积压但不丢,下游恢复后还能重新消费。要注意三点:topic 保留时间决定你能容忍消费端停多久;副本数决定 broker 故障时会不会丢;位移管理决定是"至少一次"(可能重复)还是"最多一次"(可能丢)。日志平台宁可重复也不能丢,一律走至少一次语义。
这一节解释的是"为什么很多人会在最需要日志的时候发现日志没了"。典型触发场景就是后端的短暂不可用:数据节点一次长 GC 停顿几十秒、因为磁盘水位策略被设为只读、因为某节点宕机导致分片大规模重分配抢占 IO、因为一次段合并把磁盘带宽吃干净。这些都不罕见。
这时链路会发生反向传导:数据节点变慢 → 写入超时或被队列拒绝 → 输出缓冲积压 → 处理缓冲填满 → 输入侧开始阻塞。Graylog 内部有一层落盘的消息日志(disk journal),把来不及处理的消息暂写本地磁盘,这是第一个缓冲;它有容量上限(可配占用多少空间、保留多久),所以只能吸收有限时间的抖动。
有一笔必须亲自算的时间账:能扛多久 = 缓冲容量 ÷ 实际摄入速率。日增 50GB 折算平均约 0.6MB/s,缓冲配 8GB 时理论上能吸收约 3.7 小时的完全中断(估算值)。但有两个折扣:真实摄入是脉冲的,业务高峰可能是均值的 3–5 倍,中断落在高峰期要按峰值折算;更常见的是"能写但极慢",一边进一边出,可用时间反而不直观。结论很实在:半小时到一两小时的抖动基本能扛,跨小时甚至跨天的故障没有外部队列一定会丢。
而丢的恰恰是故障发生的那几个小时,且通常是静默的——界面上一片绿,谁也不会意识到缺了这段,等到要排查"数据库为什么在那个时刻慢了"才发现日志已经不在。给一条可以直接执行的判断:只要日志有合规留存要求,或者日增量在几十 GB 以上,就应该引入消息队列削峰,它把"下游能否跟上"从可靠性问题降级成延迟问题。规模小要用替代方案兜底也行:缓冲放独立固态盘、给足容量、配使用率告警,并且每天核对实际入库条数与预期是否匹配——这最后一条是唯一能发现静默丢日志的手段。
算法本身不复杂,麻烦的是每一项的取值都要有依据。完整公式为:所需容量 ≈ 日增原始日志量 × 膨胀系数 ×(1 + 副本数)× 留存天数 ×(1 + 水位余量)。下面逐项说明取值依据。
第一项是日增原始日志量,指日志文本本身的字节数,按字节算而不是按"看起来多大",也不要拿压缩后的文件当原始量;业务有明显周峰时取峰值日,或给一个倍数。
第二项膨胀系数最容易被拍脑袋。经验区间是 1.1–1.6(经验估算,不是保证值),含义是"写进 Lucene 之后占的磁盘约为原始文本的 1.1–1.6 倍"。它由四件事决定:原文要不要存;给多少字段建倒排索引;列式结构带来的额外开销;压缩算法的选择,偏向压缩比的编码通常还能再省一部分(经验估算百分之十几到三十几)。变量一变,系数就在区间里大幅移动,所以正确做法是拿自己的真实日志跑 24–48 小时实测反推。
第三项副本。副本数 = 1 意味着每份数据在集群里有两份,磁盘占用直接乘 2,价值是节点故障时数据仍可读可查、查询能在主副之间分摊。副本 0 能省一半存储,代价是任何一台节点故障期间,落在它上面的数据不可读甚至无法恢复。判据很直接:只要这些日志"出事的时候必须查得到",就至少留 1 副本;纯为临时排障、丢了可以重跑的场景,副本 0 是可接受的取舍。
第四项留存天数要和滚动粒度对齐:按天滚动时留 30 天意味着集群里同时存在 30–31 个索引,还要给"删除任务不是到点即删"留宽限。第五项水位余量给 20–30%,理由是三条:段合并需要临时空间,没余量会直接写失败;分片恢复与重平衡需要目标节点有空位,没空位集群会长期黄色;磁盘用量超过 85% 之后风险显著上升,触及更高的数据节点水位线会把索引强制设为只读,平台从"能写"变成"不能写",而这往往发生在半夜。实际可用应控制在 75–80% 以内。
还有一条常被漏掉的余量:单节点故障时剩余节点要能接住它的分片。N 个数据节点、副本 1 的情况下,每台大约装总量除以 N;挂一台后这部分摊到剩下 N-1 台上,所以每台至少还要预留「本机数据量 ÷(N-1)」的空闲空间才能自动重建。这条约束在两节点集群上几乎是致命的——挂一台,剩下那台要独自装下全部数据,等于要求每台实际使用率不超过 50%,这也是数据节点通常建议从 3 台起步的原因。
把公式代入一组数字:日增原始日志 50GB、膨胀系数取 1.3(经验估算,需实测校准)、副本 1、留存 30 天。单日索引后主分片量 50 × 1.3 = 65GB;乘副本,65 × 2 = 130GB/天,这是每天真正落盘的量;乘留存天数,130 × 30 = 3900GB,按十进制约 3.9TB、按二进制约 3.8TiB,说"3.8TB 左右"都对;再加 25% 水位余量,3900 × 1.25 ≈ 4875GB。答案是约 4.8TB 可用容量,而不是很多人以为的"50 × 30 = 1500GB,买台 2TB 机器就够了"。
再看怎么落到硬件。3 台数据节点分摊,每台约 1625GB 可用,考虑文件系统开销与整数档位,通常配 2TB 起步、更稳妥是 3.84TB 这一档企业级固态盘。马上验算前面那条约束:3 台时每台约装 1300GB,挂一台后摊给另外两台,每台需额外约 650GB 空闲,也就是每台至少 1950GB 可用才算安全。用 2 台机器做这个容量不可行——挂一台后剩余那台要独自装下全部数据,同时还要承担写入。
内存的门槛判断是同一条:堆 = min(物理内存的一半, 31GB)。每台 64GB 内存,堆给 31GB,剩约 32GB 留给页缓存,三台合计约 96GB。对照数据规模:最近两天正在写、最常被查的数据约 260GB,摊到三台约 87GB/台,页缓存能覆盖相当一部分,配合"多数查询落在最近几小时"体感可以接受;但如果你习惯一上来就查"过去 7 天全部慢请求",这个覆盖率就不够看,需要加机器而不是加堆。堆总量 93GB 对 3900GB 数据约 1:42 的堆盘比,是经验参考值,真正判据是检索频率与聚合复杂度。
另外两类角色别忘了:Graylog Server 建议 2 台做高可用,规格偏 CPU,配几十上百个流与告警规则时几核到十几核、16–32GB 内存够用;MongoDB 给 2 核 4GB、20–50GB 磁盘足够,做成副本集更好。最后校验写入能力:50GB/天折算平均约 0.6MB/s 看着很小,但真正的考验是峰值,按每条 1KB 估算日均约 580 条/秒,而高峰、故障期间往往是均值的数倍。实用验收动作是人为让数据节点停止服务 10 分钟,看缓冲涨了多少、恢复后多久追平;追平时间远大于停止时间,说明写入已接近饱和。
开篇那个把堆设成 48GB 的案例,机制是明确的。第一个机制是 JVM 的压缩指针:64 位 JVM 里对象引用本来是 8 字节,为了省内存,HotSpot 在堆小于某个阈值时把它压成 4 字节存储;该阈值在 32GB 附近,考虑对齐与对象头因素,工程上的安全取值通常取到 31GB。一旦越过,压缩指针失效、引用恢复 8 字节,同样的堆里实际能装下的对象反而变少。所以从 31GB 加到 48GB 并没有多得 17GB 可用空间,反而损失一部分,还多付 GC 成本。
第二个机制更重要:Lucene 严重依赖操作系统的页缓存。段文件通过内存映射访问,热点数据能否命中内存取决于操作系统手里有多少空闲内存,而不是取决于堆有多大。堆给得越大,留给操作系统的越少。开篇案例里 64GB 内存给掉 48GB 堆之后,页缓存只剩十几个 GB,历史分段的大量读取落到物理读;而日志查询偏偏喜欢跨多天扫描,随机读一多,再快的固态盘也会排队。这台机器真正的正确用法不是加内存加堆,而是加磁盘容量——在同一台机器上托管更多数据,同时保住页缓存。
第三个代价是 GC 停顿与可用性。堆越大,并发标记与整理成本越高,而日志场景对一次几十秒的停顿毫无抵抗力:节点停顿期间脱离集群视图,主节点可能发起分片重分配,副本开始落后,写入方开始超时,"一次 GC"就此演变成"一次集群抖动",抖动又带来更多 IO 与更多重分配,形成正反馈。另外熔断机制是按堆的比例设门的,复杂聚合触发熔断时,堆越小越容易早失败早暴露,这比"堆很大但半夜突然 OOM"好处理得多。
于是有一条可以当铁律的规则:数据节点堆 = min(物理内存的一半, 31GB),Xms 与 Xmx 设成相同值(避免运行时动态扩容带来的抖动),同时锁定内存、禁用交换分区或把它调到极低——堆一旦被换出,性能不是变慢而是彻底不可用。还有一个连带错误是把 Server 和数据节点混部、各自都要大堆:两者在同一台机器上时堆之和必须被同一份物理内存约束,还要给系统留页缓存,最常见的结果是互相挤压、页缓存归零,整机性能远不如拆开部署。
分片是第二个决定成败的参数,核心事实是:每个分片就是一个完整的 Lucene 索引实例,有自己的段文件、文件句柄、内存结构与搜索线程。分片不是免费门票,而是一份要按份付的固定成本,所以既不能太少也不能太多,取决于单个分片装多少数据。
经验值是单分片控制在 20–50GB 量级(经验估算,日志类负载通常可取上限)。两头都有代价:分片太大(几百 GB 一个),片数少堆压力小,但恢复与迁移极慢、查询无法横向并行;分片太小(几 GB 一个),查询要扇出到所有匹配分片,协调开销随分片数线性上升,而且每片都要占一份堆,数量爆炸会把堆直接吃掉。
堆与分片数之间有便于估算的换算:每 GB 堆大约能管理 20 个分片左右(经验估算),31GB 的堆能支撑的分片总数在数百量级——注意这是集群分片总数的上限,而它随堆走。用前面的算例对比:按 40GB 一个主分片估,每天约 2 个主分片,30 天共 60 个主分片、加副本约 120 个,完全在舒适区;如果按 2GB 一个分片切,每天就是几十个,30 天下来几千个,堆压力与元数据膨胀都会开始咬人。这说明日志场景不该为了并行度把分片切小。
生命周期由索引集管理,每个索引集可独立配置滚动与留存策略。滚动常见有按消息数、按大小、按时间三种:日志量稳定时按天,波动大时按大小——按天滚动在潮汐明显的业务里会让分片忽大忽小,按大小滚动能让分片尺寸保持一致,代价是索引起止时间不再是整齐的自然日。留存策略三种:删除、归档、关闭索引;把老索引合并到单段能减少访问段数提升读性能,但那是一次全量重写,只能对已停止写入的索引在低峰期做。
这里有一条能省很多钱的机制:删除整个索引的代价几乎等于一次文件系统操作,非常便宜;而在几百 GB 的大索引里按条件删文档,代价是一次重写级别的段合并,被删文档只是标记墓碑,真正的空间回收要等后续合并。所以"按时间分区 + 整索引删除"不只是组织习惯,而是性能上的本质差异,也是不能把所有日志写进一个长期大索引的根本原因。
日志场景的磁盘画像很反直觉:它其实不太吃随机写。写入路径上主要发生的是事务日志的顺序追加、缓冲区刷写成段时的大块顺序写,即便是机械盘,顺序吞吐也能吃住相当可观的摄入速率。真正吃掉磁盘的是另外三件事:段合并期间的随机读加顺序写、副本恢复时的大块传输、偶发的跨多天大范围查询。这三者决定了选型。
分层逻辑因此很清楚。热节点承接写入与近期查询,特征是小数据量随机 IO、并发高、对延迟敏感,用企业级固态盘,容量只需覆盖"密集查询会落在的那部分数据";温节点承接历史留存,特征是容量大、几乎不写、极少被查但一查就是大范围扫描,用每 GB 成本更低的大容量盘,再配足量内存做页缓存弥补随机读不足。
分界线画在哪?不是拍脑袋定 7 天,而是看查询的时间分布。统计一段时间内的检索请求,很多团队的真实分布是"九成以上查询发生在最近 3 天"——如果是这样,热节点容量只要装下最近 3–7 天即可。热容量 = 日增 × 热窗口天数 ×(1 + 副本):日增 50GB、热窗口 5 天、副本 1,热层约需 50 × 1.3 × 2 × 5 ≈ 650GB(估算),三台各一块 1TB 固态盘绰绰有余,剩下约 3.25TB 交给温层。把八成历史数据搬到每 GB 单价明显更低的介质上(经验估算,企业级固态盘单 GB 单价通常是大容量机械盘的数倍量级),整体存储支出的下降非常可观。
实现方式是给节点打角色标签,配合路由或生命周期策略让只读老索引自动迁到温层。这里有一条红线:不要试图在单台机器内部做"小固态盘加快大硬盘"的分层。数据放置的最小单位是分片,一个分片是一个 Lucene 目录,不能跨设备拆开;你能控制的是"哪些节点有资格放哪些索引",而不是"同一份数据一半落这边一半落那边"。所以分层必须体现在节点角色上,不是单机内的多块盘上,单机多盘只适合扩容量。
温层还有两点要补:内存不能省得太狠,虽然极少被查,但一旦发起跨月查询,能不能落到缓存决定了这次查询是几十秒还是几十分钟;单节点容量越大重建越慢,一台装了十几 TB 的温节点挂掉后,它的分片在其他机器上重建可能持续数小时,所以温层不宜用太少节点装太多数据。同时要承认分层会实实在在增加运维复杂度——多一层节点角色就多一套监控、多一份升级兼容矩阵、多一类排查题材,小型集群不必强求。
这是第三个决定成败的参数,也是唯一一个主要由业务侧决定的。规则一句话:能在日志生成侧做结构化,就绝不在平台侧做正则抽取。生成侧一次 JSON 编码成本极低,平台侧的正则则是按"每条消息 × 每个字段 × 规则复杂度"付费的 CPU 操作,而且要在写入高峰期实时算完,属于最贵的时间点。
落地方式以最常见的 nginx 访问日志为例:把日志格式改写成 JSON 一行输出,采集端原样送出,Graylog 侧用 JSON 解析器展开成字段即可。对比之下,走 Grok 或正则去匹配既有的普通文本格式,既要维护一堆脆弱的模式串(加一个字段就要改一次),又要在每台日志进来的瞬间跑正则引擎。应用侧同理,优先用结构化日志框架直接输出 JSON,而不是一行人类友好但难解析的文本。
然后是字段数量与映射。动态映射方便但危险:新字段会被自动加进映射表,字段数暴涨有两个后果——元数据膨胀,每个字段定义都要常驻堆,几万个字段的索引会把节点堆吃得很难看;写入要为每个字段建立结构,磁盘与 CPU 都多付。所以必须限制单索引字段总数上限(常见默认在千级别),并对高变动来源做字段白名单或忽略策略;不需要检索的超长内容(比如完整请求体)应设为不索引。
高基数字段是日志平台里最容易把堆打爆的东西,典型代表是链路追踪 ID、请求 ID、用户 ID、完整 URL、客户端 IP,特征是"几乎每条都不一样"。对它们做分组聚合时要给每个唯一值建一个桶,还要在内存里维护全局序数结构,这部分是堆上的常驻内存,不会随查询结束立刻归还。一个跨越 30 天、按用户标识分组的聚合,就可能把节点堆推到熔断线上,表征是查询后节点变慢、返回熔断错误,严重的直接 OOM。
处理手段按优先级排:一是限制聚合的分桶数与精度阈值(基数统计通常允许配精度参数,牺牲一点准确度换可控内存),仪表盘与告警规则里绝不用无上限分组;二是对确知不参与聚合与排序的高基数字段关闭列式结构,关闭后仍可检索,只是不能聚合排序,正好契合"只想查某条链路 ID"的用法;三是绝不要对全文类型字段开启正排缓存,那等于把整个语料库塞进堆;四是给超长字符串设置忽略长度上限。
还有两类做法值得直接采用。其一是压缩算法:对已只读的老索引改用偏向压缩比的编码,通常能省百分之十几到三十几的空间(经验估算),代价是写入时多消耗一点 CPU,适合在转入温层后通过重建或合并来应用。其二是写入侧采样:调试级、成功类的重复日志按一定比例采样入库,或只保留非 2xx 的访问日志;这比"全量存进去、30 天后删掉"经济得多,因为它在摄入那一端就把容量账单砍掉了,连带省下索引 CPU、磁盘占用与后台删除的开销。
绝大多数团队给整个平台设一个统一留存天数("一律 30 天"),这是最常见也最贵的偷懒方式。不同类型日志的价值曲线完全不同:安全审计类日志在被写下的第 180 天可能依然至关重要,而一条调试日志在第 3 天基本就没人看了。用同一个周期,等于用最高的那一档要求去养所有数据,支出里有一大半是为不再有价值的日志付费。
建议的分级口径如下(具体天数以你所在行业的合规要求为准,下面是工程区间而非法规条文):安全审计类(登录登出、提权操作、防火墙拦截、堡垒机操作、容器审计)通常需要较长留存,行业里常见的口径是不少于 6 个月,按 180 天到 1 年规划比较稳妥;应用错误与告警类留 60–90 天;访问日志类留 14–30 天,可只保留结构化摘要或按状态码过滤;调试类留 7–14 天且强烈建议采样。把这些档位落成不同的索引集,比"统一 30 天后手动删"省心得多。
再往下是冷归档。对象存储是长期留存最经济的落点,按 GB·月 计费,单价通常明显低于块存储或本地固态盘的折合单价(经验估算,以实时报价为准)。两种做法:其一是快照仓库,把索引以仓库形式写进对象存储,需要排查时恢复回来,好处是格式与查询体验完全一致,代价是要占用恢复目标的本地空间并花时间恢复;其二是归档原始文本,把压缩后的日志文件直接上传,需要时下载下来用文本工具扫,好处是极度便宜、格式中立,代价是完全没有检索能力。
哪种划算取决于访问频率:一年只查两三次的审计数据,压成文本扔对象存储最划算;如果每周都要查一次归档数据,恢复的时间与本地空间代价比留下这条路更贵,反而应留在温层。横向看单位成本排序(定性结论):写入期的固态热层最贵、温层大容量盘明显便宜、对象存储最便宜,让数据随价值衰减一路往便宜的介质上滑,就是这套设计的全部目的。最后补一句边界:归档数据若要跨地域存放,跨境传输与数据落地口径需要事先确认,这是合规层面的问题。
下面这张表把前面的算式落到具体服务器形态。先声明口径:表中的日增量指原始文本量;磁盘容量按膨胀系数 1.3(经验估算)、副本 1 计算;"参考预算区间"是经验性的量级参考,不是任何产品或服务的公开报价,实际价格以咨询为准;"主要风险"一列比前面几列更值得读,因为这些方案最常翻车的地方往往不是性能不够,而是没有预留恢复空间。
| 日增日志量档位 | 建议数据节点数 | 单节点内存与磁盘形态 | 建议留存周期 | 参考预算区间(参考预算,以咨询为准) | 主要风险 |
|---|---|---|---|---|---|
| 5GB/天以内(小团队排障为主) | 1 台,三合一部署(Server + 单节点数据服务 + MongoDB 同机) | 16GB 内存(堆取 8GB)/ 512GB–1TB 固态盘 | 7–14 天 | 入门档,约几百至一千余元/月量级(含单机与带宽,非报价,以咨询为准) | 完全单点,机器故障即平台不可用;三者抢内存,页缓存被挤占后查询急剧变慢 |
| 5–20GB/天(中型业务单集群) | 1–2 台数据节点 + 1 台 Graylog Server(MongoDB 可与 Server 同机) | 32GB 内存(堆 16GB)/ 1–2TB 固态盘 | 14–30 天 | 中低档,约一千余至三千余元/月量级(非报价,以咨询为准) | 磁盘按日均乘法增长,扩容窗口比想象中紧;单节点时故障无法重建副本 |
| 20–50GB/天(多服务聚合日志) | 3 台数据节点(起步三节点)+ 2 台 Graylog Server | 64GB 内存(堆 31GB)/ 2–3.84TB 固态盘;MongoDB 另给 2 核 4GB、20–50GB 盘 | 30 天(可按审计/调试两类分级) | 中高档,约数千元/月量级(非报价,以咨询为准) | 须为单节点故障预留「本机数据量÷2」的空闲空间;缺少消息队列时后端抖动会丢日志 |
| 50–150GB/天(平台化、多团队共用) | 3–5 台数据节点,建议引入冷热两层角色 + 消息队列缓冲 | 热节点 64–128GB 内存(堆上限 31GB)/ 2–3.84TB 固态盘;温节点同内存档 + 8–16TB 大容量盘 | 30–60 天,历史部分下沉温层 | 较高档,约五千至一万余元/月量级(非报价,以咨询为准) | 段合并期间的 IO 争抢、偶发大范围查询把磁盘打满;节点角色变多后升级兼容复杂 |
| 150–500GB/天(大型业务、多地域汇聚) | 5–8 台数据节点 + 消息队列 + 独立主节点/协调节点 | 128GB 内存(堆仍取 31GB)/ 热层多块固态盘 + 温层大容量盘 | 60–90 天,审计类另行更长留存 | 高档,约一万至数万元/月量级(非报价,以咨询为准) | 需要专职运维;元数据与堆压力随分片数上升,切片策略做错一次要重建索引 |
| 500GB/天以上,或峰值写入达数十万条/秒 | 8 台以上 + 独立主节点/协调节点 + 多索引集分级 + 对象存储归档 | 128GB 以上内存 / 热层固态盘集群,温层大容量盘或可搜索快照回对象存储 | 90 天 + 归档 1 年(审计类另计) | 很高档,需按实际配置单独核算(非报价,以咨询为准) | 成本可能超过托管日志服务;自建收益主要在数据主权与定制,运维人力必须计入总账 |
读这张表建议先看"主要风险"再看规格。同一档位里常常有两种花法:把钱花在更大的单盘上,还是花在更多的节点上。在数据节点这个场景里答案绝大多数倾向于后者——不是为了性能,而是为了"挂一台之后剩下的机器能不能接住它的分片"这条约束。多一台机器意味着多一份天然的空闲容量,也意味着少一次半夜的红色告警。
Graylog 是好东西,但它明确不适合一部分团队。判断的核心不是"日志多不多",而是"有没有人能把这套集群养起来"。一条 Elasticsearch/OpenSearch 集群的运维不是装完就结束:分片未分配、索引变黄变红、主节点选举异常、查询把堆打爆、磁盘水位告警、版本升级兼容、快照恢复验证,每一次都需要人在短时间内做正确判断。没有这样一个角色时,自建平台的失败模式通常不是彻底崩掉,而是慢慢不再可信——数据有缺口、查询时快时慢、告警时灵时不灵,最后大家又回到登录服务器翻日志。
第一条:日增量很小,且检索需求弱。如果每天只有几百 MB 到一两 GB 日志,主要诉求是"出事的时候能翻一下",那一整套 Graylog 加索引层的固定开销就不划算。更经济的做法是把结构化好的日志按天压缩归档,配几个文本工具,或者用一个轻量方案。阈值很直接:全量日志不到几十 GB、也不需要跨服务关联检索的团队,先别上。
第二条:没有运维人力做索引层调优与故障处理。这不是"没人值班"这么简单,而是"没人能处理那几类典型故障"。可以自测:能不能在半小时内让一个红色索引恢复?能不能说出"内存翻一倍却只给到 25GB 堆是否合理"的依据?知不知道磁盘打到 85% 之后该做什么、不该做什么?如果答案是"查一下再说",这套平台在真实故障面前就是不可控的,此时不如选托管形态的日志服务,把集群治理这层责任转移出去。
第三条:只需要短期排障。典型场景是"上线这几天盯一下有没有报错"。为一次性、几天到几周的需求部署一套需要长期维护的平台,属于把短期问题做成了长期负债;更合适的做法是把这几天的日志全量落盘(文本即可),配合关键词统计,或者临时开一台机器跑最简配置,用完即卸。判据是使用时长:预期使用不到一个月,不要建需要长期维护的平台。
第四条:需要长期留存但几乎不查。典型场景是"合规要求留一年,但这一年大概率没人看"。这种需求不该用倒排索引去装——把日志压缩成归档文件直接写对象存储,单位成本是索引存储的几分之一甚至更低(经验估算),需要时下载解压用文本工具扫即可。把这类数据留在集群里,等于用最贵的介质装了最冷的数据。
反过来,什么时候值得自建,条件同样明确:日志有多个来源需要统一检索与关联、有明确的留存与分析诉求(不只是存)、团队里有人能承担索引层运维、并且希望把数据留在自己可控的服务器上。四个条件同时成立时,自建总成本通常低于长期按量付费的托管服务,数据主权与定制自由度也都在自己手里。
下面十五项按"上线前必须逐条确认"的思路整理,每一项对应一类真实会踩的坑,建议在切流量之前老实跑一遍。
第一项:实测膨胀系数。用真实日志样本连跑 24–48 小时,把实际落盘的索引大小除以原始文本量,得到你自己的系数,替换掉本文那个 1.3(经验估算),这是后面所有推算的地基。第二项:复算总容量与单节点余量。按公式算出总容量后,检查每台空闲是否不少于「本机数据量 ÷(节点数 - 1)」,确保挂一台后能自动重建。第三项:核对堆配置。数据节点堆取 min(内存一半, 31GB),Xms 与 Xmx 相等,锁定内存、禁用交换分区;同一台机器上所有 Java 进程的堆上限之和不得超过物理内存。
第四项:检查内存锁定与交换策略是否持久。确认重启之后依然生效(很多失效是因为服务管理器里的默认值被覆盖),这一步只能靠重启验证。第五项:确认分片目标大小。按单分片 20–50GB(经验值)反推主分片数与滚动策略,写进索引集配置,不要使用默认分片数。第六项:设置磁盘水位告警。阈值定在 80% 左右,早于默认的高水位线,并确认告警能真的送达值班渠道。
第七项:做一次"磁盘写满"演练。低峰期人为把某台数据节点磁盘占到大比例,观察集群反应、恢复流程与耗时,验证处置预案可执行。第八项:核算缓冲容量。算出消息日志能吸收多少小时的后端中断,若不足目标(建议至少数小时),考虑引入消息队列或加大缓冲。第九项:检查采集端状态文件与轮转策略。确认状态文件持久化、容器日志轮转不会在采集前删掉文件、采集目录有磁盘监控。
第十项:审查字段映射。确认字段总数上限已设、高基数字段没有参与无上限聚合、全文字段没有开启正排缓存、来源不稳定的日志有字段白名单。第十一项:确认索引集分级。审计类、错误类、调试类分别使用不同留存策略,而不是统一一个天数。第十二项:验证快照与恢复。配置对象存储快照仓库并做一次完整恢复——没有验证过恢复的备份等于没有备份,这是日志平台上最容易被忽略的一项。
第十三项:做一次宕机演练。低峰期停掉一台数据节点进程,观察集群从异常到稳定的过程、副本重建耗时,以及期间是否有日志丢失。第十四项:做一次查询压测。发起一次跨 30 天、带通配条件的查询,看是否出现熔断、超时或节点掉线,然后把这类查询改写成受限的仪表盘,避免使用者无意触发。第十五项:收敛网络暴露面。管理界面与集群通信端口不要直接暴露公网,确认只允许可信来源访问、传输启用 TLS、并为 Graylog 与后端之间配置最小权限。
先把边界说清楚,避免误用。本篇提供的是方法论、判断条件与经验区间,不是任何可以直接照抄的性能承诺。文中的膨胀系数、每分片适宜大小、堆盘比、告警阈值都是工程经验区间的写法,作用是指导第一轮估算与选型,不能替代你在真实负载上的复测。不同版本的默认行为差异很大——Graylog 5.x/6.x、Elasticsearch 7.x 与 OpenSearch 2.x 在索引生命周期、数据节点形态、默认磁盘水位阈值上都不完全一致,落地前以所用版本的官方文档为准。
需要你自己动手复核的主要有四项。第一,膨胀系数必须实测:让真实日志写入 24 小时以上,取主分片存储大小与原始文本量的比值,日志行短、字段多的那类通常膨胀更明显。第二,摄入峰值倍率必须实测:把一天的摄入速率画成曲线看峰值与均值之比,这个比值决定缓冲配多大、数据节点 CPU 给多少。第三,硬件实际吞吐必须实测:很多被归因为"盘太慢"的问题,真相是云盘或阵列的 IOPS、吞吐配额被打满,判据是看配额指标而不是看延迟。
第四项是关于数据与地域的口径,也就是"日志落在哪里"。如果业务节点分布在多个地区(例如中国香港、中国台湾地区或其他海外地区),日志是否需要汇聚到一处、汇聚到哪里,取决于你的合规口径与查询习惯。多地域汇聚会带来跨境传输,这类问题必须在架构设计阶段确认;涉及审计留痕的数据落地要求,同样以你所在行业的合规口径为准,本文给出的留存天数是工程参考区间,不构成合规依据。
最后说明价格口径。表格里的"参考预算区间"是经验性的量级参考,用于判断"该选哪个档位",不是任何产品或服务的公开报价,实际价格以实时咨询为准。一万网络(天下数据)深耕 19 年(成立于 2007 年),在服务器租用与定制配置上可以依据你实测出来的日增量、留存天数和 IO 特征来选机型,而不是按"日志平台通用配置"来套。把账算清楚之后再谈配置,是自建日志平台唯一不会后悔的顺序。
上一篇:2026 服务器租用 MySQL 分片中间件 Vitess 落地全解:分片键选择、在线扩容与跨片查询六维对比 + 避坑避雷手册
下一篇:2026 服务器租用自建私有云 Proxmox VE 部署全解:集群仲裁、存储选型与备份六维对比 + 避坑避雷手册
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品