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àOrderedReadykhởi độngoverleaf-0mộ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-hacủa node đó. V1_HISTORY_URLcho 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
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
Tại sao dùng balance leastconn?
Tại sao dùng balance leastconn?
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.Tôi có thể dùng ingress controller của mình thay cho HAProxy không?
Tôi có thể dùng ingress controller của mình thay cho HAProxy không?
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.Làm thế nào để thêm replica thứ tư?
Làm thế nào để thêm replica thứ tư?
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).
