Skip to main content
Tek bir replika her derleme için tek bir düğümün CPU’sunu kullanır: 2 vCPU’lu test düğümlerimizde, aynı anda yapılan altı derleme tek bir derlemenin üç katı kadar sürdü, diğer düğümler ise boşta kaldı. Birden fazla replika, kullanıcıları ve onların derlemelerini düğümlere dağıtır. Bu, Overleaf’in Yatay ölçeklendirme tasarımını Kubernetes’e uyarlar:
S3’ü baştan planlayın. Dosyalarını zaten kendi biriminde tutan bir örnek önce S3 geçişi gerektirir. Bu kurulum 5. adımdaki Deployment’ın yerini alır: StatefulSet’i uygulamadan önce onu silin (kubectl delete -f 40-overleaf.yaml).
1

S3 depolama

Üç bucket’ı ve iki kullanıcıyı S3 sayfasında açıklandığı gibi, kendi S3 hizmetinizle veya kümedeki Garage ile kurun ve dört anahtarı overleaf-s3 Secret’ına koyun. Aşağıdaki yapılandırma o sayfadaki Garage örneğini kullanır.
2

Yapılandırma

Bu ConfigMap, 30-config.yaml dosyasının yerini alır. S3 ve git-bridge ekler ve OVERLEAF_SITE_URL değerini yük dengeleyiciye yönlendirir:
60-config.yaml
3

Replikalar

70-overleaf.yaml
  • Deployment değil, StatefulSet. Her replika, yük dengeleyici çerezinin ve git-bridge’in başvurduğu sabit bir ad (overleaf-0, overleaf-1, …) alır ve OrderedReady önce yalnızca overleaf-0 pod’unu başlatır; böylece veritabanı geçişlerini yalnızca bir replika çalıştırır.
  • Düğüm başına bir replika. Her replika derlemelerini kendi düğümünün Docker’ı üzerinden başlatır ve bunları kendi düğümünün /srv/overleaf-ha dizininde tutar.
  • Replika başına V1_HISTORY_URL. Her replika, git-bridge’in onlara erişebilmesi için geçmiş bağlantılarını kendi adıyla verir.
4

git-bridge

75-git-bridge.yaml
GIT_BRIDGE_HOST değerinin neden sabit bir IP adresi olduğunu öğrenmek için Git entegrasyonu sayfasına bakın.
5

Yük dengeleyici

HAProxy yapılandırması, Overleaf’in örneğinin beş değişiklik yapılmış hâlidir: /git/ gibi overleaf-0’a yönlendirilen /project/<id>/mcp (bkz. MCP Sunucusu), 8080 portunda düz HTTP (imaj root olmayan bir kullanıcı olarak çalışır ve bu kullanıcı containerd altında 80 portuna bağlanamaz), küme DNS’i üzerinden bulunan sunucular (pod IP’leri her yeniden başlatmada değişir), her düğümün yanıt vermesi için bir DaemonSet ve varsayılan roundrobin yerine balance leastconn (aşağıdaki Soru&Cevap bölümüne bakın).
80-haproxy.yaml
externalTrafficPolicy: Local, kullanıcıların IP adreslerini X-Forwarded-For içinde korur.
6

TLS

HTTPS’i TLS proxy sayfasında açıklandığı gibi HAProxy’de sonlandırın, ardından 60-config.yaml içinde OVERLEAF_SITE_URL değerini https:// adresine ve OVERLEAF_SECURE_COOKIE: "true" olarak ayarlayın.

Neler beklenmeli

Her biri 2 vCPU ve 4 GB belleğe sahip üç düğümde, MongoDB, Redis, Garage, git-bridge ve HAProxy aynı düğümlerdeyken üç replikayı test ettik:
  • Aynı anda 600 sayfalık bir belgeyi derleyen 12 kullanıcı: 12’si de derledi ve PDF’lerini aldı, replika başına 4 kullanıcı; bir tur 8 ila 18 saniye sürdü. Her düğümde en az 1,3 GB kullanılabilir bellek kaldı.
  • Her kullanıcı tek bir replikada kalır (server-pro-ha çerezi); derleyen replikadan gelmesi gereken PDF indirmesi de buna dahildir. Aynısı, düzenleyicinin WebSocket’i dahil HTTPS üzerinden de geçerlidir.
  • Bir replika durduğunda, HAProxy onu devre dışı olarak işaretleyene kadar kullanıcıları yaklaşık 15 ila 20 saniye boyunca hata alır; ardından başka bir replikaya geçerler ve oturumlar Redis’te bulunduğu için oturumları açık kalır.

Soru&Cevap

Cevap: Overleaf’in örneğiyle (roundrobin, düğüm başına bir HAProxy), testimizde 12 yeni kullanıcı üç replikaya 8, 3 ve 1 olarak dağıldı ve en yoğun replika en yavaş kullanıcıları 29 saniye bekletti. En az açık bağlantıya sahip replikayı tercih eden leastconn ile (her düzenleyici bir WebSocket’i açık tutar), aynı test 4, 4 ve 4 dağılımını ve 18 saniyeyi verdi. Yapışkanlık değişmez: çerezden gelir.
Cevap: Evet; bir çereze göre sabit bir replikaya yönlendiriyorsa, WebSocket’leri destekliyorsa, 10 dakikalık istek sürelerine ve 50 MB’lık yüklemelere izin veriyorsa, keep-alive zaman aşımını 65 saniyenin altında tutuyorsa, X-Forwarded-For ve X-Forwarded-Proto gönderiyorsa ve /git/ ile /project/<id>/mcp isteklerini overleaf-0’a gönderiyorsa. Her isteği dengeleyen bir Service’e değil, replikaların kendi adlarına (overleaf-N.overleaf-hl) yönlendirin.
Cevap: Docker ve TeX Live imajlarına sahip bir düğüm ekleyin, 70-overleaf.yaml içinde replicas: 4 ayarlayın ve HAProxy yapılandırmasına bir server overleaf-3 ... satırı ekleyin (ve HAProxy’nin yeniden başlaması için config-hash değerini artırın).
Son değiştirilme tarihi 2 Kasım 2026