夜雨聆风学习资料网

ARTICLE · 1086412

OnlyOffice的高可用方案如何做

OnlyOffice的高可用方案如何做

OnlyOffice 社区版本身不原生支持集群,但通过外部组件和配置可实现高可用和负载均衡。核心在于让多个 Document Server 节点共享状态和数据,确保来自同一文档的请求无论被哪个节点处理,都能获得一致的环境。

架构示意图


下面是一个高可用的 OnlyOffice 集群示意图,它展示了各个组件如何协同工作:

集群组件

部署模式

注意事项

OnlyOffice节点

多节点并行

所有节点配置应保持一致,特别是JWT密钥和存储配置。

数据库

PostgreSQL 主从集群

使用Pgpool-II等工具实现读写分离和故障转移。所有OnlyOffice节点连接至主集群。

缓存

Redis 集群

部署至少三主三从的Redis集群,确保高可用。所有OnlyOffice节点连接至此集群。

消息队列

RabbitMQ 集群

部署RabbitMQ集群,确保消息不丢失。所有OnlyOffice节点连接至此集群。

文件存储

对象存储 (推荐)

所有OnlyOffice节点配置相同的S3参数(桶、区域、密钥),指向同一对象存储。

网络文件系统 (NFS)

所有OnlyOffice节点挂载同一个NFS服务器上的同一共享目录。

负载均衡器

Nginx / HAProxy

配置上游服务器组(upstream),包含所有OnlyOffice节点的IP和端口,并启用健康检查。

关键配置详解


1. 存储方案 (至关重要)

OnlyOffice集群需要所有节点访问相同的文件存储,这是实现协作和文档一致性的基础。

1.1对象存储 (强烈推荐)

OnlyOffice 支持Amazon S3和其他兼容S3协议的对象存储(如MinIO、Ceph RGW)。这是集群部署的首选,因为它天生就是共享、可扩展且高可用的。

配置示例 (环境变量):

STORAGE_NAME=s3STORAGE_S3_BUCKET=your-onlyoffice-bucketSTORAGE_S3_REGION=us-east-1STORAGE_S3_ENDPOINT=https://your-minio-cluster:9000  # 若使用MinIO等替代方案STORAGE_S3_ACCESSKEY=your_access_keySTORAGE_S3_SECRETKEY=your_secret_key

1.2网络文件系统 (NFS)

所有OnlyOffice节点必须挂载同一个NFS服务器上的同一个共享目录 .

配置示例 (环境变量):

