1
Сховище S3
Налаштуйте три бакети й двох користувачів, як описано в розділі S3, за допомогою своєї служби S3 або Garage у кластері, і додайте чотири ключі до Secret
overleaf-s3. Наведена нижче конфігурація використовує приклад Garage з тієї сторінки.2
Конфігурація
Цей ConfigMap замінює
30-config.yaml. Він додає S3 і git-bridge та спрямовує OVERLEAF_SITE_URL на балансувальник навантаження:60-config.yaml
3
Репліки
70-overleaf.yaml
- StatefulSet, а не Deployment. Кожна репліка отримує стабільне ім’я (
overleaf-0,overleaf-1, …), на яке посилаються cookie балансувальника навантаження та git-bridge, аOrderedReadyспершу запускає лишеoverleaf-0, тож міграції бази даних виконує тільки одна репліка. - Одна репліка на вузол. Кожна репліка запускає свої компіляції через Docker свого вузла і зберігає їх у
/srv/overleaf-haсвого вузла. V1_HISTORY_URLдля кожної репліки. Кожна репліка видає посилання на історію зі своїм власним ім’ям, щоб git-bridge міг до них звертатися.
4
git-bridge
75-git-bridge.yaml
GIT_BRIDGE_HOST — це фіксована IP-адреса, див. у розділі Інтеграція з Git.5
Балансувальник навантаження
Конфігурація HAProxy — це приклад Overleaf із п’ятьма змінами:
/project/<id>/mcp маршрутизується до overleaf-0, як і /git/ (див. MCP-сервер), звичайний HTTP на порту 8080 (образ працює від імені користувача без прав root, який не може зайняти порт 80 під containerd), сервери знаходяться через DNS кластера (IP-адреси подів змінюються під час кожного перезапуску), DaemonSet, щоб відповідав кожен вузол, і balance leastconn замість стандартного roundrobin (див. розділ «Запитання та відповіді» нижче).80-haproxy.yaml
externalTrafficPolicy: Local зберігає IP-адреси користувачів у X-Forwarded-For.6
TLS
Завершуйте HTTPS у HAProxy, як описано в розділі TLS-проксі, а потім задайте в
60-config.yaml для OVERLEAF_SITE_URL адресу https:// і OVERLEAF_SECURE_COOKIE: "true".Чого очікувати
Ми протестували три репліки на трьох вузлах із 2 vCPU і 4 ГБ кожен, з MongoDB, Redis, Garage, git-bridge і HAProxy на тих самих вузлах:- 12 користувачів одночасно компілюють 600-сторінковий документ: усі 12 скомпілювали й отримали свій PDF, по 4 користувачі на репліку; один цикл тривав від 8 до 18 секунд. На кожному вузлі залишалося щонайменше 1,3 ГБ доступної пам’яті.
- Кожен користувач залишається на одній репліці (cookie
server-pro-ha), включно із завантаженням PDF, яке має надходити з репліки, що його скомпілювала. Те саме діє і через HTTPS, включно з WebSocket редактора. - Коли репліка зупиняється, її користувачі отримують помилки приблизно 15–20 секунд, доки HAProxy не позначить її як недоступну; потім вони переходять на іншу репліку й залишаються в системі, оскільки сесії зберігаються в Redis.
Запитання та відповіді
Чому balance leastconn?
Чому balance leastconn?
Відповідь: З прикладом Overleaf (
roundrobin, один HAProxy на вузол) 12 нових користувачів у нашому тесті розподілилися як 8, 3 і 1 на три репліки, і найзавантаженіша репліка змусила найповільніших користувачів чекати 29 секунд. З leastconn, який віддає перевагу репліці з найменшою кількістю відкритих з’єднань (кожен редактор тримає відкритим WebSocket), той самий тест дав 4, 4 і 4 та 18 секунд. Липкість не змінюється: її забезпечує cookie.Чи можна використати мій ingress-контролер замість HAProxy?
Чи можна використати мій ingress-контролер замість HAProxy?
Відповідь: Так, якщо він маршрутизує за cookie до стабільної репліки, підтримує WebSockets, дозволяє запити тривалістю 10 хвилин і завантаження до 50 МБ, тримає свій тайм-аут keep-alive нижче 65 секунд, надсилає
X-Forwarded-For і X-Forwarded-Proto, а також спрямовує /git/ і /project/<id>/mcp до overleaf-0. Маршрутизуйте до власних імен реплік (overleaf-N.overleaf-hl), а не до Service, який балансує кожен запит.Як додати четверту репліку?
Як додати четверту репліку?
Відповідь: Додайте вузол із Docker і образами TeX Live, задайте
replicas: 4 у 70-overleaf.yaml і додайте рядок server overleaf-3 ... до конфігурації HAProxy (а також збільште config-hash, щоб HAProxy перезапустився).
