Skip to main content
Én replika bruger én nodes CPU til hver kompilering: på vores testnoder med 2 vCPU’er tog seks samtidige kompileringer tre gange så lang tid som én, mens de andre noder stod ubrugte hen. Flere replikaer fordeler brugerne og deres kompileringer over noderne. Dette følger Overleafs design for Horisontal skalering, oversat til Kubernetes:
Planlæg S3 fra starten. En instans, der allerede gemmer filer på sin volumen, kræver først S3-migreringen. Denne opsætning erstatter Deployment’en fra trin 5: slet den (kubectl delete -f 40-overleaf.yaml), før du anvender StatefulSet’et.
1

S3-lager

Opsæt de tre buckets og to brugere som beskrevet i S3 med din S3-tjeneste eller med Garage i clusteret, og læg de fire nøgler i Secret’en overleaf-s3. Konfigurationen nedenfor bruger Garage-eksemplet fra den side.
2

Konfiguration

Denne ConfigMap erstatter 30-config.yaml. Den tilføjer S3 og git-bridge og peger OVERLEAF_SITE_URL på load balanceren:
60-config.yaml
3

Replikaer

70-overleaf.yaml
  • StatefulSet, ikke Deployment. Hver replika får et stabilt navn (overleaf-0, overleaf-1, …), som load balancerens cookie og git-bridge henviser til, og OrderedReady starter først overleaf-0 alene, så kun én replika kører databasemigreringerne.
  • Én replika pr. node. Hver replika starter sine kompileringer via sin nodes Docker og gemmer dem i sin nodes /srv/overleaf-ha.
  • V1_HISTORY_URL pr. replika. Hver replika udleverer historiklinks med sit eget navn, så git-bridge kan nå dem.
4

git-bridge

75-git-bridge.yaml
Se Git-integration for, hvorfor GIT_BRIDGE_HOST er en fast IP-adresse.
5

Load balancer

HAProxy-konfigurationen er Overleafs eksempel med fem ændringer: /project/<id>/mcp routes til overleaf-0 ligesom /git/ (se MCP-server), almindelig HTTP på port 8080 (imaget kører som en ikke-root-bruger, der ikke kan binde port 80 under containerd), servere findes via cluster-DNS (pod-IP’er ændres ved hver genstart), et DaemonSet, så hver node svarer, og balance leastconn i stedet for standarden roundrobin (se spørgsmål og svar nedenfor).
80-haproxy.yaml
externalTrafficPolicy: Local bevarer brugernes IP-adresser i X-Forwarded-For.
6

TLS

Afslut HTTPS i HAProxy som beskrevet i TLS-proxy, og sæt derefter OVERLEAF_SITE_URL til https://-adressen og OVERLEAF_SECURE_COOKIE: "true" i 60-config.yaml.

Hvad du kan forvente

Vi testede tre replikaer på tre noder med hver 2 vCPU’er og 4 GB, med MongoDB, Redis, Garage, git-bridge og HAProxy på de samme noder:
  • 12 brugere, der kompilerede et dokument på 600 sider samtidig: alle 12 kompilerede og hentede deres PDF, 4 brugere pr. replika; en runde tog 8 til 18 sekunder. Hver node beholdt mindst 1,3 GB ledig hukommelse.
  • Hver bruger bliver på én replika (cookie server-pro-ha), herunder PDF-downloadet, der skal komme fra den replika, der kompilerede det. Det samme gælder over HTTPS, herunder editorens WebSocket.
  • Når en replika stopper, får dens brugere fejl i omkring 15 til 20 sekunder, indtil HAProxy markerer den som nede; derefter flyttes de til en anden replika og forbliver logget ind, fordi sessioner ligger i Redis.

Spørgsmål og svar

Svar: Med Overleafs eksempel (roundrobin, én HAProxy pr. node) endte 12 nye brugere med at fordele sig med 8, 3 og 1 på de tre replikaer i vores test, og den travleste replika fik de langsomste brugere til at vente 29 sekunder. Med leastconn, der foretrækker replikaen med færrest åbne forbindelser (hver editor holder en WebSocket åben), gav den samme test 4, 4 og 4 og 18 sekunder. Stickiness er uændret: den kommer fra cookien.
Svar: Ja, hvis den router via en cookie til en stabil replika, understøtter WebSockets, tillader forespørgselstider på 10 minutter og uploads på 50 MB, holder sin keep-alive-timeout under 65 sekunder, sender X-Forwarded-For og X-Forwarded-Proto og sender /git/ og /project/<id>/mcp til overleaf-0. Route til replikaernes egne navne (overleaf-N.overleaf-hl), ikke til en Service, der fordeler hver forespørgsel.
Svar: Tilføj en node med Docker og TeX Live-imagesene, sæt replicas: 4 i 70-overleaf.yaml, og tilføj en linje server overleaf-3 ... til HAProxy-konfigurationen (og forøg config-hash, så HAProxy genstarter).
Sidst ændret 2. november 2026