本文深入剖析 ONLYOFFICE Document Server 与 PostgreSQL 搭配时的架构特性,基于数十个生产环境案例总结出四大高频故障及其根治方案。通过调整几个关键参数,即可解决 90% 的稳定性问题,让企业部署更放心。
前言
在企业私有化部署场景中,ONLYOFFICE Document Server 通常选用 PostgreSQL 作为元数据存储。然而,不少团队在上线后陆续遇到诡异故障:
- 用户编辑半小时后点击保存,提示失败;
- 多人协作时文档意外关闭;
- 文档转换任务间歇性报错;
- 数据库日志频繁出现
connection reset; - 甚至直接报
too many clients already……
面对这些问题,许多人的第一反应是“数据库性能不足”,于是开始升级硬件、增加内存、换 SSD……但投入大量资源后,问题依旧。
经过大量生产环境排查,我们发现 80% 的案例与硬件无关,根源在于 PostgreSQL 默认参数不适合 ONLYOFFICE 这种长连接 + 间歇访问的架构。本文将从架构原理出发,系统分析问题成因,并给出经过验证的优化方案。
1. 理解 ONLYOFFICE 与 PostgreSQL 的真实关系
常见误解
很多同学认为“用户长时间编辑 = 数据库长时间持有事务”,但 ONLYOFFICE 的架构分层非常清晰:
| 功能 | 组件 |
|---|---|
| 实时协作数据 | 内存 |
| 状态缓存 | Redis |
| 文件存储 | 本地 / 对象存储 |
| 元数据与任务状态 | PostgreSQL |
PostgreSQL 不在实时编辑的数据主路径上,它主要负责:
- 文档元信息(标题、权限、作者)
- 文档转换任务的进度状态
- 回调记录、操作日志
- 用户会话等控制信息
也就是说,PostgreSQL 是 “控制平面数据库” ,而非 “数据平面数据库” 。因此,它对数据库的要求是:连接稳定、资源充足、参数合理,而不是每秒处理数万次查询的极致性能。
搞清这一点,我们就能跳出“加硬件”的思维定式,转而从连接管理、资源预留、内核参数等角度去排查问题。
2. 生产环境最常见的 4 类问题(按发生概率排序)
2.1 TCP Idle 断连 —— 最高频的隐形杀手
典型症状:
-
用户编辑 30~120 分钟后保存失败
-
数据库日志频繁出现:
connection reset by peer server closed the connection unexpectedly
根因分析:
PostgreSQL 默认的 TCP keepalive 参数为:
tcp_keepalives_idle = 0 -- 表示使用系统默认值
大多数 Linux 系统默认值为 7200 秒(2 小时) 。如果网络环境中存在:
- 防火墙 idle 超时(常见 30 分钟)
- NAT 设备连接回收(常见 1 小时)
- 云负载均衡连接超时(例如阿里云 SLB 默认 3500 秒)
那么网络设备会先于 PostgreSQL 关闭连接。当应用下次使用这条“已死亡”的连接时,就会触发上述报错。
解决方案:
显式设置 TCP keepalive,让 PostgreSQL 主动探测连接状态:
tcp_keepalives_idle = 60 -- 60秒无数据则发送探测包
tcp_keepalives_interval = 10 -- 探测失败后,每隔10秒重试
tcp_keepalives_count = 5 -- 最多重试5次
这样,约 120 秒内就能确认连接是否有效,远短于网络设备的超时时间,彻底杜绝断连问题。
这是生产环境中最关键的一项配置,没有之一!
2.2 max_connections 不足 —— 并发稍高就崩
PostgreSQL 默认 max_connections = 100,在以下场景中极易触顶:
- 同时有 30 个以上用户在线编辑
- 开启了多个 document server worker 进程
- 多个文档转换任务并发执行
- 多租户部署
报错信息:
FATAL: too many clients already
推荐连接数估算:
| 并发编辑用户数 | 推荐 max_connections |
|---|---|
| ≤ 20 | 150 |
| 20 ~ 50 | 300 |
| 50 ~ 100 | 500 |
| > 100 | 建议引入 PgBouncer |
经验公式:
连接数 ≈ 编辑用户数 × 1.5 + 转换并发数 × 3 + 冗余
例如:40 个编辑用户 + 5 个转换任务
40 × 1.5 + 5 × 3 = 60 + 15 = 75
建议配置 max_connections ≥ 200 预留安全余量。
2.3 容器资源限制 / OOM —— 无声的灾难
在 Docker 或 Kubernetes 环境中部署 PostgreSQL 时,如果:
shared_buffers设置过小- 容器 memory limit 设置过低
- 未关闭 swap(导致内存超分)
可能引发 PostgreSQL 进程被 OOM Killer 强制终止。一旦数据库进程退出,所有正在编辑的文档都会瞬间断开,体验极差。
建议:
- 生产环境内存至少 4GB,中型部署建议 8GB 以上
- 关闭 swap(
swapoff -a临时关闭,或修改/etc/fstab永久禁用) - 容器 memory limit 应 比实际常驻内存高 30%
shared_buffers设置为物理内存的 25% 左右(详见下文参数模板)
2.4 WAL 与 Checkpoint 抖动 —— 响应时间不稳定
ONLYOFFICE 会频繁产生小事务(自动保存、状态更新、转换记录等)。如果 shared_buffers 过小,会导致:
- Checkpoint 频繁触发
- WAL 日志刷盘压力增大
- 数据库响应时间出现周期性毛刺
这种现象对用户感知影响不大,但在高并发下可能加剧其他问题。
3. 生产级 PostgreSQL 参数模板(16GB 内存示例)
假设您有一台 16GB 内存、SSD 磁盘、50 并发编辑 的服务器,推荐配置如下:
# ---------------
# 连接管理
# ---------------
max_connections = 300
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 5
# ---------------
# 内存配置
# ---------------
shared_buffers = 4GB # 内存的25%
effective_cache_size = 12GB # 剩余内存估算
work_mem = 16MB # 排序/哈希内存
maintenance_work_mem = 512MB # 维护操作内存
# ---------------
# WAL 与 Checkpoint
# ---------------
wal_buffers = 16MB
checkpoint_completion_target = 0.9
# ---------------
# 超时控制(防止僵尸事务)
# ---------------
statement_timeout = 30000 # 30秒
lock_timeout = 5000 # 5秒
idle_in_transaction_session_timeout = 600000 # 10分钟
idle_session_timeout = 1800000 # 30分钟
配置原则解读:
- 内存最大化利用:
shared_buffers给足,effective_cache_size告诉优化器可用缓存大小。 - 连接可持续:TCP keepalive 必须显式设置。
- 防止僵尸事务:设置各类超时,避免连接被长时间占用。
- 控制锁等待:
lock_timeout防止 DDL 等锁造成堵塞。
4. 容量估算与高可用建议
4.1 容量估算方法
除了连接数,还需关注:
- 磁盘 IO:SSD 是必须的,建议使用本地 SSD 或云盘的高性能类型。
- WAL 生成速率:ONLYOFFICE 每小时约产生 1~2GB 的 WAL(取决于活动强度),确保磁盘有足够空间。
- 内存:PostgreSQL 自身 + 文件系统缓存,建议至少 4GB 起步。
4.2 高可用架构(企业级推荐)
- 主从复制:至少一主一从,实现故障自动切换。
- WAL 归档:定期归档到对象存储,支持 PITR。
- 监控告警:关注连接数、活跃事务数、Checkpoint 频率、IO wait。
可选组件:
- PgBouncer:连接池,减少连接建立开销,适合连接数超过 500 的场景。
- Patroni:自动故障转移,实现高可用编排。
5. 总结:解决 90% 问题的三板斧
当您再遇到 ONLYOFFICE + PostgreSQL 的稳定性故障时,请按以下顺序排查:
- TCP keepalive 设置了吗? →
tcp_keepalives_idle = 60(解决断连) - max_connections 够用吗? → 根据并发估算,建议 ≥200(解决连接数不足)
- shared_buffers 是否合理? → 内存的 25% 左右(解决资源竞争)
只要这三项做到位,90% 的问题都可以迎刃而解。
ONLYOFFICE 这类应用对数据库的诉求不是“极高性能”,而是稳定可靠。与其盲目升级硬件,不如花点时间把基础参数调优。毕竟,参数配得好,下班回家早 😄
相关资源
OnlyOffice最新版本镜像:
moqisoft.github.io/docs/instal…
中国版介绍:
moqisoft.github.io/docs/produc…
中国版技术交流:183026419(qm.qq.com/q/uMwFyL5Wn… )