Skip to main content
Jedna replika wykorzystuje do każdej kompilacji procesor jednego węzła: na naszych węzłach testowych z 2 vCPU sześć jednoczesnych kompilacji trwało trzy razy dłużej niż jedna, podczas gdy pozostałe węzły były bezczynne. Kilka replik rozkłada użytkowników i ich kompilacje na węzły. Jest to projekt Skalowania poziomego Overleaf przeniesiony na Kubernetes:
Zaplanuj S3 od samego początku. Instancja, która już przechowuje pliki na swoim wolumenie, wymaga najpierw migracji do S3. Ta konfiguracja zastępuje Deployment z kroku 5: usuń go (kubectl delete -f 40-overleaf.yaml), zanim zastosujesz StatefulSet.
1

Magazyn S3

Skonfiguruj trzy buckety i dwóch użytkowników zgodnie z opisem w S3, przy użyciu swojej usługi S3 lub Garage w klastrze, i umieść cztery klucze w Secret overleaf-s3. Poniższa konfiguracja korzysta z przykładu Garage z tamtej strony.
2

Konfiguracja

Ten ConfigMap zastępuje 30-config.yaml. Dodaje S3 i git-bridge oraz kieruje OVERLEAF_SITE_URL na load balancer:
60-config.yaml
3

Repliki

70-overleaf.yaml
  • StatefulSet, a nie Deployment. Każda replika otrzymuje stabilną nazwę (overleaf-0, overleaf-1, …), do której odwołują się ciasteczko load balancera i git-bridge, a OrderedReady uruchamia najpierw samodzielnie overleaf-0, więc migracje bazy danych wykonuje tylko jedna replika.
  • Jedna replika na węzeł. Każda replika uruchamia swoje kompilacje przez Dockera swojego węzła i przechowuje je w /srv/overleaf-ha swojego węzła.
  • V1_HISTORY_URL dla każdej repliki. Każda replika rozdaje linki do historii z własną nazwą, aby git-bridge mógł się z nimi połączyć.
4

git-bridge

75-git-bridge.yaml
Dlaczego GIT_BRIDGE_HOST jest stałym adresem IP, wyjaśniono w Integracja z Git.
5

Load balancer

Konfiguracja HAProxy to przykład Overleaf z pięcioma zmianami: /project/<id>/mcp kierowane do overleaf-0 tak jak /git/ (zobacz Serwer MCP), zwykłe HTTP na porcie 8080 (obraz działa jako użytkownik inny niż root, który pod containerd nie może powiązać portu 80), serwery wyszukiwane przez DNS klastra (adresy IP podów zmieniają się przy każdym restarcie), DaemonSet, aby odpowiadał każdy węzeł, oraz balance leastconn zamiast domyślnego roundrobin (zobacz Pytania i odpowiedzi poniżej).
80-haproxy.yaml
externalTrafficPolicy: Local zachowuje adresy IP użytkowników w X-Forwarded-For.
6

TLS

Zakończ HTTPS w HAProxy zgodnie z opisem w Proxy TLS, a następnie ustaw w 60-config.yaml OVERLEAF_SITE_URL na adres https:// oraz OVERLEAF_SECURE_COOKIE: "true".

Czego się spodziewać

Przetestowaliśmy trzy repliki na trzech węzłach z 2 vCPU i 4 GB każdy, z MongoDB, Redis, Garage, git-bridge i HAProxy na tych samych węzłach:
  • 12 użytkowników kompilujących jednocześnie 600-stronicowy dokument: wszystkich 12 skompilowało i pobrało swój PDF, po 4 użytkowników na replikę; jedna runda trwała od 8 do 18 sekund. Na każdym węźle pozostawało dostępne co najmniej 1,3 GB pamięci.
  • Każdy użytkownik pozostaje na jednej replice (ciasteczko server-pro-ha), łącznie z pobieraniem PDF, które musi pochodzić z repliki, która go skompilowała. To samo dotyczy HTTPS, łącznie z WebSocketem edytora.
  • Gdy replika się zatrzyma, jej użytkownicy otrzymują błędy przez około 15 do 20 sekund, dopóki HAProxy nie oznaczy jej jako niedostępnej; następnie przechodzą na inną replikę i pozostają zalogowani, ponieważ sesje znajdują się w Redis.

Pytania i odpowiedzi

Odpowiedź: Z przykładem Overleaf (roundrobin, jeden HAProxy na węzeł) w naszym teście 12 nowych użytkowników rozłożyło się na trzy repliki jako 8, 3 i 1, a najbardziej obciążona replika kazała najwolniejszym użytkownikom czekać 29 sekund. Z leastconn, które preferuje replikę z najmniejszą liczbą otwartych połączeń (każdy edytor utrzymuje otwarty WebSocket), ten sam test dał 4, 4 i 4 oraz 18 sekund. Przywiązanie sesji (stickiness) pozostaje bez zmian: wynika z ciasteczka.
Odpowiedź: Tak, jeśli kieruje ruch na podstawie ciasteczka do stabilnej repliki, obsługuje WebSockety, dopuszcza czas żądań 10 minut i przesyłanie plików do 50 MB, utrzymuje limit czasu keep-alive poniżej 65 sekund, wysyła X-Forwarded-For i X-Forwarded-Proto oraz kieruje /git/ i /project/<id>/mcp do overleaf-0. Kieruj ruch na własne nazwy replik (overleaf-N.overleaf-hl), a nie na Service, który rozkłada każde żądanie.
Odpowiedź: Dodaj węzeł z Dockerem i obrazami TeX Live, ustaw replicas: 4 w 70-overleaf.yaml i dodaj linię server overleaf-3 ... do konfiguracji HAProxy (oraz zwiększ config-hash, aby HAProxy się zrestartował).
Ostatnia modyfikacja 2 listopada 2026