STORAGE_NAME=filesystemSTORAGE_FS_FOLDERPATH=/var/lib/onlyoffice/documentserver/App_Data  # 此路径应为NFS挂载点

    注意: NFS可能需要妥善处理文件锁和性能问题。

    2. 数据库

    所有OnlyOffice节点必须配置为使用同一个PostgreSQL数据库集群。

    • 建议
      配置PostgreSQL主从复制集群,并使用Pgpool-II等中间件实现读写分离、连接池和自动故障转移 。

    配置示例 (环境变量):

    DB_TYPE=postgresDB_HOST=your_pgpool_host  # Pgpool-II的地址或数据库主节点地址DB_PORT=5432DB_NAME=onlyofficeDB_USER=onlyofficeDB_PASS=your_secure_password

      3. 缓存 (Redis)

      所有OnlyOffice节点必须连接至同一个Redis集群,用于存储会话和临时状态。

      • 建议
        部署Redis集群(例如三主三从模式)以确保高可用。

      配置示例 (环境变量):

      REDIS_SERVER_HOST=your_redis_cluster_hostREDIS_SERVER_PORT=6379# REDIS_SERVER_PASS=your_redis_password  # 如果设置了密码

        4. 消息队列 (RabbitMQ)

        所有OnlyOffice节点必须连接至同一个RabbitMQ集群,用于处理节点间的通信和异步任务(如文档转换)。在国内信创环境下可能会要求RocketMQ,目前原生OnlyOffice不支持,但是可以通过修改相关配置和代码来支持,因涉及的点比较多,在此不展开,如果想了解这方面,可以交流。

        配置示例 (环境变量)

        RABBITMQ_URL=amqp://your_rabbitmq_user:password@your_rabbitmq_cluster_host:5672//  # 注意Virtual Host

        5. 负载均衡器 (Nginx / HAProxy)

        需要一个反向代理服务器将请求分发到多个OnlyOffice后端节点。此处只是简单的示例,如果想各节点的负载更加均衡(除了请求量外,最重要的是从内存消耗量,因为打开的文件大小不同或者内容元素不同,所占用的内存也会不同,甚至外表看起来相同大小的文件,打开之后内存消耗相差比较大),可以在Nx中加入自定义的LUA脚本来解决。

        关键配置:

        • upstream  块定义所有OnlyOffice后端节点。
        • WebSocket支持
          必须为  /doc  路径配置代理,以支持实时协作。
        • 健康检查
          配置  max_fails  和  fail_timeout  参数以自动剔除故障节点。

        Nginx配置片段示例:

        upstream onlyoffice_backend {   server 192.168.80.165:9000 max_fails=3 fail_timeout=30s;   server 192.168.80.138:9000 max_fails=3 fail_timeout=30s;   # 添加更多节点...   keepalive 64;}server {   listen 80;   server_name onlyoffice.yourdomain.com;   location / {       proxy_pass http://onlyoffice_backend;       proxy_set_header Host $host;       proxy_set_header X-Real-IP $remote_addr;       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;       proxy_set_header X-Forwarded-Proto $scheme;       proxy_http_version 1.1;       proxy_set_header Connection "";       add_header Backend-IP $upstream_addr always; # 便于调试,查看被哪个后端处理   }   # 至关重要的WebSocket路径   location /doc {       proxy_pass http://onlyoffice_backend;       proxy_http_version 1.1;       proxy_set_header Upgrade $http_upgrade;       proxy_set_header Connection "upgrade";       proxy_set_header Host $host;       proxy_set_header X-Real-IP $remote_addr;       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;       proxy_set_header X-Forwarded-Proto $scheme;       proxy_read_timeout 3600s;   }}

        6. JWT密钥

        所有OnlyOffice节点必须配置完全相同的JWT密钥,用于生成和验证API请求的令牌。

        配置示例 (环境变量):

        JWT_SECRET=your_very_strong_secret_hereJWT_ENABLED=true

        部署与验证建议


        部署顺序

        1. 先搭建并测试好共享服务(PostgreSQL集群、Redis集群、RabbitMQ集群、对象存储)。
        2. 使用相同的配置(通过环境变量或配置文件)部署多个OnlyOffice Document Server实例。
        3. 最后部署和配置负载均衡器(Nginx),将流量引入后端节点。

        集群验证方法

        • 服务可用性
          通过负载均衡器入口多次访问,查看响应头或日志,确认请求被分发到不同的后端节点。
        • 协作功能 (核心测试)
          这是最关键的一步。同一文档在两个以上浏览器标签页中打开,确认操作能实时同步。同时观察浏览器开发者工具中的WebSocket连接(通常连接到  /doc  路径),看其是否可能连接到不同的后端IP(这表明协作消息通过不同的MQ节点处理,但最终状态一致)。
        • 存储一致性
          在一个节点上传文件,在另一个节点刷新或查看,确认文件立即可见。
        • 故障转移
          模拟一个OnlyOffice节点或一个中间件节点(如Redis从节点)宕机,观察服务是否正常,体验是否受影响。

        总结


        为 OnlyOffice 构建集群,核心在于统一所有节点的状态和数据访问入口。利用成熟的中件间集群(PostgreSQL, Redis, RabbitMQ)和对象存储(S3),是构建稳健、可扩展集群的基石。

        希望这些更深入的思路和方案能帮助你更好地设计和实现 OnlyOffice 的集群环境。如果你对特定环节(如某个中间件的集群部署)有更深入的疑问,很乐意提供更多信息。

        相关资源


        文曲Office相关介绍:

        http://117.62.235.170:19993/

        另想下载OnlyOffice最新版本镜像,可访问:

        https://hub.docker.com/r/moqisoft/documentserver  

        版本介绍:  

        https://onlyoffice.moqisoft.com/docs/product/summary

        如果有WebOffice方面的问题或者OnlyOffice定制化需求的都可以加入QQ群(183026419)咨询.

        相关学习资料