Skip to main content
Một replica dùng CPU của một node cho mọi lần biên dịch: trên các node kiểm thử có 2 vCPU của chúng tôi, sáu lần biên dịch đồng thời mất thời gian gấp ba lần so với một lần, trong khi các node khác vẫn nhàn rỗi. Nhiều replica sẽ phân bổ người dùng, cùng các lần biên dịch của họ, lên các node. Cách làm này tuân theo thiết kế Mở rộng theo chiều ngang của Overleaf, được chuyển sang Kubernetes:
Hãy lên kế hoạch dùng S3 ngay từ đầu. Một phiên bản đang lưu tệp trên volume của mình cần thực hiện di chuyển sang S3 trước. Thiết lập này thay thế Deployment từ bước 5: hãy xóa nó (kubectl delete -f 40-overleaf.yaml) trước khi áp dụng StatefulSet.
1

Lưu trữ S3

Thiết lập ba bucket và hai người dùng như mô tả trong S3, với dịch vụ S3 của bạn hoặc với Garage trong cluster, và đưa bốn khóa vào Secret overleaf-s3. Cấu hình bên dưới dùng ví dụ Garage từ trang đó.
2

Cấu hình

ConfigMap này thay thế 30-config.yaml. Nó bổ sung S3 và git-bridge, đồng thời trỏ OVERLEAF_SITE_URL tới load balancer:
60-config.yaml
3

Các replica

70-overleaf.yaml
  • StatefulSet, không phải Deployment. Mỗi replica có một tên cố định (overleaf-0, overleaf-1, …) mà cookie của load balancer và git-bridge tham chiếu tới, và OrderedReady khởi động overleaf-0 một mình trước, nên chỉ một replica chạy các migration cơ sở dữ liệu.
  • Một replica cho mỗi node. Mỗi replica khởi chạy các lần biên dịch qua Docker của node mình và lưu chúng trong /srv/overleaf-ha của node đó.
  • V1_HISTORY_URL cho từng replica. Mỗi replica cung cấp các liên kết lịch sử với tên riêng của mình, để git-bridge có thể truy cập chúng.
4

git-bridge

75-git-bridge.yaml
Xem Tích hợp Git để biết lý do GIT_BRIDGE_HOST là một địa chỉ IP cố định.
5

Load balancer

Cấu hình HAProxy là bản mẫu của Overleaf với năm thay đổi: /project/<id>/mcp được định tuyến tới overleaf-0 giống như /git/ (xem MCP Server), HTTP thường trên cổng 8080 (image chạy dưới người dùng không phải root, vốn không thể bind cổng 80 trong containerd), các máy chủ được tìm qua DNS của cluster (IP của pod thay đổi mỗi lần khởi động lại), một DaemonSet để mọi node đều phản hồi, và balance leastconn thay cho roundrobin mặc định (xem phần Hỏi & Đáp bên dưới).
80-haproxy.yaml
externalTrafficPolicy: Local giữ địa chỉ IP của người dùng trong X-Forwarded-For.
6

TLS

Kết thúc HTTPS tại HAProxy như mô tả trong Proxy TLS, sau đó đặt OVERLEAF_SITE_URL thành địa chỉ https:// và OVERLEAF_SECURE_COOKIE: "true" trong 60-config.yaml.

Kết quả mong đợi

Chúng tôi đã kiểm thử ba replica trên ba node, mỗi node có 2 vCPU và 4 GB, với MongoDB, Redis, Garage, git-bridge và HAProxy trên cùng các node:
  • 12 người dùng biên dịch một tài liệu 600 trang cùng lúc: cả 12 đều biên dịch và lấy được PDF của mình, 4 người dùng trên mỗi replica; mỗi lượt mất từ 8 đến 18 giây. Mỗi node luôn còn ít nhất 1,3 GB bộ nhớ khả dụng.
  • Mỗi người dùng ở lại trên một replica (cookie server-pro-ha), bao gồm cả việc tải PDF vốn phải đến từ replica đã biên dịch nó. Điều tương tự cũng đúng qua HTTPS, bao gồm cả WebSocket của trình soạn thảo.
  • Khi một replica dừng, người dùng của nó gặp lỗi trong khoảng 15 đến 20 giây, cho đến khi HAProxy đánh dấu replica đó là ngừng hoạt động; sau đó họ chuyển sang replica khác và vẫn giữ trạng thái đăng nhập, vì session nằm trong Redis.

Hỏi & Đáp

Trả lời: Với bản mẫu của Overleaf (roundrobin, một HAProxy trên mỗi node), trong bài kiểm thử của chúng tôi 12 người dùng mới bị phân bổ thành 8, 3 và 1 trên ba replica, và replica bận nhất khiến những người dùng chậm nhất phải chờ 29 giây. Với leastconn, vốn ưu tiên replica có ít kết nối mở nhất (mỗi trình soạn thảo giữ một WebSocket mở), cùng bài kiểm thử cho kết quả 4, 4 và 4 và 18 giây. Tính bám dính không thay đổi: nó đến từ cookie.
Trả lời: Có, nếu nó định tuyến theo cookie tới một replica cố định, hỗ trợ WebSocket, cho phép thời gian yêu cầu 10 phút và tải lên 50 MB, giữ keep-alive timeout dưới 65 giây, gửi X-Forwarded-For và X-Forwarded-Proto, và gửi /git/ cùng /project/<id>/mcp tới overleaf-0. Hãy định tuyến tới tên riêng của các replica (overleaf-N.overleaf-hl), không phải tới một Service cân bằng tải mọi yêu cầu.
Trả lời: Thêm một node có Docker và các image TeX Live, đặt replicas: 4 trong 70-overleaf.yaml, và thêm một dòng server overleaf-3 ... vào cấu hình HAProxy (và tăng config-hash để HAProxy khởi động lại).
Lần sửa đổi cuối 2 tháng 11, 2026