1
تخزين S3
أعدّ الحاويات (buckets) الثلاث والمستخدمَين الاثنين كما هو موضح في 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، …) يشير إليه ملف تعريف الارتباط الخاص بموازن الأحمال و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 ثابتًا.5
موازن الأحمال
إعداد HAProxy هو نموذج Overleaf مع خمسة تغييرات: توجيه يحافظ
/project/<id>/mcp إلى overleaf-0 مثل /git/ (راجع خادم MCP)، وHTTP عادي على المنفذ 8080 (تعمل الصورة بمستخدم غير الجذر، ولا يمكنه الارتباط بالمنفذ 80 في ظل containerd)، والعثور على الخوادم عبر DNS الخاص بالكتلة (تتغير عناوين IP الخاصة بالـ Pods عند كل إعادة تشغيل)، وDaemonSet بحيث تستجيب كل عقدة، وbalance leastconn بدلًا من roundrobin الافتراضي (راجع قسم الأسئلة والأجوبة أدناه).80-haproxy.yaml
externalTrafficPolicy: Local على عناوين IP الخاصة بالمستخدمين في X-Forwarded-For.6
TLS
أنهِ HTTPS في HAProxy كما هو موضح في وكيل TLS، ثم اضبط
OVERLEAF_SITE_URL على عنوان https:// وOVERLEAF_SECURE_COOKIE: "true" في 60-config.yaml.ما الذي يمكن توقّعه
اختبرنا ثلاث نسخ متماثلة على ثلاث عقد لكل منها 2 vCPU و4 GB، مع MongoDB وRedis وGarage وgit-bridge وHAProxy على العقد نفسها:- 12 مستخدمًا يترجمون مستندًا من 600 صفحة في الوقت نفسه: ترجم الـ 12 جميعهم مستنداتهم وجلبوا ملفات PDF الخاصة بهم، بواقع 4 مستخدمين لكل نسخة متماثلة؛ واستغرقت الجولة الواحدة من 8 إلى 18 ثانية. احتفظت كل عقدة بما لا يقل عن 1.3 GB من الذاكرة المتاحة.
- يبقى كل مستخدم على نسخة متماثلة واحدة (ملف تعريف الارتباط
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 ثانية. لم يتغير الالتصاق (stickiness): فهو يأتي من ملف تعريف الارتباط.هل يمكنني استخدام متحكم الـ Ingress لديّ بدلًا من HAProxy؟
هل يمكنني استخدام متحكم الـ Ingress لديّ بدلًا من HAProxy؟
الإجابة: نعم، إذا كان يوجّه حسب ملف تعريف ارتباط إلى نسخة متماثلة ثابتة، ويدعم WebSockets، ويسمح بأزمنة طلبات تصل إلى 10 دقائق ورفع ملفات حتى 50 MB، ويُبقي مهلة 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).
